Model domeny - wiele podobnych klas.

0

Hej,

nie jestem do końca pewien w jaki sposób powinienem zaprojektować klasy w moim problemie.

Jest pole uprawne (Farmland), na którym można wykonywać wiele czynności/operacje (Operation). I teraz sprawa trochę się komplikuje, są dwie możliwe operacje: MechanicalOperation, która nie używa żadnych dodatkowych materiałów oraz MaterialOperation (która do wykonania zużywa jakieś tam materiały, zawiera w sobie listę zużytych materiałów). Dodatkowo dochodzą strategie obliczania kosztów. Każda czynność Operation ma swój koszt, a w przypadku gdy jest to MaterialOperation dodatkowo musi zostać obliczony koszt zużytych materiałów.

Obecnie mam to zaimplementowane w ten sposób, że Operation jest klasą abstrakcyjną z paroma zaimplementowanymi metodami biznesowymi wspólnymi dla wszystkich operacji. Następnie MechanicalOperation oraz MaterialOperation dziedziczą po Operation. MechanicalOperation wprowadza swoje metody biznesowe (m. in. obliczanie kosztów materiałów na podstawie dostarczonej strategii). Co istotne MechanicalOperation nie może być czynnością, czynnością jest np pryskanie SprayingOperation, sianie SeedingOperation, tutaj jest przestawiany tylko jeden typ wyliczeniowy type. Więc w związku z tym również powinna być klasą abstrakcyjną? W jaki sposób ma być to utrwalone w bazie danych? Wszystko w jednej tabeli i wykorzystać @Inheritance(strategy = InheritanceType.SINGLE_TABLE) w encji Operation? Czy rozdzielić to na operację materiałowe MaterialOperation i mechaniczne MechanicalOperation? Nie wiem jak zaprojektować to aby było elegancko i dobrze. Moje encje domenowe nie są anemiczne.

0

A dlaczego chcesz utrwalać Operations w bazie? Jeśli dobrze zrozumiałem, to te operacje zmieniają stan Farmland i Ciebie chyba interesuje utrwalanie stanu Framland, a nie tego jakie operacje zostały na nim wykonane? Czy może chcesz przechowywać zdarzenia, że operacja miała miejsce na danym polu na jakieś inne potrzeby?

-- edited:
O ile dobrze zrozumiałem, to unikałbym jednak dziedziczenia i starał wypracować model, w którym mógłbym na zasadzie konfiguracji dorzucać nowe typy operacji i zasobów, które są wykorzystywane w operacjach.

Tam te diamenciki to obydwa czarne, tzn. kompozycja, bo jak usuwamy Farmfield, to też znikają operacje na nim wykonane i użyte zasoby, np. usuwamy Farmfield z ewidencji, to znika wszystko powiązane z tym farmfieldem.

0

Dziękuję za odpowiedź. Potrzebuję przechowywać listę operacji związanych z danym polem. Np. potem będę mógł tworzyć raporty roczne itd. Czyli sugerujesz aby nie było konkretnych klas typu SeedingOperation, SprayingOperation? Tylko operować na jeden klasie Operation i ifem sprawdzić czy jest to Operacja z użyciem materiałów (sprawdzić OperationSpec i czy są Resource)?

0

To jedna z możliwości. Możesz też zrobić sobie - zamiast jednej kompozycji - dwie. Wówczas nie będziesz potrzebował sprawdzać if'em, tylko będziesz iterował po właściwej kolekcji.
Pewnie gdzieś z tyłu głowy masz jakąś wizję odnośnie tego co będziesz chciał robić na takim modelu. Spróbuj się zastanowić, która wersja będzie "lepiej" wspierała Twoje wymagania.

Nie wiem co robisz, ale wygląda to na jakiś rodzaj ewidencji i może zamiast patrzeć Farmfield -> Operation, to może trzeba myśleć w kategorii wpisów ewidencyjnych, np. "Księga ewidencyjna", "Wpis ewidencyjny" etc., czyli w terminach, którymi posługuje się użytkownik końcowy (urzędnik? rolnik?).

1 użytkowników online, w tym zalogowanych: 0, gości: 1