Kiedy klej lub klasa zarządzania robi zbyt wiele?

10

Mam skłonność do tworzenia scentralizowanych klas, które zarządzają innymi klasami w moich projektach. Nie przechowuje wszystkiego sam, ale większość żądań danych najpierw trafiłaby do „menedżera”. Patrząc na odpowiedź na to pytanie , zauważyłem termin „Boski przedmiot”. Zrozumiałe, że Wikipedia wymienia to jako antypattern.

Gdzie przebiega granica między uzasadnioną klasą kleju lub modułem, która przesyła dane i wiadomości z miejsca na miejsce, a klasą, która robi zbyt wiele?

jprete
źródło

Odpowiedzi:

15

Wiele osób twierdzi, że „klasa nigdy nie powinna być większa niż twoja głowa”.

Jednak właśnie uczestniczyłem w dyskusji z kilkoma naprawdę świetnymi światowej klasy programistami na ten właśnie temat. Rozmawiałem o tym z jednym z facetów Naked Objects. O ile nam wiadomo, czasami tak się dzieje i nie ma na to wiele sposobów.

Zwykle jednak jedną klasą, w której to się dzieje, jest obiekt domeny, który reprezentuje podstawowy element Twojej domeny - Konto bankowe, Sprzedaż detaliczna itp. Jeśli zauważysz, że dzieje się to również z innymi klasami, prawdopodobnie chcę wziąć pod uwagę odpowiedzialność tej klasy. Oto moje wskazówki:

  • Jeśli nazywa się „Menedżer”, „Pomocnik” lub „Usługa”, istnieje duże prawdopodobieństwo, że jest za duży. Gdy naprawdę zorientujesz się, jaka powinna być odpowiedzialność klasy, łatwiej będzie Ci przekazać inne obowiązki.
  • Jeśli nazywa się „kontrolerem”, powinien być odpowiedzialny za kontrolowanie interakcji między grupą innych klas ... i niczym więcej.
  • Jeśli przekazuje dane i wiadomości między różnymi fizycznymi węzłami, to albo powinien zająć się konwertowaniem określonej wiadomości do postaci szeregowej, albo obsługuje mechanizm transferu. Na przykład możesz mieć jedną klasę, która konwertuje transakcję bankową na XML, a drugą klasę, która wysyła ten XML przez HTTP.
  • Jeśli przekazuje zdarzenia między różnymi modułami w aplikacji, powinien odpowiadać za informowanie słuchaczy o wystąpieniu zdarzenia i nic więcej.

Zasadniczo, jeśli jest zbyt duży, sprawdź, czy możesz przekazać jakieś obowiązki innej klasie, a jeśli nie, prawdopodobnie jest to w porządku.

Lunivore
źródło
Dobra odpowiedź z przydatnymi konkretnymi wskazówkami. Zwykle tworzę takie klasy dla obiektów domeny, w których wszystkie lub prawie wszystkie dane reprezentują pewien aspekt domeny i chcę być w stanie traktować je jako jednostkę. Następnie mam tendencję do przekazywania rzeczywistych obowiązków klasom, które są naprawdę tworzone w dużych klasach. Jestem więc bardzo blisko linii i prawdopodobnie powinienem skłaniać się ku zmniejszeniu poszczególnych klas, gdy je piszę.
jprete