Wymyślenie dobrych, precyzyjnych nazw klas jest niezwykle trudne. Wykonane dobrze, sprawia, że kod jest bardziej samodokumentujący i dostarcza słownictwa do rozumowania kodu na wyższym poziomie abstrakcji.
Klasom, które implementują określony wzorzec projektowy, można nadać 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 problemowej, ale co z innymi klasami? Czy jest coś takiego jak tezaurus programisty, do którego mogę się zwrócić, gdy brakuje mi inspiracji i chcę uniknąć używania ogólnych nazw klas (takich jak FooHandler, FooProcessor, FooUtils i FooManager)?
Odpowiedzi:
Zacytuję kilka fragmentów z Implementation Patterns autorstwa Kenta Becka:
Prosta nazwa nadklasy
Kwalifikowana nazwa podklasy
Berło
Aby uzyskać bardziej szczegółową dyskusję, kup książkę! To jest tego warte! :)
źródło
Zawsze wybieraj MyClassA, MyClassB - pozwala to na ładne sortowanie alfa.
Żartuję!
To dobre pytanie i coś, czego nie tak dawno temu doświadczyłem. Reorganizowałem swoją bazę kodów w pracy i miałem problemy z tym, gdzie umieścić, co i jak to nazwać.
Prawdziwy problem?
Zajęcia robiłem za dużo. Jeśli spróbujesz zastosować się do zasady pojedynczej odpowiedzialności , wszystko zbiegnie się w całość o wiele ładniej. Zamiast jednej monolitycznej klasy PrintHandler , możesz podzielić ją na PageHandler , PageFormatter (i tak dalej), a następnie utworzyć główną klasę Printer, która łączy to wszystko razem.
W mojej ponownej organizacji zajęło mi to trochę czasu, ale skończyło się na binowaniu wielu zduplikowanych kodów, uzyskałem znacznie bardziej logiczną bazę kodu i nauczyłem się piekielnie dużo, jeśli chodzi o myślenie przed wrzuceniem dodatkowej metody do klasy: D
Chciałbym nie zaleca jednak oddanie rzeczy jak nazwy wzorca do nazwy klasy. Interfejs klas powinien to uczynić oczywistym (jak ukrycie konstruktora dla singletona). Nie ma nic złego w nazwie ogólnej, jeśli klasa służy celowi ogólnemu.
Powodzenia!
źródło
Doskonała mowa Josha Blocha o dobrym projekcie API zawiera kilka dobrych rad:
Jeśli Twoim problemem jest nazwanie ujawnionych klas wewnętrznych, być może powinieneś skonsolidować je w większą klasę.
Jeśli twoim problemem jest nazwanie klasy, która wykonuje 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.
źródło
Jeśli utkniesz z nazwą, czasem dobrą strategią jest nadanie jej jakiejś na wpół rozsądnej nazwy z zobowiązaniem do jej późniejszej zmiany.
Nie daj się nazwać paraliżowi. Tak, imiona są bardzo ważne, ale nie są na tyle ważne, by tracić na nie ogromne ilości czasu. Jeśli nie możesz wymyślić dobrego imienia w 10 minut, przejdź dalej.
źródło
Jeśli nie przychodzi mi na myśl dobre imię, prawdopodobnie zadałbym pytanie, czy istnieje głębszy problem - czy zajęcia służą jakiemuś celowi? Jeśli tak, nazwanie go powinno być dość proste.
źródło
Jeśli twój "FooProcessor" naprawdę przetwarza foos, nie wahaj się nadać mu tej nazwy tylko dlatego, że masz już BarProcessor, BazProcessor itp. W razie wątpliwości, oczywiste jest najlepsze. Inni programiści, którzy muszą odczytać Twój kod, mogą nie używać tego samego tezaurusa, co Ty.
To powiedziawszy, bardziej szczegółowość nie zaszkodzi w tym konkretnym przykładzie. „Proces” to dość szerokie słowo. Czy to naprawdę jest na przykład „FooUpdateProcessor” (który może się zmienić na „FooUpdater”)? Nie musisz być zbyt "kreatywny", jeśli chodzi o nazewnictwo, ale jeśli napisałeś kod, prawdopodobnie masz dość dobre pojęcie o tym, co robi, a czego nie.
Na koniec pamiętaj, że sama nazwa klasy to nie wszystko, co ty i czytelnicy kodu musicie kontynuować - zwykle w grze są również przestrzenie nazw. Często mogą one zapewnić czytelnikom wystarczający kontekst, aby wyraźnie zobaczyć, do czego służy Twoja klasa, nawet jeśli jej nazwa jest dość ogólna.
źródło