Jestem programistą od dawna (mam 49 lat), ale raczej nowością w programowaniu obiektowym. Czytałem o OO od czasu Eiffla Bertranda Meyera, ale zrobiłem naprawdę niewiele programowania OO.
Chodzi o to, że każda książka na temat projektowania OO zaczyna się od przykładu łodzi, samochodu lub innego wspólnego obiektu, którego często używamy, i zaczynają dodawać atrybuty i metody oraz wyjaśniać, w jaki sposób modelują stan obiektu i co można zrobić za pomocą to.
Zwykle mówią coś w stylu „im lepszy model, tym lepiej reprezentuje obiekt w aplikacji i tym lepiej wychodzi”.
Jak dotąd tak dobrze, ale z drugiej strony znalazłem kilku autorów, którzy podają takie przepisy, jak: „klasa powinna zmieścić się tylko na jednej stronie” (dodałbym „jaki rozmiar monitora?”, Skoro nie próbujemy wydrukować kod!).
Weźmy na przykład PurchaseOrder
klasę, która ma skończoną maszynę stanu kontrolującą jej zachowanie, i kolekcję PurchaseOrderItem
, jednym z argumentów w pracy jest to, że powinniśmy użyć PurchaseOrder
prostej klasy z pewnymi metodami (niewiele więcej niż klasa danych) i mieć PurchaseOrderFSM
„klasy ekspert”, który obsługuje skończona maszyna stanu ds PurchaseOrder
.
Powiedziałbym, że mieści się w klasyfikacji „Zazdrosna cecha” lub „Niewłaściwa intymność” postu Code Smells Jeffa Atwooda w Coding Horror. Po prostu nazwałbym to zdrowym rozsądkiem. Jeśli mogę wydać, zatwierdzić lub anulować moje zamówienie rzeczywistym zakupu, wówczas PurchaseOrder
klasa powinna mieć issuePO
, approvePO
i cancelPO
metod.
Czy to nie idzie w parze z „maksymalizacją spójności” i „minimalizowaniem łączenia” starych zasad, które rozumiem jako fundamenty OO?
Poza tym, czy to nie pomaga w utrzymaniu klasy?
PurchaseOrder
, można po prostu wymienić swoje metodyissue
,approve
orazcancel
.PO
Przyrostek dodaje tylko wartość ujemną.