Umgang mit gleichnamigen Klassen (verschiedene Pakete)

9

Ich und mein Forschungs- und Entwicklungsteam unterhalten eine große Codebasis. Wir haben unsere Geschäftslogik in mehrere Pakete unterteilt. Einige von ihnen haben Klassen mit identischen Namen .

Wie Sie sich vorstellen können, stehen die Namen in Konflikt, wenn beide Klassen in derselben Java-Datei referenziert werden.


Beispielsweise:

com.myapp.model (package)
 - Device (class)
 - ...

com.myapp.data (package)
 - Device (class)
 - ...

Wir hatten eine Debatte darüber, wie diese Fälle am besten behandelt werden können, und es wurden folgende Optionen angeboten:

1. Option

  • Umbenennen der Klasse durch Hinzufügen eines Präfixes

    ModelDevice
    DataDevice

2. Option

  • Verwenden des vollständigen Pakets + Klassennamens, wenn auf beide verwiesen wird

    com.myapp.model.Device
    com.myapp.data.Device

Was ist in Bezug auf Codeverwaltung und Skalierbarkeit korrekter?

Wir mischen derzeit beide Ansätze und beginnen, Inkonsistenzen zu haben

Jossef Harush
quelle
Wenn es gelegentlich vorkommt, spielt es wahrscheinlich keine Rolle - wenn es sich um ein wiederkehrendes Muster handelt, würde ich die Klassen wahrscheinlich genauer benennen, um zu verhindern, dass es zu einem Chaos wird.
Assylias
Sie haben keine Ahnung, wie sehr ich es hasse java.util.Dateund java.sql.Date- zumal java.sql.Datees sich um eine Unterklasse von Datenebenen handelt java.util.Dateund so gut aus diesen herausrutscht (und nicht gut zu JSON serialisiert).
Option 2.1 Verwenden Sie immer den vollständig qualifizierten Namen, auch wenn auf den anderen nicht verwiesen wird
Caleth

Antworten:

16

Verwenden Sie den Paketnamen. Diese Art von Problem ist genau der Grund, warum Java die Paketbenennungskonvention verwendet, die es tut. Es verhindert diese Art von Problemen, egal ob es sich um zwei Teams in derselben Firma oder um zwei Teams auf gegenüberliegenden Seiten der Erde handelt.

Bryan Oakley
quelle
1

Ab sofort haben Sie eine ModelDevice-Klasse (Gerät im Modellpaket). Was ist, wenn Sie ein anderes solches ModelDevice für eine andere Klassifizierung haben? Das Problem kann weiterhin bestehen bleiben und die Gemeinkosten werden ebenfalls weiter steigen.

Obwohl Sie vorerst feststellen können, dass das Umbenennen von Klassen eine gute Hilfe ist, wird auf lange Sicht die vorgeschlagene Alternative darin bestehen, den Paketnamen ein Präfix voranzustellen, was dem Industriestandard entspricht.

itsraghz
quelle
0

Nur um einen Aspekt hinzuzufügen, der noch nicht erwähnt wurde:

Schauen Sie sich die Verwendungsmuster an, dh die Java-Quellen, die auf eine oder beide Klassen verweisen.

IMHO sollten Quelldateien in den meisten Fällen nur auf eine der widersprüchlichen Klassen verweisen, und aus dem Kontext sollte klar sein, ob sie sich mit dem Modell oder der Datenwelt befassen. Wenn dies aus irgendeinem Grund schwierig ist, würde ich die Klassen umbenennen, da ich Klassennamen mit Paketpräfix im Quellcode im Allgemeinen nicht mag (dies beeinträchtigt die Lesbarkeit).

Wenn Sie Quelldateien haben, die sich mit beiden Welten befassen, können diese Klassen mit der Verantwortung verbinden, zwischen zwei verschiedenen Ansichten der Welt zu übersetzen, und hier würde ich es vorziehen, Klassennamen mit Paketpräfix zu finden.

Das Anzeigen beider Geräteklassen in einer Quelle kann jedoch auch ein Hinweis darauf sein, dass die Quelle gegen das Prinzip der Einzelverantwortung verstößt, indem Aufgaben aus dem Modell und der Datenwelt gemischt werden.

Ralf Kleberhoff
quelle