Czy warto używać nazwy wzorca projektowego w klasach wykonawczych? [Zamknięte]

28

Ostatnio natknąłem się na umiarkowanie dużej kodzie Pythona z partii MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapteritd. Klas.

Podczas gdy z jednej strony te nazwiska skłoniły mnie do zbadania i poznania odpowiednich wzorców, nie były zbyt opisowe dla tego, co robi klasa .

Ponadto, wydaje się, że mieszczą się w zakazanej listy słów w programowaniu: variable, process_available_information, data, amount, compute: zbyt szerokie nazwy, które nie mówią nam nic na temat funkcji , gdy stosowane przez nich samych .

Czy powinno być, CommunicationManagerczy raczej PortListener? A może w ogóle nie rozumiem problemu ...?

Vorac
źródło
jeśli znasz się na tym, co robi wzorzec, to nazwa wzorca jest dobrym opisem, jednak sama nazwa wzorca jest złym pomysłem, lepiej mieć MyClassFactory, FooAdapter itp.
maniak
Edytowałem pytanie, aby wskazać, że klasy nie były nazywane po prostu „AbstractFactory”, ale były tam także niektóre słowa opisowe.
Vorac,
1
... czy poważnie nazwali to Fctoryzamiast Factory, czy to tylko literówka?
Izkata
@Izkata, lol, my bad. Były jednak przejściówki i przejściówki!
Vorac,

Odpowiedzi:

47
  • AbstractFactoryjest rzeczywiście kiepskim wyborem dla imienia. Nie ma sposobu, aby dowiedzieć się, co jest tworzone przez tę fabrykę , a kiedy będziesz szukać encji, która tworzy Animals, nigdy nie znajdziesz odpowiedniej fabryki według nazwy.

  • AnimalAbstractFactorynie jest mądrym wyborem, ponieważ w większości języków byłoby zbędne ze abstractsłowem kluczowym w podpisie.

    Biorąc to pod uwagę, istnieje kilka dobrych powodów, podkreślonych w komentarzach, które faktycznie należy uwzględnić Abstractw nazwie: nie tylko istnieje kilka kontekstów, w których nie masz pełnego podpisu, ale tylko nazwa, ale także utrzymywanie AnimalFactoryinterfejsu może być mądrym wyborem (chyba że niestety konwencją języka / frameworka jest prefiks interfejsu I).

  • AnimalCreationUtilitybyłby również zły wybór: jeśli jest to fabryka , ułatw rzeczy ludziom, którzy będą czytać kod i nazywają to fabryką .

  • abstract AnimalFactoryjest ok Nie ma nadmiarowości i jest jasne, że jest to abstrakcyjna fabryka, która deleguje tworzenie zwierząt swoim dzieciom.

Tak więc, w tym nazwa wzorca projektowego jest dobrym pomysłem, ale powinna być tylko częścią nazwy i nie powinna być zbędna z innymi częściami podpisu.

Arseni Mourzenko
źródło
2
Dlaczego jest to lepsze niż pisanie komentarza w widocznym miejscu? W tym module wdrażamy MVC. Powody: ... Modele: ... Widoki: ... Kontrolery: ... Mapa struktury: ... API :. .. ”.
Vorac,
37
@Vorac: Posiadanie jasnej nazwy jest zawsze lepsze niż poleganie na komentarzach.
Arseni Mourzenko
2
@Vorac wcześniej czy później ktoś doda nową klasę bez aktualizacji tego widocznego komentarza (lub nawet wiedząc o jego istnieniu). O wiele trudniej jest przeoczyć konwencję nazewnictwa konsekwentnie stosowaną w całej aplikacji.
Konrad Morawski
2
Czy podczas przeglądania swojego projektu otworzysz każdy plik klasy, aby znaleźć jego działanie? Nie. Dlatego zawsze lepiej jest mieć opisowe klasy nazw / pliki.
matryca
2
Chciałbym nie zgodzić się z drugim punktem: myślę, że AnimalAbstractFactory to dobry wybór, ponieważ nawet jeśli jest zbędny w deklaracji klasy, byłby bardzo pomocny w deklaracji klasy podrzędnej: LionFactory rozszerza AnimalAbstractFactory, która moim zdaniem to niezła informacja.
Igor
11

Zależy od konkretnego przykładu. Wzorzec Konstruktora jest prawie zawsze najlepiej obsługiwany, nazywając Konstruktora klasy *, podczas gdy Singleton zwykle nie musi być tak nazwany.

Jeśli nie umieścisz nazwy wzorca w nazwie klasy, a może nawet jeśli tak zrobisz, zazwyczaj powinieneś umieścić w klasie komentarz wyjaśniający, że implementuje on określony wzorzec.

MikeFHay
źródło
3
Spójność jest tutaj kluczowa, ponieważ gdy tylko zostaną powołane niektóre fabryki ...Factory, staje się dość mentalne uderzenie, gdy uświadomimy sobie, że klasa jest fabryką, jeśli jej nazewnictwo złamie tę konwencję.
Konrad Morawski
10

Głównym celem używania nazw wzorców w klasach jest ułatwienie zrozumienia, co robi klasa. Jeśli nazwiesz klasę AnimalFactory, oczywiste jest, że klasa tworzy instancje zwierząt. Jeśli nazwa twojej klasy zawiera nazwę wzorca i nie opisuje tego, co robi, wybrałeś zły wzorzec lub niewłaściwie go zaimplementowałeś.

Pavels
źródło
1

Myślę, że to może działać naprawdę dobrze. Na przykład:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }
CodeART
źródło
1
Jak to odpowiada na zadane pytanie? Za mojego czytania, twoje „przykłady” wskazują jedynie bezużyteczną powielania nazw klas i komentarze kodowych
gnat
Komentarze mają uzasadniać cel każdej klasy, jeśli nazwa klasy nie jest dla niektórych oczywista. Przeglądając je, od razu wiem, że mam polecenie, które coś robi, zapytanie zwracające dane, dekorator, który dodaje dodatkowe zachowanie do istniejącego mechanizmu rejestrowania wyjątków i fabrykę, która tworzy filtry kont. Moim zdaniem im bardziej opisowy jesteś z nazwami swoich klas, tym łatwiej inni mogą czytać Twój kod. Jeśli korzystasz z wzorca projektowego, powiedz to - na koniec celem posiadania wzorców projektowych jest ułatwienie innym osobom czytania Twojego kodu
CodeART