Неправильно ли иметь два класса с одинаковыми именами в разных пакетах? - PullRequest
11 голосов
/ 11 июля 2011

Мы разделили наше приложение так, чтобы пакет A обрабатывал данные из одного внешнего источника, а пакет B - из другого. В обоих случаях нам нужно создать объект домена и иметь для этого «Transformer».

Итак, у меня есть com.foo.bar.a.ThingTransformer и com.foo.bar.b.ThingTransformer

Я подозреваю, что это плохая практика, но хочу посмотреть, что думают хорошие люди из SO.

Ответы [ 5 ]

17 голосов
/ 11 июля 2011

Я бы не сказал, что это всегда плохая практика, но это отчасти запах кода .

Если оба класса делают разные вещи , тогда почему у них нет разных имен?

если оба класса делают одно и то же , тогда почему существуют два класса?

С практической точки зрения это может стать очень раздражающим, если эти два класса когда-либо нужно будет ссылаться в одном классе: вам придется использовать FQN для одного из них (для ясности, вероятно, было бы лучше использовать его для обоих в этом случае).Если эти два класса находятся в достаточно разных частях кода, чтобы на них не ссылались из одного и того же кода, тогда практическая проблема не так уж и плоха.

7 голосов
/ 11 июля 2011

Не совсем плохая практика, так как во многих доменах похожая терминология, так что в итоге вы получите одинаковые имена.С другой стороны, если оба находятся в одном домене, но просто в разных реализациях, вы можете (как-то) указать особенности реализации в имени.
Очень уродливо, если вы будете использовать оба в одном исходном файле, вв этом случае вы должны использовать полное имя хотя бы для одного.

Примеры:

java.util.List java.awt.List

указывают на реализацию в имени:
java.util.ArrayList
java.util.LinkedList

5 голосов
/ 11 июля 2011

Всё хорошо.Именно поэтому разные пакеты имеют разные пространства имен.

3 голосов
/ 11 июля 2011

В этом нет ничего плохого, поскольку очень маловероятно, что вы будете использовать оба класса вместе в одном коде.Дублирование различия a / b от пакета во всех именах классов было бы хуже.

1 голос
/ 11 июля 2011

Вы должны решить, является ли это более полезным или более запутанным. Вы можете получить ту же проблему с использованием похожих имен в одном пакете, где разница не ясна.

Примером «больше сбивает с толку, чем полезно» является что-то вроде

com.sun.corba.se.internal.Interceptors.PIORB extends
com.sun.corba.se.internal.POA.POAORB which extends
com.sun.corba.se.internal.iiop.ORB which extends    
com.sun.corba.se.impl.orb.ORBImpl which extends
com.sun.corba.se.spi.orb.ORB which extends    
com.sun.corba.se.org.omg.CORBA.ORB which extends
org.omg.CORBA_2_3.ORB which extends
org.omg.CORBA.ORB
...