Jak radzić sobie z klasami o tej samej nazwie (różne pakiety)

9

Ja i mój zespół R&D utrzymujemy dużą bazę kodów. Podzieliliśmy naszą logikę biznesową na wiele pakietów. niektóre z nich mają klasy o identycznych nazwach .

Jak można się domyślić, nazwy są sprzeczne, gdy obie klasy są przywoływane w tym samym pliku Java.


Na przykład:

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

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

Przeprowadziliśmy debatę na temat najlepszych praktyk w leczeniu tych przypadków i pojawiły się następujące opcje:

1. opcja

  • Zmiana nazwy klasy, dodanie przedrostka

    ModelDevice
    DataDevice
    

2. opcja

  • Używanie pełnego pakietu + nazwy klasy, gdy oba są przywoływane

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

Co jest bardziej poprawnego pod względem zarządzania kodem i skalowalności?

obecnie łączymy oba podejścia i zaczynamy mieć niespójność

Jossef Harush
źródło
Jeśli jest to okazjonalne, prawdopodobnie nie ma to znaczenia - jeśli jest to powtarzający się wzorzec, prawdopodobnie nazwałbym klasy bardziej precyzyjnie, aby nie dopuścić do bałaganu.
assylias
Nie masz pojęcia, jak bardzo mi się nie podoba java.util.Datei java.sql.Date- zwłaszcza, że java.sql.Datejest podklasą java.util.Datei tak ładnie wymyka się z warstw danych (i nie ładnie serializuje JSON).
Opcja 2.1 Zawsze używaj w pełni kwalifikowanej nazwy, nawet jeśli do drugiej nie ma odniesienia
Caleth,

Odpowiedzi:

18

Użyj nazwy pakietu. Ten typ problemu jest właśnie powodem, dla którego Java korzysta z konwencji nazewnictwa pakietów, którą robi. Zapobiega tego rodzaju problemom, niezależnie od tego, czy są to dwa zespoły w tej samej firmie, czy dwa zespoły po przeciwnych stronach ziemi.

Bryan Oakley
źródło
1

Na razie masz jedną klasę ModelDevice (urządzenie w pakiecie modelu). Co zrobić, jeśli masz inny taki ModelDevice dla innej klasyfikacji? Problem może nadal występować, a koszty ogólne również będą rosły.

Chociaż na chwilę obecną może się okazać, że zmiana nazwy klas może być dobrą pomocą, na dłuższą metę sugerowana alternatywa polega na prefiksie nazw pakietów, co jest standardem branżowym.

itsraghz
źródło
0

Wystarczy dodać jeden aspekt, o którym jeszcze nie wspomniano:

Przyjrzyj się wzorcom użytkowania, tj. Źródłom Java, które odwołują się do jednej lub obu klas.

IMHO w większości przypadków pliki źródłowe powinny odwoływać się tylko do jednej ze sprzecznych klas, a z kontekstu powinno być jasne, czy dotyczą one modelu, czy świata danych. Jeśli jest to trudne z jakiegokolwiek powodu, zmieniam nazwy klas, ponieważ generalnie nie lubię nazw klas z prefiksem pakietu w kodzie źródłowym (pogarsza to czytelność).

Jeśli masz pliki źródłowe, które dotyczą obu światów, mogą one łączyć klasy z odpowiedzialnością za tłumaczenie między dwoma różnymi widokami świata, a tutaj wolałbym znaleźć nazwy klas z prefiksem.

Ale zobaczenie obu klas urządzeń w jednym źródle może być również wskazówką, że źródło narusza zasadę pojedynczej odpowiedzialności poprzez mieszanie zadań z modelu i świata danych.

Ralf Kleberhoff
źródło