Kiedy pracuję z moim rozumieniem Domain Driven Design, stwierdzam, że mam regułę, która wydaje się działać, chociaż chciałbym zobaczyć, czy jest ona przesadna, a także chciałaby zobaczyć inne perspektywy tej samej sytuacji.DDD Kiedy należy utworzyć obiekt domeny i obiekt trwałości zamiast używać obiektu trwałości jako obiektu domeny?
Moje pytanie brzmi następująco: "Kiedy model domeny i model trwałości powinny znajdować się w osobnych obiektach?" Moim językiem z wyboru jest obecnie Java i korzystam z modelu repozytorium Spring Data.
Widzę trzy główne odpowiedzi na moje pytanie.
- Zawsze używaj oddzielnych obiektów domeny z obiektów trwałości.
- Używaj oddzielnych obiektów domeny tylko wtedy, gdy umieszczanie metod domenowych (zachowań) na obiektach trwałości jest niepraktyczne.
- Użyj obiektów trwałości jako obiektów domeny we wszystkich przypadkach.
W celu zadawania pytań na temat DDD stwierdzam, że muszę użyć przykładowego kontekstu ograniczonego, ponieważ nie wiem jeszcze wystarczająco dużo o DDD, aby zadać bardziej abstrakcyjny sposób.
Oto moja ilustracyjny ograniczony kontekst: że mam system Kodyfikacyjnej Prawa z następującymi zasadami działalności:
- Każda ustawa o księgach musi być sklasyfikowany.
- Każde prawo ma identyfikator składający się z dwóch części, prefiksu numeru kodyfikacji i sufiksu koalonacji kodyfikacji. (Przykład: 100-0100, 599-2030).
- Istnieje wiele jurysdykcji prawnych, które korzystają z systemu kodyfikacji prawa i powinny być w stanie tworzyć własne koalicje, ale prefiksy kodyfikacji mają charakter globalny i muszą być takie same we wszystkich jurysdykcjach, aby ułatwić ogólną porównywalność.
- prefiksy numerów kodyfikacyjnych są pogrupowane w szerokie kategorie kodyfikacji. Kategorie ujednolicenie mieć zakres, na przykład numer 100-199, 200-299, 700-799, itp
Wyrażając to ograniczone kontekście jako model trwałości I mają następujące:
table: codification
fields: chart_code, prefix, coassign, codification_category
table: codification_chart
fields: chart_code, jurisdiction_description
table: codification_category
fields: category, low_category_number, high_category_number, description
table: global_codification
fields: prefix, coassign, codification_category
Wiem, że powinienem zacząć od modelu domeny. Mam modelu Trwałość i model domeny
w moim modelu domeny mam trzy domeny obiektów
public Codification {
private String prefix, coassign;
codificationCategory codificationCaegory; // an enum type
public Codification(...) { // set private vars }
// getters for private variables
}
public CodificationChart {
private List<Codification> chartCodifications = new ArrayList<>();
private String chartCode;
// public constructor to initialize private variables
// getters for private variables
public Codification addCodificationToChart(Codification){...}
public void removeCodificationFromChart(Codification){...}
public boolean checkCodificationInChart(Codification){...}
}
public enum CodificationCategory {
CIVIL, CRIMINAL, PROPERTY, CORPORATE, FAMILY, CONSUMER, ETHICS, BANKRUPTCY;
}
ORM obiektów:
JPA Mappings of the tables mentioned earlier with the "Entity" suffix added to their table names.
They are omitted for brevity.
Each one contains getters and setters like JPA Pojos do.
If someone asks for the Persistence objects code I will post it.
jedyny punkt, w którym moi obiektów domeny wiedzieć o Model trwałości znajduje się w moim obiekcie fabrycznym CodificationChartFactory
, który ma interfejsy repozytoriów, których używam do interakcji z wymienionymi wcześniej obiektami ORM. Ta fabryka jest jedyną częścią domeny, która używa repozytoriów trwałości, a więc jedyną częścią, która współdziała z warstwą trwałości.
Czy tworzenie osobnego modelu domeny jest tutaj marnotrawnym wysiłkiem? Widzę, jak mogę umieścić moje zachowania w Kodzie Codification na obiekcie Persistence. Po prostu źle się dzieje, gdy zachowujemy te zachowania na obiekcie trwałości, którego jedynym zadaniem jest pobranie rekordu z bazy danych.
Zdecydowanie mogę sprostować.
Dzięki za perspektywy. Trochę bałam się mieszać domenę i wytrwałość, ponieważ myślałem, że inni profesjonaliści tego nie robią. Spróbuję i zobaczę, jak mi się podoba. Zgadzam się, że oddzielenie w przypadku używania JPA zdecydowanie wydaje się być kolejną warstwą złożoności, która nie jest absolutnie konieczna. Podoba mi się, w jaki sposób odpowiedziałeś bardziej na utrzymywanie rzeczy razem. Chciałbym zobaczyć odpowiedź, w której ktoś opowiada się za oddzieleniem ich, aby przekonać się, czy jest jakikolwiek dobry powód, aby to zrobić w przypadku korzystania z JPA. –
To jest dokładnie to, na czym stoję, dzięki Augusto za to, że jest lepszy niż ja :) Nie wiem też wiele o Javie, ale nie ma alternatywy dla "natrętnych" adnotacji JPA, w których szczegóły mapowania byłyby uzgadniany z jakimś plikiem "płynnego mapowania" (jak na przykład dawna konfiguracja XML ORM, ale w kodzie)? Bardzo pomogłoby to w wytrwałości w ignorancji IMO. – guillaume31
@ guillaume31 Hibernate nadal obsługuje mapowania XML (wiele lat temu miałem kolegów, którzy preferowali to podejście, więc nie byłoby żadnego statycznego powiązania między kodem produkcyjnym a mapowaniem). Nie znam żadnego rozszerzenia, które pozwoliłoby zdefiniować mapowanie w ładnym DSL ... ale może to być kwestia budowania jednego (niestety, byłoby to specyficzne dla ORM). Ostatnio ... Nigdy nie widziałem aplikacji, w której dostęp do danych był w 100% przezroczysty w Javie, zawsze jest to nieszczelna abstrakcja. – Augusto