Лоша практика да има два класа с едно и също име в различни пакети?

Разделихме нашето приложение, така че пакет A да обработва данни от един външен източник, а пакет B от друг. И в двата случая трябва да създадем домейн обект и да имаме "Transformer", за да направим това.

Така че имам 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