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

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

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

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


person Paul McKenzie    schedule 11.07.2011    source источник


Ответы (5)


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

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

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

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

person Joachim Sauer    schedule 11.07.2011
comment
Я поддерживаю проект, в котором этот шаблон закончился. Несколько классов с одинаковыми именами, в разных папках. Иногда хочется догнать виновных и поколотить. - person Mirko; 02.03.2018

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

Примеры:

java.util.List java.awt.List

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

person Op De Cirkel    schedule 11.07.2011
comment
+1 за то, что упомянул, что разные домены имеют схожую терминологию. Например, В Lucene есть класс Document, имя которого, я уверен, может легко появиться в другом API. - person lightalchemist; 27.12.2011

Это отлично. Именно поэтому по замыслу разные пакеты имеют разные пространства имен.

person Graham Borland    schedule 11.07.2011

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

person Michael Borgwardt    schedule 11.07.2011
comment
+1 за отсутствие дублирования информации об интервалах имен в простом имени! - person Joachim Sauer; 11.07.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
person Peter Lawrey    schedule 11.07.2011