Marcin Mroczkowski Programista JAVA/JEE
Temat: DDD - Problem z tworzeniem agregatów.
W trakcie pracy nad modelem domenowym natrafiłem na dość irytujący problem. Mianowicie, nie udaje mi się dla specyficznego biznesu poprawnie zamodelować agregatów.Wyobraźmy sobie system to obsługi paczek pocztowych. Oprócz oczywistego składowania paczek, biznes wymaga, żeby utworzyć kategorię paczek. Kategoria paczki wyraża jakie cechy może mieć paczka, żeby należeć do danej kategorii. Każda kategoria narzuca swoje limity rozmiarów w trzech wymiarach. Algorytm jest prosty, bierzemy najdłuższy rozmiar paczki i każda kategoria ma swój maksymalny rozmiar, system zawsze powinien wybierać możliwie najmniejszą kategorię. Biznes chce, żeby system miał możliwość edycji kategorii, zmiany jej rozmiaru, lub po prostu wyrzucanie, czy dodawanie nowych.
Zaczynamy modelowanie, pierwsze i oczywiste to agregat "Paczka", zawiera ona wszystkie cechy paczki, co kluczowe rozmiary to też cecha paczki.
No to teraz wprowadźmy kategorie. Jako, że kategoria nie jest składnikiem Paczki i musi być niezależnie modyfikowana, to tworzymy nowy agregat "Kategoria", który zawiera jej parametry w tym jej maksymalny rozmiar.
Wszystko wygląda na pierwszy rzut oka super, schody się zaczynają, kiedy zaczynamy implementować te agregaty. Modelowanie DDD ma swoje twarde zasady, wśród nich są te trzy:
- mamy dążyć do logiki w obiektach biznesowych, unikać anemicznej logiki jak ognia
- wszystko co zawiera agregat, musi być jego własnością, jak kasujemy agregat wszystkie wewnętrzne obiekty też
- agregaty powinny być wewnętrznie spójne, tzw. powinny zawierać biznesowe integrity constraint
W powyższym przykładzie nie da się tych rzeczy pogodzić. Jeśli umieścimy Kategorię w Paczce, to złamiemy zasadę 2. Jeśli zrobimy je oddzielnie to jesteśmy zmuszeni wypruwać i wciskać dane do agregatów, a cały ten biznes implementować w serwisie. Jakby tego było mało agregat nie może sprawdzić swojej spójności biznesowej, bo nie wie jak przydzielić sobie kategorię.
Czy jest może jakieś narzędzie w DDD, które przeoczyłem ? Czy może na opak interpretuje zasady modelowania DDD ? Przykład jest dość złośliwy, ale nie wierzę, że najlepsze co się da zrobić to anemiczna logika serwisowa.