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 PurchaseOrderklasę, 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ć PurchaseOrderprostej 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 PurchaseOrderklasa powinna mieć issuePO, approvePOi cancelPOmetod.
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,approveorazcancel.POPrzyrostek dodaje tylko wartość ujemną.