Jakie jest najlepsze podejście do nazywania klas?

Wymyślenie dobrych, precyzyjnych nazw klas jest notorycznie trudne. Dobrze zrobiony, czyni kod bardziej samodokumentującym się i dostarcza słownictwa do rozumowania o kodzie na wyższym poziomie abstrakcji.

Klasy, które implementują określony wzorzec projektowy, mogą otrzymać nazwę opartą na dobrze znanej nazwie wzorca (np. FooFactory, FooFacade), A klasy, które bezpośrednio modelują koncepcje domeny, mogą wziąć swoje nazwy z domeny problemu, ale co z inne zajęcia? Czy jest coś takiego jak tezaurus programisty, do którego mogę się zwrócić, gdy brakuje mi inspiracji i chcę unikać używania ogólnych nazw klas (takich jak FooHandler, FooProcessor, FooUtils i FooManager)?

 92
Author: Henry, 2008-09-01

6 answers

Przytoczę kilka fragmentów z wzorców implementacji autorstwa Kenta Becka:

Prosta Nazwa Nadklasy

"[...] Nazwy powinny być krótkie i ostre. Jednak aby nazwy były precyzyjne czasami wydaje się wymagać kilku słowa. Wyjściem z tego dylematu jest wybierając mocną metaforę dla obliczenia. Z myślą o metaforze, nawet pojedyncze słowa niosą ze sobą bogata sieć powiązań, powiązań, i implikacje. Na przykład w HotDraw drawing framework, my pierwszy nazwa obiektu na rysunku to DrawingObject . Przyszedł Ward Cunningham wraz z metaforą typograficzną: a rysunek jest jak wydrukowany, rozłożony strona. Elementy graficzne na stronie to liczby, więc Klasa stała się figurą . W kontekście metafory, Rysunek jest jednocześnie krótszy, bogatszy i bardziej precyzyjny niż DrawingObject ."

Nazwa Podklasy Kwalifikowanej

" nazwy podklas mają dwa zadania. Muszą się komunikować jaka Klasa są tacy i jacy są inaczej. [...] W przeciwieństwie do nazw na korzenie hierarchii, podklasa nazwy nie są tak często używane w rozmowy, aby mogli być ekspresyjny kosztem bycia zwięzłe. [...]

Podaj podklasy, które służą jako korzenie hierarchii ich własnych prostych nazwiska. Na przykład, HotDraw mA Klasa Uchwyt prezentująca postać- operacje edycji, gdy postać jest wybrane. Nazywa się, po prostu, Uchwyt na przekór rozszerzenie Rysunek . Jest cała rodzina uchwytów i oni najodpowiedniej mają nazwy takie jak StretchyHandle i TransparencyHandle . Ponieważ Uchwyt jest korzeniem własnej hierarchii, zasługuje na proste nazwa superklasy więcej niż kwalifikowany nazwa podklasy.

Kolejna zmarszczka w nazewnictwo podklas jest wielopoziomowe hierarchie. [...] Zamiast ślepo prepend the modifiers to the immediate superklasa, pomyśl o nazwie z czytelnik ' s perspektywa. Jaka Klasa czy on musi wiedzieć, że ta klasa jest na przykład? Użyj tej superklasy jako podstawy dla nazwy podklasy."

Interfejs

Dwa style nazewnictwa interfejsów zależą od tego, jak myślisz o interfejsach. Interfejsy jako klasy bez implementacji powinny być nazwane tak, jakby były klasami (Prosta Nazwa Nadklasy, Nazwa Podklasy Kwalifikowanej ). Jeden problem z tym stylem nazewnictwo polega na tym, że dobre imiona są używane zanim dojdziesz do nazywanie klas. Na interfejs o nazwie File potrzebuje klasy implementacji o nazwie coś w rodzaju ActualFile, ConcreteFile , or (Fuj!) FileImpl (zarówno przyrostek jak i Skrót). Ogólnie rzecz biorąc, komunikowanie, czy mamy do czynienia z konkretną lub obiekt abstrakcyjny jest ważny, czy obiekt abstrakcyjny jest zaimplementowany jako interfejs lub superklasa jest mniej ważna. Odroczenie rozróżnienia między interfejsy i superklasy są dobrze wspierane przez to styl nazewnictwa, zostawiając cię możesz zmienić zdanie później ,jeśli to > stanie się konieczne.

Czasami nazywanie konkretnych klas po prostu jest ważniejsze w komunikacji niż ukrywanie użycia interfejsów. W tym przypadku przedrostek nazwy interfejsu z "I". Jeśli interfejs nazywa się IFile , klasa może być po prostu wywołana File .

Do bardziej szczegółowej dyskusji Kup książkę! Warto! :)

 59
Author: Marcio Aguiar,
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
2020-06-20 09:12:55

Zawsze wybieraj MyClassA, MyClassB-pozwala to na ładny rodzaj Alfy..

Żartuję!

To dobre pytanie i coś, czego doświadczyłem nie tak dawno temu. Przeorganizowalem w pracy kod i mialem problemy z tym, gdzie umiescic co i jak to nazwac..

Prawdziwy problem?

Miałam zajęcia robiące za dużo. Jeśli spróbujesz stosować się do Zasady jednej odpowiedzialności to wszystko będzie razem milej.. Zamiast jednej monolitycznej klasy PrintHandler , można podzielić ją na PageHandler , PageFormatter (i tak dalej), a następnie mieć klasę master Printer, która łączy to wszystko razem.

W mojej re-org, Zajęło mi to trochę czasu, ale skończyło się na binowaniu dużo zduplikowanego kodu, dostałem mój kod o wiele bardziej logiczny i nauczyłem się cholernie dużo, jeśli chodzi o myślenie przed rzuceniem dodatkowej metody w klasie: D

Ja bym NIE zaleca się jednak umieszczanie takich rzeczy jak nazwy wzorców w nazwie klasy. Interfejs klas powinien to oczywista oczywistość (jak ukrywanie konstruktora dla Singletona). Nie ma nic złego w nazwie generycznej, jeśli klasa służy celowi generycznemu.

Powodzenia!

 39
Author: Rob Cooper,
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
2008-09-01 15:16:21

Josh Bloch ' s excellent talk about good API design ma kilka dobrych rad:

    Klasy powinny robić jedną rzecz i robić to dobrze.
  • jeśli klasa jest trudna do nazwania lub wyjaśnienia, to prawdopodobnie nie postępuje zgodnie z radami z poprzedniego punktu.
  • Nazwa klasy powinna natychmiast informować, czym jest klasa.
  • Dobre imiona napędzają dobre projekty.

Jeśli twoim problemem jest to, jak nazwać exposed internal classes, może powinieneś skonsolidować oni do większej klasy.

Jeśli twoim problemem jest nazwanie klasy, która robi wiele różnych rzeczy, powinieneś rozważyć podzielenie jej na wiele klas.

Jeśli to dobra rada dla publicznego API, to nie zaszkodzi żadnej innej klasie.

 28
Author: Josh Segall,
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
2015-08-20 20:22:13

Jeśli utkniesz z imieniem, czasami po prostu go dowolne półsensowna nazwa z zaangażowaniem w jej późniejszą rewizję to dobra strategia.

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.

 13
Author: Simon Johnson,
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
2008-09-01 15:20:13

Jeśli dobre imię nie przychodzi mi do głowy, to pewnie zastanawiałbym się, czy jest głębszy problem - czy klasa służy dobremu celowi? Jeśli tak, nazywanie go powinno być dość proste.

 9
Author: Luke Halliwell,
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
2008-09-01 15:12:00

Jeśli twój "FooProcessor" naprawdę przetwarza foos, to nie niechęć do nadawania mu tej nazwy tylko dlatego, że masz już Barprocesor, Bazprocesor itp. W razie wątpliwości, oczywistość jest najlepsza. Inni programiści, którzy muszą przeczytać twój kod, mogą nie używać tego samego tezaurusa, którym jesteś.

To powiedziawszy, większa specyficzność nie zaszkodzi dla tego konkretnego przykładu. "Proces" to dość szerokie słowo. Czy na przykład jest to " FooUpdateProcessor "(który może stać się" FooUpdater")? Ty nie musisz być zbyt "kreatywny" w kwestii nazewnictwa, ale jeśli napisałeś kod, prawdopodobnie masz dość dobry pomysł na to, co robi, a czego nie.

Na koniec pamiętaj, że sama nazwa klasy to nie wszystko, co musisz robić ty i czytelnicy Twojego kodu - zwykle w grze są również przestrzenie nazw. Mogą one często dać czytelnikom wystarczająco dużo kontekstu, aby wyraźnie zobaczyć, do czego naprawdę służy twoja klasa, nawet jeśli jej Naga nazwa jest dość ogólna.

 3
Author: McKenzieG1,
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
2008-09-01 16:08:49