Nazwę ją... SomethingManager

Oryginalny post: I Shall Call It.. SomethingManager

Autor: Jeff Atwood

Alan Green tak narzekał na stosowanie bezsensownych nazw takich jak SomethingManager:

Ile klas z którymi się spotkałeś miały sufiks "Manager" (np. ConnectionManager, SessionManager)? Każdy większy system wydaje się być pełen takich klas - SessionManager, ConnectionManager, PolicyManager, QueueManager, UrlManager, ConfigurationManager, albo co jeszcze smutniejsze EJBManager.

Słowa "manager" i "manage" posiadają przynajmniej dziesięć różnych znaczeń - od "stworzyć coś i utrzymywać w zgodzie z wytycznymi" do "osiągnąć określony cel". Pamiętam jak pewnego dnia recepcjonistka przemianowała się na "Switchboard Manager". Częścią wspólną tych wszystkich definicji wydaje się być "dba o rzeczy".

Ta nieprecyzyjność powoduje, że słowo "Manager" jest złym słowem do stosowania w nazwach klas. Weźmy na przykład klasę o nazwie "UrlManager" - nie jesteś w stanie powiedzieć, czy ta klasa odpowiedzialna jest za przechowywanie adresów URL w pamięci podręcznej, operacje na adresach URL czy też dba o poprawne ich używanie. Nazwa "UrlManager" mówi Ci tylko tyle, że klasa coś robi z adresami URL. Z drugiej strony nazwa "UrlBuilder" daje dużo lepszy obraz tego, za co odpowiedzialna jest klasa.

W świecie Javy sufiks "Manager" jest często spotykany. Prawie wszędzie znajdują się klasy, które odpowiedzialne są w jakiś sposób za inne klasy, co powoduje, że automatycznie otrzymują sufiks "Manager".

Nie ma nic bardziej wieloznacznego niż klasa nazwana z użyciem sufiksu "Manager". Unikaj tego słowa. Alan zaproponował kilka alternatyw we wpisie na swoim blogu, który może być pomocny w sprecyzowaniu jakiej nazwy potrzebuje Twoja klasa.

Nadawanie dobrych, opisowych nazw klasom i obiektom nie jest łatwe. Steve McConnell dostarczył kilka porad na temat nazywania procedur w książce Code Complete:

  1. Nazwa opisuje wszystko, co wykonuje procedura Dosłownie wszystko. Jeśli sprawia to, że nazwa procedury staje się śmiesznie długa, nazwa nie jest problemem. Problemem jest Twoja procedura.

  2. Unikaj bezsensownych, ogólnikowych lub mało konkretnych czasowników Na przykład: UrlManager, HandleOutput(), PerformServices(). Bądź konkretny. Co robi procedura? Jeśli nie możesz odpowiedzieć na to pytanie zwięźle, być może nadszedł czas na refaktoring kodu, który pozwoli Ci odpowiedzieć na to pytanie.

  3. Nie wprowadzaj numeracji w nazwach procedur Dołączyłem to tylko by lista były kompletna. Jeśli kiedykolwiek znajdziesz się w sytuacji, w której piszesz procedurę OutputUser1() i OuputUser2(), niech Bóg ma Cię w swojej opiece. I niech ma też w swojej opiece zespół w którym pracujesz.

  4. Stosuj nazwy tak długie, jak to konieczne Według McConnella, optymalna długość zmiennej to 9-15 znaków. Procedury zazwyczaj są bardziej skomplikowane i dlatego zasługują na dłuższe nazwy. Zastosuj tak długą nazwę, by stała się zrozumiała.

  5. Dołączaj opis zwracanej wartości Łatwa i prosta zasada. Przykłady: printer.IsReady(), pen.CurrentColor(), itp.

  6. Używaj przeciwieństw precyzyjnie Dla każdej funkcji Open(), powinna istnieć także funkcja Close(). Dla każej funkcji Insert(), funkcja Delete(). Dla każdej funkcji Start(), funkcja Stop().

  7. Wypracuj i trzymaj się konwencji nazewniczych Najlepiej zilustrować to na przykładzie. McConnell przedstawił taki w swojej książce: employee.id.Get() dependent.GetId() supervisor() candidate.id()

    W takiej sytuacji pojawia się pytanie: jak pobrać Id dla innego obiektu?

Zmiana nazw klas i zmiennych jest moją najczęstszą czynnością wykonywaną podczas refaktoryzacji. Tworzenie dobrych nazw jest trudne, ale to powinno być trudne. Trudno jest nazwać coś, czego nie skończyłeś jeszcze pisać. Większość kodu nigdy nie jest całkowicie ukończona, zatem nazwy mogą zmieniać się z czasem. Zwięzłe, opisowe nazwy zmiennych, obiektów, klas i funkcji mogą sprawić, że zamiast Daily WTF code otrzymasz kod, z którym chcesz pracować na co dzień.

Data publikacji oryginału: 29 marca, 2007

0 komentarze:

Prześlij komentarz

Related Posts with Thumbnails