Wstęp
Całkiem niedawno pisałem o tworzeniu diagramów klas a konkretnie modelu dziedziny w odpowiedzi na post pewnego blogera. Wymiana poglądów skończyła się ze strony adwersarza na zwróceniu uwagi, iż diagram klas może pokazywać więcej niż mój (bo może) ja zaś zwróciłem uwagę na fakt, że diagram klas to nie jakiś model a model powinien modelować jedne coś. Pokazanie na jednym diagramie klas dużo raczej mija się z celem, bo można zabrnąć w rejon gdzie sprawdza się reklama Banki od wszystkiego są do niczego. Tak więc nie należy przeciążać diagramów.
Model dziedziny systemu to model mechanizmu jego działania
The Domain Model is an object model of the domain that incorporates both behavior and data. [Model Dziedziny jest obiektowym modelem dziedziny, który zawiera zarówno zachowanie jak i dane.]
https://java-design-patterns.com/patterns/domain-model/
Tak więc forsuję tezę, że diagram klas to albo model pojęciowy (związki taksonomiczne i predykaty między nazwami stosowanymi w danej dziedzinie) albo model dziedziny czyli mechanizm opisujący dane biznesowe i metody ich przetwarzania. W tym drugim przypadku jest to Model z wzorca MVC, a Model ten można stworzyć stosując np. wzorce DDD.
Model nie powinien być anemiczny:
Jednym z najczęstszych powodów powstawania anemicznych modeli domenowych jest sposób projektowania aplikacji w oparciu o wcześniej stworzony schemat bazy danych. To prowadzi to do tego, że model domenowy powstaje w skutek mapowania tabel do klas posiadających odzwierciedlone kolumny w postaci właściwości. Jedynym wyzwaniem dla niektórych osób może być modelowanie relacji, które w przypadku bazy danych są kluczami obcymi, zaś w przypadku obiektowego modelu powinny być relacjami do innych obiektów. Nie brakuje oczywiście przykładów, gdzie relacje w modelu domenowym tworzone są również w oparciu o klucze obce, co całkowicie zaprzecza obiektowemu programowaniu (źr. za pomocą Domain Model ? !FrAgile Thinking.)
Zwrócę tu uwagę na ważną rzecz: w modelach obiektowych systemów podstawowym związkiem (w j. ang. relation) jest związek użycia, jest to wywołanie operacji obiektu: w modelach obiektowych obiekty sie komunikują (wymieniają komunikaty), nie są to żadne trwale powiązane byty.
Polecam cały powyższy artykuł (no ja pomijałem część związaną z kodem bo już nie programuję ;). Polecam przy okazji artykuł: http://msdn.microsoft.com/en-us/magazine/dd419654.aspx.
Patrz także Anemiczny Model Dziedziny jako antywzorzec obiektowy.