Плохая практика иметь два класса с одинаковым именем в разных пакетах?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Примеры:

java.util.List java.awt.List

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

Ответ 3

Это хорошо. Именно поэтому, по дизайну, разные пакеты имеют разные пространства имен.

Ответ 4

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

Ответ 5

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

Примером более запутанного, чем полезного, является что-то вроде

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