Jakie istnieją anty-wzorce nazewnictwa? [Zamknięte]

35

Istnieje kilka nazw, w przypadku których sięgasz po te nazwy, wiesz, że już coś pomieszałeś.

Na przykład:

XxxManager
Jest to złe, ponieważ klasa powinna opisywać, co robi klasa. Jeśli najbardziej konkretnym słowem, jakie można wymyślić dla tego, co robi klasa, jest „zarządzać”, to klasa jest zbyt duża.

Jakie inne anty-wzorce nazewnictwa istnieją?

Aby wyjaśnić, nie pytam „jakie imiona są złe” - to pytanie jest całkowicie subiektywne i nie ma sposobu, aby na nie odpowiedzieć. Pytam: „jakie nazwy wskazują na ogólne problemy projektowe z systemem”. Oznacza to, że jeśli chcesz wywołać komponent Xyz, prawdopodobnie oznacza to, że komponent jest źle odbierany. Zauważ też, że istnieją wyjątki od każdej reguły - szukam tylko flag ostrzegawczych, kiedy naprawdę muszę się zatrzymać i przemyśleć projekt.

Billy ONeal
źródło
1
Co powiesz na konwencję nazewnictwa Smurf ?
back2dos
4
Do osób głosujących na zakończenie jako „mało konstruktywnych” - czy zechciałbyś wyjaśnić powód? Jedynym, z czym nie radzi sobie zbyt dobrze, jest to, że odpowiedzi mogą być krótkie, ale z pewnością spełniają pozostałe pięć wytycznych ...
Billy ONeal
2
@Aaronaught: Wszelkie sugestie?
Wyartykułowałem
1
@jhocking - Zgadzam się z niektórymi z tego linku - szczególnie z tym, że „Manager” i „Handler” są zbyt cenne, aby je puścić. Nie jestem też sprzedawany w oparciu o wzorce projektowe i inne alternatywy, które w wielu przypadkach wydają się co najmniej tak niejasne. Czasami „Kolejka” lub cokolwiek może być odpowiednie, ale często fakt, że menedżer przechowuje (lub odwołuje się) elementy w kolejce, jest tylko jednym aspektem zarządzania tymi elementami. Tak jak coś użytecznego wyraża „menedżer” jako stanowisko, tak samo obowiązuje IMO w OOP.
Steve314,

Odpowiedzi:

22

Następujące anty-wzorce nazewnictwa są powiązane z .NET, a zwłaszcza C #:

  • Niespójności . Jeśli zdecydowałeś się zacząć każdą nazwę pola od wiodącego podkreślenia, trzymaj się tego .
  • Skróty Ambiguos z brakującymi samogłoskami . Poważnie widziałem nazwy pól, takie jak cxtCtrlMngr. Trudno zgadnąć, co to ma oznaczać.
  • Zbyt długie i pełne nazwy zmiennych . ILoginAttemptRepositoryjest w porządku i opisowy - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingjest opisowy, ale zdecydowanie nie jest w porządku.
Marius Schulz
źródło
7
Czy Ima to oznaczać interfacetutaj implementer, czy w pierwszej osobie liczby pojedynczej? Ponieważ większość klas implementuje interfejs, zbyt wiele klas / interafesów rozpoczynających się od kapitału Ijest nieprzyjemne i utrudnia czytelność, a sam kod śmierdzi.
użytkownik nieznany
3
+1 za „Skróty Ambiguos z brakującymi samogłoskami” doprowadzają mnie do szału!
FrustratedWithFormsDesigner
6
@Billy ONeal: C ++ ma interfejsy; po prostu nie są sztucznie oddzielone od klas. ;)
Jon Purdy
4
@Billy ONeal: To był mój punkt widzenia.
Jon Purdy,
2
@MariusSchulz: o tak, zgadzam się z tobą :) Po prostu myślałem, że to nie był tak strasznie nieprzejrzysty skrót.
amara
9

Jednym z nich, na które często się natknęłam, jest po prostu brak jakiegokolwiek wzorca nazewnictwa. Zazwyczaj wskazuje to na ignorancję programisty (że wzorce nazewnictwa są dobrą rzeczą ), a także ten anty-wzorzec ma tendencję do rażącego naruszania SRP poprzez upychanie wszelkiego rodzaju metod związanych z klasą w samą klasę, na przykład klienta klasa ma właściwości, metody CRUD, wszystko zdalnie związane z klientem, czego potrzebuje część aplikacji.

Dodam też, że użycie „Engine” jako sufiksu jest mniej więcej tym samym, co użycie „Managera”. Jest to bardzo niejasne, a klasa o nazwie jest XxxEnginezwykle modułem w stylu VB zawierającym wiele metod, więc jest w jednym „łatwym w użyciu” miejscu, bez wiedzy ani pojęcia programowania obiektowego.

Wayne Molina
źródło
7

Cóż, najpierw proste odpowiedzi: wpisz węgierski ( http://mindprod.com/jgloss/unmainnaming.html , ma też inne świetne pomysły. Bardziej zrównoważony pogląd na to, kiedy węgierski nie jest zły, http://www.joelonsoftware.com /articles/Wrong.html )

Inka
źródło
7
Notacja węgierska ZAWSZE jest zła :)
Wayne Molina
12
@Wayne: W rzeczywistości nie zawsze jest to złe. Pod koniec lat 70. pracowałem dla Charlesa w Xerox, a oryginalny system nazewnictwa ratował życie. Pracowaliśmy w BCPL, która ma 1 typ: liczba całkowita. Wszystko inne o typie zostało przekazane za pomocą konwencji użycia i nazewnictwa. Mieliśmy 7 programistów + Charles i każdy z nas mógł wejść do kodu innej osoby i od razu być produktywnym. Nie oznacza to, że nie można go okropnie przekręcać / niewłaściwie stosować (nawet przez Charlesa), tylko że we właściwym kontekście było to właściwe rozwiązanie.
Peter Rowell,
3
@Marius: Przeczytaj artykuł Joela. System typów nie zawsze wymusza wszystkie różnice semantyczne między zmiennymi. Intellisense też nie pomaga w takich przypadkach.
Billy ONeal
4
Typ jest łatwiejszy do zrozumienia niż użycie, szczególnie. z nowoczesnymi edytorami. Wymaga to jednak dyscypliny. Nie musisz poprzedzać wszystkiego . Pracuję w Javie i przez większość czasu aplikacje węgierskie nie są konieczne, ale kiedy robię coś, co wymaga kilku takich samych zmiennych (takich jak fromX i toX) w układach współrzędnych, ratuje to życie.
Michael K
3
To, co byłoby miłe, to ogólna umiejętność łatwego tworzenia nowych typów. „Ten jest jak int, z wyjątkiem tego, że dotyczy numerów wierszy.”
David Thornley,
6

Prefiks „I” w nazwie interfejsu lub „Abstract” w nazwie klasy abstrakcyjnej. Może to być usprawiedliwione w językach, które nie mają pojęcia klas abstrakcyjnych lub które nie rozróżniają interfejsów i klas abstrakcyjnych - ale na przykład w Javie jest to zawsze zły pomysł.

Nie zgadzam się również z tobą w kwestii menedżera. Czasami używam tego wzorca i oznacza to po prostu, że gdybym spróbował nazwać go czymś innym, nazwa nie byłaby bardziej opisowa niż XxxxxManager. Istnieją pewne zadania (niekoniecznie złożone), których po prostu nie można streścić w jednym lub dwóch słowach.

Mike Baranczak
źródło
@ Mike: Całkowicie nie zgadzam się z twoim oświadczeniem, przepraszam. Moim zdaniem, XxxxManagerto najgorsze z możliwych nazw, jakie może mieć klasa. Oczywiście, że coś zarządza! Właśnie dlatego został napisany. Managerjest bezsensownym słowem wypełniającym, które nie wnosi żadnej wartości do zrozumienia - z nazwy - za co odpowiada klasa.
Marius Schulz
1
Co powiesz na TabManager? Masz lepszą nazwę dla klasy sterującej mechanizmem karty JSP? Lub wstrzymuj się TabController ... Jeśli chodzi o prefiks Abstract, czuję, że jest nadużywany, ale często jest poprawny (zobacz biblioteki Java dla przykładów). Myślę, że mogę spokojnie powiedzieć, że nigdy nie widziałem Iinterfejsów w żadnym miejscu, w którym ktoś nie próbował programować na interfejsie, który nie powinien tam być. Podobnie, tylko jedna klasa implementuje interfejs.
Michael K
1
@Darien (i inni): Tak czy inaczej - to nie ma znaczenia. Żadna z tych nazw nie jest anty-wzorami (i dlatego nie są objęte tym pytaniem). Nie sądzę, abyś mógł powiedzieć cokolwiek na temat projektu systemu, niezależnie od tego, czy używa on, IXxxczy nie XxxImpl.
Billy ONeal
2
To jest całkowicie, całkowicie błędne. Są to bardzo dobre powodów wizualnie odróżnić interfejsy z klasy: (a) nie może być wystąpienia, (b) nie może być uwolniona / utylizacji (c) nie może być serializowane, (d) może być pośredniczone / przechwycone itp. itd. itp. Właśnie wyrzuciłeś coś, czego osobiście nie lubisz (z jakiegoś dziwnego i niewyjaśnionego powodu) jako przykład anty-wzorca bez żadnego uzasadnienia.
Aaronaught
1
O ile to możliwe, interfejsy powinny być preferowane w stosunku do konkretnych klas dla typów argumentów i typów zwracanych. Dlatego sensowne jest, aby interfejsy otrzymywały „czyste” nazwy, a także konkretne implementacje (faktyczny typ, o którym dzwoniący może nawet nie wiedzieć lub nie dbać), aby uzyskać brodawki.
Kevin Krumwiede 27.04.16
6

Mowa:

Mam chudą niepełnosprawność i nie mogę przeliterować. Bez sprawdzania pisowni jestem bezsilny. Próbuję skopiować wszystkie utworzone przeze mnie nazwy do edytora tekstu w celu weryfikacji, ale zawsze brakuje mi niektórych. Podczas mojego ostatniego projektu napisałem dużą część interfejsu API i wydaje mi się, że nie sprawdziłem pisowni za pierwszym razem, gdy użyłem słowa „odpowiedz” i założyłem, że to prawda, ponieważ nikt mi nie powiedział. Mieliśmy co najmniej 50 funkcji z odpowiedzią. W zespole pojawiła się nowa osoba i zapytała, dlaczego używamy odpowiedzi. Czułam się naprawdę głupia.

ponownie odtwarzać
źródło
2
Użyłem krótko wtyczki jQuery, w której jednym z parametrów był affect(zamiast efektu). Doprowadziło mnie to do szaleństwa i szybko znalazłem inną wtyczkę, aby zrobić to samo.
zzzzBov
4
Najgorszy problem, jaki mam z tym, to to, że kiedy widzę źle napisane imię, to naprawdę boli mnie zdolność do pamiętania, jakie są imiona.
David Thornley,
1
Gorzej, gdy to samo jest napisane inaczej w różnych częściach kodu. Podobnie jak w przypadku siły pola klasy Srtength dostępnej za pomocą metody getStrenth ().
Eva,
5

Obawiam się, że moje opinie są nieco kontrowersyjne. Ale spróbujmy ...

Jeśli o mnie chodzi, muszę zgodzić się z Mikiem Baranczakiem, nazwy takie jak XxxController, XxxHandler to coś, czego naprawdę często używamy. Dla nas Kontroler jest czymś w rodzaju punktu wejścia dla czegoś „enkapsolowanego”, np. Zarządzania transakcjami, radzenia sobie z nieoczekiwanymi błędami, dzwonienia do XxxHandler w celu wykonania rzeczywistej pracy. Powiedziałbym, że XxxManager jest synonimem kontrolera. Myślę, że ważne jest, aby nie używać Menedżera w jednym przypadku, a Kontrolera w innym. Bycie konsekwentnym jest bardzo ważne, jeśli pracujesz w zespole.

Znalezienie lepszych nazw dla takich rzeczy byłoby naprawdę trudne, a może nawet niemożliwe. Xxx powinien być dobrze wybrany, aby sytuacja była bardziej przejrzysta.

Osobiście nie lubię, gdy metoda o nazwie get ... lub set ... jest czymś więcej niż zwykłym akcesorium. Lubię det ... na determinację.

Inna rzecz, która przychodzi mi na myśl: według wuja Boba. „I” w nazwie metody jest oznaką robienia zbyt wiele. Ale życie nie zawsze jest tylko czarno-białe - są sytuacje, w których myślę, że jest w porządku - np. z powodu problemów z wydajnością (gdy masz już dane, aby sprawdzić, dlaczego ich nie przetworzyć) ...

Osobiście jestem także wielkim fanem węgierskiej notacji systemowej - przez większość czasu masz do czynienia z kodem źródłowym w IDE ok. Ale często używasz tylko edytora lub przeglądasz repozytorium w przeglądarce. Wadą może być obsługa narzędzi z powodu prefiksów typów ...

Myślę, że najważniejszą rzeczą jest być konsekwentnym - konwencja nieoptymalna - dla mnie - jest lepsza niż brak konwencji ...

falanga
źródło
1
„Kontroler” ma inną semantykę niż „Menedżer”. Osobiście też mi się nie podoba, ale „kontroler” sobie radzi, ponieważ jest wspólnym składnikiem wielu wzorców, szczególnie MVC. XxxHandler jest równie zły. Jeśli klasa po prostu coś „obsługuje” - to albo klasa jest za duża, albo powinna być nazwana częścią „Xxx”.
Billy ONeal
3
„Znalezienie lepszych nazw dla takich rzeczy byłoby naprawdę trudne, a może nawet niemożliwe” - nie, jeśli właściwie zaprojektowałeś swoją hierarchię typów z dobrze zdefiniowanymi zależnościami i obowiązkami. Oczywiście, jeśli używasz „Kontrolera” jako części MVC lub „Procedury obsługi” dla ogólnej procedury obsługi zdarzeń / wiadomości, to jest inaczej - to są przykłady żargonu - ale jeśli są one używane jako nazwy ogólne dla złych- zdefiniowane klasy, to jest główna czerwona flaga.
Aaronaught
5

Być może najgorszym anty-wzorem nazewnictwa jest ten:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Mamy trzyelementową listę par [foo, bar]. Jeśli potrzebujemy czwartego, będziemy musieli dodać nowe kolumny do tabeli.

Prowadzi do kodu w ten sposób:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Oddzielna tabela powinna zostać utworzona z kolumnami foo i bar i połączona z tabelą rzeczy:

create table fubar(foo string, bar string, stuff_id long)

Drugie najgorsze to:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Tutaj mamy sześć pól zamiast dwóch instancji klasy Address.

Ten anty-wzór jest oznaczony serią dwuczęściowych nazw zawierających każdą kombinację dwóch zestawów, np. [Foo, bar] x [1,2,3] lub [home, perm] x [ulica, miasto, stan]

Kevin Cline
źródło
-1 - w ogóle nie wspomina o nazewnictwie.
Billy ONeal,
Anty-wzorzec nazewnictwa nie może zawierać więcej niż jednego imienia?
kevin cline
Jak działa zbyt wiele argumentów ==nazywających antypattern? Jestem zmieszany.
Billy ONeal
1
o ile go rozumiem, konwencja ta pozwala na numery, w których należy wziąć faktyczne imię. Liczby te prowadzą do fałszywego wrażenia, że ​​elementy są jakąś listą lub tablicą
keppla,
3
@Billy ONeal: Tak. Problemem projektowym jest brak normalizacji, a sufiksy liczbowe wskazują na to wzorzec nazewnictwa.
reinierpost
3

Wszelkie nazewnictwo klas lub interfejsów, które jest tautologią, jest złe, nie tylko w Javie, o której mówi łącze, ale w dowolnym języku.

Tautologia (retoryka), używając różnych słów, aby powiedzieć to samo, nawet jeśli powtórzenie nie zapewnia jasności.

user7519
źródło
2
Ciekawy. Jakieś przykłady?
Mike Baranczak,
2
Czytam link, mówi „tautologia” ...;)
Benjol,
10
Pierwsza zasada klubu tautologicznego to pierwsza zasada klubu tautologicznego.
Cercerilla,
Przeczytałem link (w porządku, treść linku) i nie znalazłem żadnych przykładów
barjak
ok, więc zgodnie z tym linkiem powinniśmy przestać używać I <nazwa_interfejsu> ... prawda.
Dal
3

Często spotykam biblioteki oprogramowania o nazwach ogólnych, takich jak Librarylub Common. Wskazują na nieoptymalny projekt: programiści starają się unikać duplikacji kodu, ale bez żadnej próby stworzenia projektu rozłożonego na podstawie funkcjonalności.

reinierpost
źródło
+1 - cały czas widzę „Często”.
Morgan Herlocker,
1

Od Microsoft w sprawie nazewnictwa, mogę podać tę listę dla złych nazw:

  1. Nie są semantyczne, co oznacza, że ​​mają nazwy, które zamiast kłaść nacisk na to, co robi, kładą nacisk na używaną technologię lub wzorzec, na którym się opiera .
  2. Nie zachowują spójności syntaktycznej. Na przykład część nazw jest wielbłąda, a inna część jest pascal.
  3. Są to skróty, które są trudne do zrozumienia, jak ScrollableX zamiast CanScrollHorizontally
  4. Są tak dobrani, że mieszają się ze słowami kluczowymi tego środowiska.
Saeed Neamati
źródło
2
Właściwie podoba mi się „ScrollableX” co najmniej tak samo jak „CanScrollHorizontally”. „X” nie jest tak naprawdę skrótem.
user1172763,