Nazywanie klas - jak uniknąć nazywania wszystkiego "menedżerem"? [zamknięte]

Dawno temu przeczytałem artykuł (chyba wpis na blogu), który postawił mnie na "właściwym" tropie nazywania obiektów: bądź bardzo skrupulatny w nazywaniu rzeczy w swoim programie.

Na przykład, jeśli moja aplikacja była (jako typowa aplikacja biznesowa) obsługująca użytkowników, firmy i adresy, miałbym User, Company i Address klasę domeny - i prawdopodobnie gdzieś UserManager, a CompanyManager i AddressManager wyskakuje, że obsługuje te rzeczy.

Więc możesz powiedzieć, co te UserManager, CompanyManager i AddressManager zrobić? Nie, ponieważ Manager to bardzo ogólny termin, który pasuje do wszystkiego, co możesz zrobić z obiektami domeny.

Artykuł, który przeczytałem zalecał użycie bardzo konkretnych nazw. Gdyby była to aplikacja C++, a zadaniem UserManager było przydzielanie i uwalnianie użytkowników ze sterty, nie zarządzałaby użytkownikami, ale chroniłaby ich narodziny i śmierć. Hmm, może moglibyśmy to nazwać UserShepherd.

A może zadaniem UserManager jest sprawdzenie danych każdego obiektu użytkownika i podpisanie danych kryptograficznie. Wtedy mielibyśmy UserRecordsClerk.

Teraz, gdy ten pomysł utknął we mnie, staram się go zastosować. I znaleźć ten prosty pomysł niezwykle trudne.

Mogę opisać, co robią klasy I (O ile nie wpadnę w szybkie i brudne kodowanie) klasy, które piszę, robią dokładnie jedną rzecz. To, czego mi brakuje, aby przejść od tego opisu do nazw, to rodzaj katalogu nazw, słownictwa, które mapuje pojęcia do nazw.

Ostatecznie chciałbym mieć coś w rodzaju katalog wzorców w moim umyśle (często wzorce projektowe łatwo podają nazwy obiektów, np. a factory)

  • Factory-tworzy inne obiekty (nazewnictwo zaczerpnięte z wzorca projektowego)
  • Pasterz-pasterz zajmuje się życiem przedmiotów, ich tworzeniem i zamykaniem.]} Synchronizator-kopiuje dane między dwoma lub więcej obiektami (lub hierarchiami obiektów)
  • Nanny-pomaga obiektom osiągnąć stan "użyteczny" po utworzeniu - np. poprzez podłączenie do inne obiekty

  • Itd.itd.

Jak sobie z tym radzisz? Masz stałe słownictwo, wymyślasz nowe nazwy w locie, czy rozważasz nazywanie rzeczy nie tak ważnych, czy niewłaściwych?

P. S.: interesują mnie również linki do artykułów i blogów omawiających ten problem. Na początek, oto oryginalny artykuł, który dał mi do myślenia: Nazywanie klas Java bez 'menedżera'


Update: podsumowanie odpowiedzi

Oto małe podsumowanie tego, czego nauczyłem się z tego pytania w międzyczasie.

  • staraj się nie tworzyć nowych metafor (Niania)
  • Zobacz, co robią inne frameworki]}

Kolejne artykuły/książki na ten temat:

Oraz aktualną listę prefiksów / sufiksów nazw, które zebrałem (subiektywnie!) z odpowiedzi:

  • Koordynator
  • Budowniczy
  • pisarz
  • czytelnik
  • Handler
  • Pojemnik
  • protokół
  • Target
  • konwerter
  • Controller
  • widok
  • Fabryka
  • Entity
  • wiadro

I dobra wskazówka na drogę:

Nie daj się nazwać paraliż. Tak, nazwiska są bardzo ważne, ale nie są na tyle ważne, aby tracić na to ogromne ilości czasu. Jeśli nie możesz wymyślić dobrego imienia w 10 minut, idź dalej.

Author: froh42, 2009-12-08

13 answers

Zadałem podobne pytanie , ale w miarę możliwości staram się skopiować nazwy już w. NET framework i szukam pomysłów w Javie i Android framework.

Wydaje się Helper, Manager, i Util są nieuniknionymi rzeczownikami, które dołączasz do klas koordynujących, które nie zawierają stanu i są ogólnie proceduralne i statyczne. Alternatywą jest Coordinator.

Można dostać szczególnie fioletowy prosey z nazwami i przejść do rzeczy takich jakMinder, Overseer, Supervisor, Administrator, oraz Master, ale jak już powiedziałem, wolę zachować to jak nazwy frameworków, do których przywykłeś.

Inne popularne przyrostki (jeśli jest to poprawne określenie), które można również znaleźć w. NET framework to:
  • Builder
  • Writer
  • Reader
  • Handler
  • Container
 158
Author: Chris S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-22 11:14:18

Możesz rzucić okiem na source-code-wordle.de , przeanalizowałem tam najczęściej używane przyrostki nazw klas. NET framework i niektórych innych bibliotek.

Top 20 są:

  • atrybut
  • typ
  • helper
  • kolekcja
  • konwerter
  • handler
  • info
  • dostawca
  • wyjątek
  • serwis
  • element
  • manager
  • węzeł
  • opcja
  • fabryka
  • kontekst
  • pozycja
  • projektant
  • baza
  • edytor
 91
Author: Markus Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-02 21:44:39

Jestem za dobrymi imionami i często piszę o tym, jak ważne jest dbanie o to, aby dobierać nazwy dla rzeczy. Z tego samego powodu nie zwracam uwagi na metafory przy nazywaniu rzeczy. W oryginalnym pytaniu "fabryka " i" synchronizer " wyglądają jak dobre nazwy tego, co wydają się oznaczać. Jednak "pasterz" i "niania" nie są, ponieważ opierają się na metaforach . Klasa w Twoim kodzie nie może być dosłownie nianią; nazywasz ją nianią, ponieważ opiekuje się inną rzeczy bardzo podobnie jak prawdziwa niania opiekuje się dziećmi lub dziećmi. To jest OK w mowie nieformalnej, ale nie w porządku (moim zdaniem) dla nazywania klas w kodzie, które będą musiały być utrzymywane przez kto wie, kto wie, kiedy.

Dlaczego? Ponieważ metafory są zależne od kultury i często zależne od jednostki. Dla Ciebie, nazywanie klasy "niania" może być bardzo jasne, ale może nie jest to tak jasne dla kogoś innego. Nie powinniśmy na tym polegać, chyba że piszesz kod, który jest tylko dla osobistych użyj.

W każdym przypadku konwencja może tworzyć lub łamać metaforę. Samo użycie "factory" opiera się na metaforze, ale takiej, która istnieje już od dłuższego czasu i jest obecnie dość dobrze znana w świecie programowania, więc powiedziałbym, że jest Bezpieczna w użyciu. Jednak "niania" i "pasterz" są niedopuszczalne.

 55
Author: CesarGon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 16:43:12

Moglibyśmy się obejść bez żadnych xxxFactory, xxxManager lub xxxRepository klasy jeśli poprawnie modelujemy świat rzeczywisty:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

;-)

 42
Author: herzmeister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-16 17:27:47

To brzmi jak śliska pochyłość do czegoś, co zostanie umieszczone na thedailywtf.com, "Managerofpeoplewwhavemortgages" itp.

Przypuszczam, że to prawda, że jedna monolityczna Klasa Menedżera nie jest dobrym projektem, ale używanie 'Managera' nie jest złe. Zamiast UserManager możemy podzielić go na UserAccountManager, UserProfileManager, UserSecurityManager, itd.

'Menedżer' to dobre słowo, ponieważ wyraźnie pokazuje, że klasa nie reprezentuje prawdziwej 'rzeczy'. "AccountsClerk" - how am Mam powiedzieć, czy to klasa, która zarządza danymi użytkowników, czy reprezentuje kogoś, kto jest księgowym do ich pracy?

 31
Author: Mr. Boy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 20:39:20

Ponieważ interesują Cię artykuły z tej dziedziny, być może zainteresuje cię artykuł Steve 'a Yegge' a "egzekucja w Królestwie rzeczowników":

Http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

 20
Author: stusmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 14:44:08

Kiedy myślę o użyciu Manager LUB Helper w nazwie klasy, uważam to za zapach kodu, który oznacza, że nie znalazłem jeszcze właściwej abstrakcji i / lub naruszam zasadę pojedynczej odpowiedzialności , więc refaktoryzacja i wkładanie większego wysiłku w projektowanie często znacznie ułatwia nazywanie.

Ale nawet dobrze zaprojektowane klasy nie (zawsze) się nazywają, a twoje wybory częściowo zależą od tego, czy tworzysz klasy modelu biznesowego, czy infrastrukturę techniczną klasy.

Klasy modeli biznesowych mogą być trudne, ponieważ są różne dla każdej domeny. Istnieją pewne terminy, których często używam, takie jak Policy dla klas strategii w danej domenie (np. LateRentalPolicy), ale zwykle wynikają one z próby stworzenia " wszechobecnego języka ", którym można dzielić się z użytkownikami biznesowymi, projektując i nazywając klasy, aby modelowały rzeczywiste pomysły, obiekty, akcje i wydarzenia. [7]}klasy infrastruktury technicznej są nieco łatwiejsze, ponieważ opisują domeny, które znamy naprawdę dobrze. Wolę włączyć nazwy wzorców projektowych do nazw klas, jak InsertUserCommand, CustomerRepository, lub SapAdapter. rozumiem obawy związane z komunikowaniem implementacji zamiast intencji, ale wzorce projektowe łączą te dwa aspekty projektowania klas - przynajmniej wtedy, gdy masz do czynienia z infrastrukturą, gdzie chcesz, aby implementacja projekt była przejrzysta, nawet gdy ukrywasz szczegóły.
 17
Author: Jeff Sternal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 16:20:37

Bycie au fait z wzorcami zdefiniowanymi przez (powiedzmy) GOF book i nazywanie obiektów po nich daje mi długą drogę w nazywaniu klas, organizowaniu ich i komunikowaniu intencji. Większość ludzi zrozumie tę nomenklaturę (a przynajmniej większą jej część).

 8
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 12:59:12

Jeśli nie mogę wymyślić bardziej konkretnej nazwy dla mojej klasy niż XyzManager, to byłby dla mnie punkt, aby rozważyć, czy jest to naprawdę funkcjonalność, która należy do jednej klasy, tzn. architektoniczny "zapach kodu".

 8
Author: Jasper van den Bosch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 20:51:41

Myślę, że najważniejszą rzeczą, o której należy pamiętać, jest to, czy nazwa jest wystarczająco opisowa? Czy patrząc na nazwę można stwierdzić, co klasa ma robić? Używanie słów takich jak "Manager", "Service" lub "Handler" w nazwach klas może być uważane za zbyt ogólne, ale ponieważ wielu programistów używa ich, pomaga to również zrozumieć, do czego służy Klasa.

Ja sam często używam fasady-wzoru (przynajmniej tak to się nazywa). Mógłbym mieć User klasę, która opisuje tylko jednego użytkownika i klasę Users, która śledzi moją "kolekcję użytkowników". Nie nazywam klasy A UserManager, ponieważ nie lubię menedżerów w prawdziwym życiu i nie chcę, aby mi o nich przypominano:) samo użycie liczby mnogiej pomaga mi zrozumieć, co robi Klasa.
 4
Author: Droozle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 13:18:55

Specyficzne dla C#, znalazłem "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable.NET Libraries", aby mieć wiele dobrych informacji na temat logiki nazewnictwa.

Jeśli chodzi o znalezienie tych bardziej konkretnych słów, często używam tezaurusa i przeskakuję przez powiązane słowa, aby spróbować znaleźć dobry. Staram się jednak nie spędzać z nim zbyt wiele czasu, w miarę postępów w rozwoju wymyślam lepsze nazwy, lub czasami zdaję sobie sprawę, że SuchAndSuchManager naprawdę powinno być podzielony na wiele klas, a następnie nazwa tej przestarzałej klasy staje się nie-problemem.

 4
Author: AaronLS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 01:22:28

Uważam, że kluczową rzeczą jest zachowanie spójności w sferze widoczności kodu, tzn. tak długo, jak każdy, kto musi spojrzeć na kod / pracować nad nim, rozumie twoją konwencję nazewnictwa, powinno to być w porządku, nawet jeśli zdecydujesz się nazywać je "CompanyThingamabob" i "UserDoohickey". Pierwszym przystankiem, jeśli pracujesz dla firmy, jest sprawdzenie, czy istnieje konwencja firmowa dotycząca nazewnictwa. Jeśli nie ma lub nie pracujesz dla firmy, Stwórz własną, używając terminów, które mają sens do ciebie, przekazać go wokół kilku zaufanych kolegów / przyjaciół, którzy przynajmniej kod przypadkowo, i włączyć wszelkie opinie, które mają sens.

Stosowanie cudzej konwencji, nawet jeśli jest powszechnie akceptowane, jeśli nie wyskoczy ze strony na Ciebie, jest trochę błędem w mojej książce. Przede wszystkim muszę zrozumieć mój kod bez odniesienia do innej dokumentacji, ale jednocześnie musi być na tyle ogólny, aby nie był niezrozumiały dla kogoś innego w tej samej dziedzinie w tym samym przemysł.

 1
Author: Lazarus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 13:10:51

Rozważyłbym wzory, których używasz w swoim systemie, konwencje nazewnictwa / katalogowania / grupowania klas są definiowane przez użyty wzorzec. Osobiście trzymam się tych konwencji nazewnictwa, ponieważ są one najbardziej prawdopodobnym sposobem, aby inna osoba mogła odebrać mój kod i uruchomić go.

Na przykład UserRecordsClerk może być lepiej wyjaśnione jako rozszerzenie ogólnego interfejsu RecordsClerk, który zarówno userrecordsclerk, jak i CompanyRecordsClerk implementują, a następnie specjalizujemy się na, co oznacza, że można spojrzeć na metody w interfejsie, aby zobaczyć, do czego zazwyczaj służą podklasy its.

Zobacz książkę, taką jak wzorce projektowe , aby uzyskać informacje, jest to doskonała książka i może pomóc ci wyjaśnić, gdzie masz zamiar być z kodem-jeśli jeszcze go nie używasz! ; o)

Myślę, że dopóki twój wzorzec jest dobrze dobrany i używany tak dalece, jak jest to właściwe, to dość nieinwazyjne proste nazwy klas powinny wystarczyć!

 1
Author: Caroline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 13:12:21