Wyciągnąłem stąd termin nazywanie smerfa (numer 21). Aby zaoszczędzić każdemu, kto nie zna problemu, nazewnictwo Smurf polega na prefiksowaniu szeregu powiązanych klas, zmiennych itp. Wspólnym przedrostkiem, aby uzyskać „a SmurfAccountView
przechodzi SmurfAccountDTO
na SmurfAccountController
” itd.
Rozwiązaniem, o którym ogólnie słyszałem, jest utworzenie przestrzeni nazw smurf i upuszczenie przedrostków smurf. To ogólnie mi dobrze służyło, ale mam dwa problemy.
Pracuję z biblioteką z
Configuration
klasą. Można go było nazwać,WartmongerConfiguration
ale znajduje się w przestrzeni nazw Wartmonger, więc po prostu się nazywaConfiguration
. Mam równieżConfiguration
klasę, którą można nazwaćSmurfConfiguration
, ale znajduje się ona w przestrzeni nazw Smurf, więc byłoby to zbędne. W moim kodzie są miejsca, w którychSmurf.Configuration
pojawia się obok,Wartmonger.Configuration
a wpisywanie w pełni kwalifikowanych nazw jest nieporęczne i sprawia, że kod jest mniej czytelny. Lepiej byłoby poradzić sobie zSmurfConfiguration
a (gdyby to był mój kod, a nie biblioteka)WartmongerConfiguration
.Mam klasę nazwaną
Service
w mojej przestrzeni nazw Smurf, którą można by nazwaćSmurfService
.Service
jest fasadą na złożonej bibliotece Smurf, która obsługuje zadania Smurf.SmurfService
wydaje się lepszą nazwą, ponieważService
bez przedrostka Smurf jest tak niesamowicie ogólny. Mogę zaakceptować, żeSmurfService
była to już ogólna, bezużyteczna nazwa, a zabranie smerfa tylko to uwidoczniło. Ale to mogło być nazwaneRunner
,Launcher
itp i nadal będą „czuć się lepiej” mi sięSmurfLauncher
, bo nie wiem, coLauncher
robi, ale wiem, że to, coSmurfLauncher
robi. Można argumentować, że to, coSmurf.Launcher
robi, powinno być tak samo oczywiste jakSmurf.SmurfLauncher
, ale widziałem, że `Smurf.Launcher jest rodzajem klasy związanej z konfiguracją, a nie klasą, która uruchamia smerfy.
Jeśli istnieje otwarty i zamknięty sposób radzenia sobie z jednym z nich, byłoby świetnie. Jeśli nie, jakie są typowe praktyki ograniczania ich irytacji?
źródło
Smurf.Launcher
uruchamia smerfy, czy uruchamiaSmurfJob
s? Być może można to nazwaćSmurf.JobLauncher
?SmurfJob
s lub technicznie uruchamia je, aby były zgodne z językiem dokumentacji Smurf. W świetle tej i innych odpowiedzi zamierzam zmienić nazwęSmurfService
naSmurfJobRunner
. Wydaje się, że numer 1 nie ma najlepszej agnostycznej rozdzielczości językowej, jak się spodziewałem. Widzę przypadki, w których pójścieSmurfConfiguration
byłoby właściwym telefonem, ale w moim przypadku myślę, żeConfiguration
najlepiej nawet z kłopotamiWartmonger.Configuration
.Smurf.Configuration
iSmurfConfiguration
czujesz się inaczej? Z pewnością to nie jest dodatkowy char, prawda? (Skróć do,Config
jeśli problemem jest długość.) CzySmurf.Configuration
masz jakieś problemy, któreSmurfConfiguration
nie?Odpowiedzi:
Podnosisz dobre punkty.
Jeśli chodzi o posiadanie duplikatów klas, możesz aliasować klasy w języku C #. Użyj na przykład
using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;
Zobacz ten post na StackOverflow . Nie wskazałeś swojego języka programowania, ale wywnioskowałem go z tego, co napisałeś. Jeśli więc masz do czynienia z dwoma różnymi projektami, możesz je aliasować jakoSmurfConfiguration
i,WartmongerConfiguration
co uwolniłoby dwuznaczność podczas konsumowania obu klas.Ponieważ usługa jest narażona na zewnętrzne aplikacje, nie widzę problemu z oznakowaniem usługi nazwą Twojej aplikacji, więc w tym przypadku
SmurfService
byłaby ważna, ponieważ w rzeczywistości ujednolicałaby grupy usług w korzystającej aplikacji.Uważam, że należy używać przestrzeni nazw, aby uniknąć tego stylu nazywania. Utrudnia to przeglądanie kodu i zobaczenie, czym jest klasa bez czytania MyCompanyMyProductMyAreaClassName. Korzystanie z techniki aliasingu pozwala zmniejszyć niejednoznaczność w razie potrzeby. Myślę, że powinieneś jedynie wprowadzić złożoność do nazewnictwa, jak wskazałem w punkcie 2, kiedy ludzie będą korzystać z usługi. W tym przypadku ma to sens, aby mieć taki styl nazewnictwa, ponieważ jeśli konsument ma wiele usług, konsumuje dwuznaczność może być myląca.
źródło
org.apache.smurfville.wartmonger.configuration
. To niestety wyklucza pseudonimy. 2 to solidny punkt, więc zamierzam zachować markę Smurf dla Usługi.Istotą przestrzeni nazw jest to, że możesz mieć klasy o tej samej nazwie z różnych bibliotek bez kolizji. Gdy musisz użyć tej samej nazwanej klasy z obu, musisz usunąć niejednoznaczność, poprzedzając jedną lub obie z ich zakresem przestrzeni nazw.
To powiedziawszy, nie jest tak źle mieć wiele klas Smurf, jeśli Smurf mówi ci coś konkretnego o klasie. Nazwy klas powinny być wystarczająco opisowe, aby dać ci trochę informacji o tym, co robi klasa.
Podobnie a
DBSession
może wziąćDBRequest
obiekt, który zwracaDBResponse
obiekt.HttpSession
Może również działać naHttpRequest
iHttpResponse
obiekty.Są to zajęcia Smerfowe z przeznaczeniem.
Mogą żyć w
MyCompany
przestrzeni nazw, aleMyCompanyHttpSession
iMyCompanyDBSession
nie daje żadnych więcej informacji, niż przedtem. W takim przypadku upuść Smerfa i uczyń go przestrzenią nazw.źródło
Wcześniej spotkałem się z tym samym zamieszaniem i zwykle jest to naprawdę kwestia tego, czy uwzględniamy coś, co jest częścią nazwy.
Wymieniasz
SmurfConfiguration
iWartmongerConfiguration
jako potencjalne rodzaje konfiguracji. Wskazujesz, że usunąłeś przymiotnik (jego rodzaj) w przestrzeni nazw, aby pozostała tylko waniliaConfiguration
. Unikałbym tego.To tak, jakby zdecydować, że lody truskawkowe to po prostu lody w przestrzeni nazw truskawek i podobnie z czekoladą, ale zdarzyło się, że oddzieliłeś przymiotnik, który nadaje mu tożsamość z samą rzeczą. To nie są lody w kategorii truskawek. To lody truskawkowe - rodzaj lodów.
Wyobraźmy sobie, że w aplikacji zaimportujesz
Strawberry.IceCream
klasę, a następnie zaczniesz tworzyć instancję bezpośrednio zIceCream
.Może się to wydawać dobre i dobre, dopóki nie skończysz importować innej
IceCream
klasy. Teraz wracasz do pierwotnego problemu konieczności rozróżnienia między nimi, co jest problematyczne. Przez cały czas chciałeś:Lepiej pozostawić przestrzenie nazw, aby uniknąć potencjalnych konfliktów między stronami trzecimi, które mogą nawiązywać do tych samych pojęć w swoich bibliotekach. Gdy jednak jeden programista tworzy bibliotekę lub projekt, powinien nazwać każdą koncepcję indywidualnie i używać przestrzeni nazw jako folderów tylko dla organizacji. Często nazwa folderu znajduje się w nazwie pojęć, które organizuje i jest w porządku.
źródło
Zdecydowanie dobrą zasadą jest to, że jeśli masz wspólny prefiks na wielu klasach, to prawdopodobnie zasługują na to, aby pójść we własnej przestrzeni nazw. Aby poradzić sobie z tym problemem, kiedy trzeba użyć klas o podobnej nazwie z dwóch przestrzeni nazw:
1) Aliasuj przestrzenie nazw, choć skracam i do rzeczy, każdy naturalny skrót, może nawet tylko 1 litera:
Następnie zawsze używaj prefiksu wszędzie tam, gdzie jest używany, i odpowiednio nazywaj wystąpienia:
2) Aliasuj klasę, jak sugerowano w innej odpowiedzi.
3) W dowolnej bibliotece, nad którą sprawujesz kontrolę, nie używaj terminu „Konfiguracja”. Użyj tezaurusa: np. „Ustawienia”, „Model”, „Parametry”. Może i tak może mieć większe znaczenie dla kontekstu: np. Gdyby Smurf był rodzajem modułu analizy numerycznej, napisałbyś, że być może „Parametry” byłyby lepsze dla jego konfiguracji. Korzystaj ze specjalnego słownictwa związanego z kontekstem modułu, aby wymyślić unikalne nazwy, które zachowują wyjątkowość nawet po zmieszaniu z innymi przestrzeniami nazw. Wydaje mi się, że może to być odpowiedź na pytanie 2 OP.
4) Refaktoryzuj kod, abyś nie musiał mieszać użycia konfiguracji z dwóch różnych miejsc. Szczegóły tego zależy od ciebie.
5) Połącz dwie konfiguracje w jedną, zanim przekażesz ją klasie. Użyj połączonej klasy conf do reprezentowania:
Krótkie nazwy zmiennych składowych osiągają teraz to samo, co aliasing przestrzeni nazw / klasy.
źródło
Wydaje się dziwne, że dodanie jednego punktu do nazwy przeszkadza.
Jeśli oba
Smurf
iWartmonger
konfiguracje stosowane razem w jednym miejscu, ale Separatly są one wykorzystywane w wielu miejscach - wtedy nazw jest zdecydowanie dobrym podejściem.Mając nazw daje możliwość wykorzystania „czystych” nazw w kodzie wewnętrznym, gdzie z prefiksów skończyć się za pomocą
SmurfConfiguration
wnętrzaSmurfService
„s kody wewnętrzne, które mogą stać się irytujące za każdym razem otworzysz ten kod.źródło