Mateusz
Kurleto
Szukamy wybitnych
talentów do
świetnego zespołu IT
w Gdańsku
Temat: (Anemiczny) Model Dziedziny
Temat wraca w moich rozważaniach niczym bumerang i postanowiłem zasięgnąć języka. Fowler opisał go dość jasno jako model statyczny (nie zawierający elementów dynamiki systemu). Upraszczając - klasy bez operacji są złe. No właśnie - klasy bez operacji, czy model bez operacji?Weźmy sobie na warsztat prosty case - system do rejestrowana poczty przychodzącej i wychodzącej. Rozważmy trzy wersje "modelu dziedziny":
Wersja 1:
Wersja 2:
Wersja 3:
W zasadzie każda z nich pokazuje to samo. Zwróćmy jednak uwagę, że Wersja 2 jest stosunkowo bliska konstrukcyjnie wielu frameworkom MVC i pokrewnym.
Wersja 3 z kolei od 2 różni się tym, że wycięta została cała warswa dynamiki - czyli wróciliśmy do anemicznego modelu. W związku z tym także wersja 2 implementuje anemiczny model dziedziny. Tylko czy to tak bardzo źle?
Podstawą większości systemów dla biznesu jest zarządzanie dokumentami. Jest to z natury bardzo anemiczna sprawa - dokument można stworzyć, zmienić, usunąć, wyświetlić, znaleźć i udostępnić. W zasadzie sama istota dokumentu na tym się kończy - cała reszta to implikacje jakie dla biznesu ma pojawienie się takiego dokumentu.
Wroćmy do podstaw i funkcjonowania bez systemów IT. Weźmy zapytanie ofertowe
Od: ACME Sp z o.o.
Do: Hurt Sp z o.o.
Zapraszamy do złożenia oferty na dostawę
Produktu o nr kat ABC/1 w ilości 30 szt.
Produktu o nr kat XFD/2 w ilości 40 szt.
Niech obsługa takiego zapytania ofertowego polega na sprawdzeniu stanów magazynowych i jeśli mamy dostępne odpowiednie ilości - składamy ofertę z założoną marżą, jeśli nie mamy - nie składamy.
Reprezentując działanie firmy w oprogramowaniu stworzylibysmy dwa rejestry - Zapytań Ofertowych oraz Ofert umożliwiając użytkownikom zarządzanie obiektami zapytań oraz ofert. Ta dziedzina ze swej natury jest poprostu anemiczna(!).
Załóżmy, że chcielibyśmy zoptymalizować działąnie firmy i w przypadku tak prostej obsługi udzielać automatycznie odpowiedzi - czyli tworzyć automatycznie oferty. Innymi słowy chcemy zaimplementować funkcjonalność "Pani Kazia - Account Manager" - która czyta zapytania ofertowe i dla każdego sprawdza czy na stanach magazynowych są niezbędne produkty czy nie - jeśli są, składa ofertę, jeśli nie opdowiada że niestety nie złożymy oferty.
Teraz mamy dylemat - anemicznie czy nie?
Droga I:
Tworzymy sobie observer, który w przypadku pojawienia się zapytania ofertowego iteruje się po jego pozycjach i uruchamia metodę czyDostępny(nr_kat_produktu,ilosc) w naszym systemie magazynowym; jeśli każda pozycja jest dostępna tworzy dokument oferta wskazując cenę każdej z pozycji wyliczając ją jako iloczyn ceny zakupu i zakładanego narzutu, jeśli którejkolwiek pozycji jest brak tworzy odpowiedź na ofertę o treści "Sorry, nie składamy oferty".
UWAGA:
Przecież to wciąż anemiczny model dziedziny.
Droga II:
OOAD ponad wszystko. Dynamizujemy nasz model i już w klasie reprezentującej pozycję z zapytania ofertowego implementujemy metode weryfikującą dostępnośc na magazynie.
--
Argumenty za Drogą I:
- gotowość na zmiany - jeśli będziemy stosowali architekturę jak w v2 to zmiana konstrukcji któregokolwiek elementu wymusi na nas tylko aktualizacje interfejsów - a nie wybebeszanie połowy aplikacji
- rozszerzalność - załóżmy, że chcemy rozszerzyć kompetencjie Pani Kazi i pozwolić jej składać oferty częściowe - w przypadku Drogi I zmieniamy tylko jeden obszar - otóż jak nam się brakuje produktu tworzymy ofertę niepełną zamiast przerywać weryfikację; w przypadku Drogi II będzie to daleko bardziej skomplikowane
- adekwatność - oprogramowanie jest pewnego rodzaju modelem rzeczywistości a ten winien w danej perspektywie i na przyjętym poziomie abstrakcji być analogiczny do rzeczywistości i ten aspekt chciałbym rozwinąć. W tym artykule: http://maciuch-on-software.blogspot.com/2009/03/grasp-... znajduje się całkiem zgrabny przykład refaktoringu od anemicznego modelu dziedziny do dynamicznego. Powiedzcie mi jednak - czy ktoś z Was kiedykolwiek widział, żeby pozycja faktury liczyła swój rabat? Albo kartka z fakturą dopisywała sobie pozycje? Normalnie w rzeczywistości robi to np. fakturzysta. Autor twierdzi, że w ten sposób zmniejsza liczbę zależności - ale czy rzeczywiście?
Weźmy także pod uwagę, że separacja dynamiki od danych - pozwala nam na persystencję znaczną automatyzację persystencji danych i uniezależnienie się od jej sposobu (stosunkowo prosto zmienić nam bazę danych, czy nawet ORM-a).
O co więc tak naprawdę chodzi z tym anemicznym modelem dziedziny? Ja rozumiem, że modelowanie obiektowe to nie tylko struktury danych - ale czy koniecnzie oznacza to pakowanie operacji i atrybutow w jedną klasę?Ten post został edytowany przez Autora dnia 22.12.13 o godzinie 20:07