5 najlepszych narzędzi do projektowania opartego na domenie

May 09 2023
Od pozyskiwania zdarzeń do platform testowych: podnieś poziom DDD dzięki tym 5 najwyższej klasy narzędziom (i odrobinie Bita)
Jako programiści często chcemy budować systemy oprogramowania, które są zgodne z modelem domeny i spełniają wymagania biznesowe. I tu wkracza DDD.

Jako programiści często chcemy budować systemy oprogramowania, które są zgodne z modelem domeny i spełniają wymagania biznesowe. I tu wkracza DDD.

Domain-driven design (DDD) to metodologia tworzenia systemów oprogramowania, która kładzie duży nacisk na dostosowanie modelu domeny do implementacji. Koncentrując się na domenie problemowej i tworząc wspólne zrozumienie odpowiednich koncepcji i relacji, programiści mogą tworzyć oprogramowanie, które lepiej odzwierciedla potrzeby interesariuszy i lepiej dostosowuje się do zmieniających się wymagań biznesowych.

Aby wspierać DDD, programiści mogą korzystać z różnych narzędzi i technologii, które pomagają w takich zadaniach, jak modelowanie domen, mapowanie danych i testowanie. W tym artykule przyjrzymy się niektórym najlepszym dostępnym narzędziom i platformom do obsługi DDD. Od pozyskiwania zdarzeń i CQRS po narzędzia do modelowania domen i struktury ORM — omówimy szereg narzędzi i podkreślimy ich kluczowe zalety oraz przypadki użycia. Niezależnie od tego, czy jesteś nowicjuszem w DDD, czy doświadczonym praktykiem, czytaj dalej, aby odkryć najlepsze narzędzia do tworzenia systemów oprogramowania opartych na domenach.

Czym jest model domeny i jak możemy go wykorzystać?

Kup najpierw, jeśli jesteś nowy w DD, szybko zwróćmy się do różowego słonia w pokoju: czym jest „model domeny”?

Model domeny jest centralną koncepcją w projektowaniu opartym na domenie (DDD) i reprezentuje rdzeń systemu oprogramowania. Jest to koncepcyjny model domeny świata rzeczywistego, do którego system oprogramowania ma się odnosić, i definiuje strukturę danych oraz zachowanie systemu. Model domeny to wspólne rozumienie dziedziny problemu przez wszystkich interesariuszy, w tym ekspertów biznesowych, programistów i użytkowników.

Ten model składa się z:

  • Jednostki, które są obiektami o unikalnych tożsamościach, które mają cykl życia.
  • Agregaty, które są klastrami powiązanych obiektów, które tworzą granicę spójności transakcyjnej.
  • Obiekty wartości to obiekty, które nie mają unikalnej tożsamości i są zdefiniowane przez ich właściwości.
  • Usługi domenowe to operacje lub algorytmy, które nie są specyficzne dla żadnej pojedynczej jednostki lub obiektu wartości.

Pomyślmy o przykładzie

Zawsze lubię używać praktycznych przykładów, aby zrozumieć złożone koncepcje, więc powiedzmy, że budujemy platformę e-commerce, a jednym z wymagań jest umożliwienie użytkownikom składania zamówień na produkty.

W projektowaniu opartym na domenach zaczynamy od stworzenia modelu domeny, który reprezentuje odpowiednie koncepcje i relacje w domenie problemowej.

Jedną z kluczowych encji w tej domenie jest encja Order, która reprezentuje indywidualne zamówienie złożone przez użytkownika. Encja Order miałaby takie właściwości, jak OrderID , CustomerID , lista zamówionych produktów , łączna cena i status (np. oczekujący, zrealizowany, anulowany).

Inną encją w tej domenie może być encja Produkt, która reprezentuje produkt dostępny do zakupu. Encja Product może mieć takie właściwości, jak ProductID , nazwa , opis , obraz , cena i lista kategorii .

Agregaty to klastry powiązanych obiektów, które tworzą granicę spójności transakcyjnej, więc możemy utworzyć agregat Zamówienie zawierający encję Zamówienie wraz z encjami powiązanymi, takimi jak encja Produkt i encja Klient. Zapewniłoby to, że wszelkie zmiany w tych podmiotach są przeprowadzane w sposób spójny pod względem transakcyjnym.

Możemy również tworzyć obiekty wartości reprezentujące pojęcia, takie jak adresy wysyłkowe i adresy rozliczeniowe, które nie mają unikatowych tożsamości, ale są definiowane przez ich właściwości.

Na koniec możemy utworzyć usługi domeny, takie jak ShippingService, które byłyby odpowiedzialne za obliczanie kosztów wysyłki i aktualizowanie encji Order o odpowiednie informacje o wysyłce.

Ogólnie rzecz biorąc, ten model domeny pomaga nam zrozumieć kluczowe koncepcje i relacje w domenie problemowej oraz zapewnia podstawę do wdrożenia platformy e-commerce. Dopasowując implementację do modelu domeny, możemy stworzyć system, który jest bardziej elastyczny, łatwiejszy w utrzymaniu i reaguje na zmieniające się wymagania biznesowe.

Przyjrzyjmy się teraz niektórym narzędziom, które mogą nam w tym pomóc.

Event Sourcing — Święty Graal DDD

Pozyskiwanie zdarzeń to technika używana do implementacji koncepcji DDD, takich jak agregaty, encje i obiekty wartości. Dzięki pozyskiwaniu zdarzeń przechowujemy wszystkie zmiany wprowadzone w systemie jako sekwencję zdarzeń, a nie tylko bieżący stan systemu. W ten sposób możemy zrekonstruować stan systemu w dowolnym momencie, co jest niezwykle potężne. To jak posiadanie wehikułu czasu dla twojego oprogramowania!

Kontynuujmy z naszym przykładem platformy e-commerce.

Załóżmy, że chcemy śledzić zmiany w encji Zamówienie w czasie. W przypadku pozyskiwania zdarzeń zamiast bezpośredniego aktualizowania encji Zamówienie tworzymy serię zdarzeń reprezentujących zmiany stanu Zamówienia. Każde zdarzenie reprezentuje dyskretną zmianę stanu jednostki Zamówienie i jest przechowywane w dzienniku zdarzeń.

Załóżmy na przykład, że użytkownik składa zamówienie na produkt. Zamiast bezpośrednio aktualizować encję Order o szczegóły nowego zamówienia, tworzymy zdarzenie OrderPlaced, które zawiera identyfikator zamówienia, identyfikator klienta, listę zamówionych produktów i cenę całkowitą. Następnie dołączamy to zdarzenie do dziennika zdarzeń.

Później, jeśli użytkownik zaktualizuje swoje zamówienie, dodając lub usuwając produkty, tworzymy zdarzenie OrderUpdated, które zawiera OrderID i zaktualizowaną listę produktów, i dołączamy je do dziennika zdarzeń. Jeśli zamówienie zostanie anulowane, tworzymy zdarzenie OrderCanceled, które zawiera OrderID i przyczynę anulowania, i dołączamy je do dziennika zdarzeń.

Korzystając z pozyskiwania zdarzeń, możemy odtworzyć stan encji Zamówienie w dowolnym momencie, odtwarzając zdarzenia w dzienniku zdarzeń. Możemy również użyć dziennika zdarzeń do audytu zmian w encji Zamówienie i do tworzenia raportów przedstawiających historię zamówienia.

Używając pozyskiwania zdarzeń do przechwytywania zmian stanu tych obiektów, możemy zapewnić, że nasze wdrożenie oprogramowania pozostaje zgodne z modelem domeny.

Załóżmy na przykład, że nasze Zamówienie jest w rzeczywistości agregacją, która składa się z co najmniej jednej encji OrderLine i obiektu wartości ShippingAddress. Korzystając z pozyskiwania zdarzeń, możemy uchwycić każdą zmianę stanu w agregacji Zamówienie jako serię zdarzeń, takich jak OrderPlaced, OrderUpdated i OrderCanceled. Zdarzenia te można następnie wykorzystać do odtworzenia stanu agregatu Zamówienia w dowolnym momencie, zapewniając, że nasze wdrożenie oprogramowania dokładnie odzwierciedla model domeny.

Za pomocą Bit możesz utworzyć składnik, który hermetyzuje implementację pozyskiwania zdarzeń, w tym magazyn zdarzeń, procedury obsługi zdarzeń i inne odpowiednie składniki. Ten bit można następnie udostępnić innym zespołom, które z łatwością mogą go ponownie wykorzystać we własnych projektach. Używając Bit do tego celu, możesz zapewnić spójność implementacji w różnych projektach i zespołach. Może to być szczególnie cenne w dużych organizacjach, w których wiele zespołów programistycznych pracuje nad różnymi projektami.

CQRS — gdy jeden rozmiar nie pasuje do wszystkich

CQRS (Command Query Responsibility Segregation) to wzorzec służący do rozdzielania operacji odczytu i zapisu w systemie. W tradycyjnych architekturach mamy jeden model, który obsługuje zarówno odczyt, jak i zapis, co może prowadzić do problemów z wydajnością i skalowalnością. CQRS rozwiązuje ten problem, oddzielając modele do odczytu i zapisu, co pozwala nam niezależnie optymalizować każdy model.

Do obsługi CQRS dostępnych jest kilka platform. Jednym z takich frameworków jest NestJS. NestJS osiąga CQRS za pomocą wbudowanej magistrali zdarzeń, która umożliwia publikowanie i subskrybowanie zdarzeń w różnych częściach aplikacji. Ułatwia to implementację programu obsługi poleceń, który zapisuje dane w bazie danych aplikacji, a także programu obsługi zapytań, który pobiera dane z bazy danych i zwraca je klientowi.

Rozdzielając te dwie obowiązki, możesz zapewnić, że Twoja aplikacja będzie bardziej wydajna, łatwiejsza do testowania i bardziej odporna na zmiany

Używanie NestJS z Bitem może jeszcze bardziej zwiększyć twoje możliwości tworzenia aplikacji DDD. Bit zapewnia sposób udostępniania i ponownego wykorzystywania komponentów kodu w różnych projektach ( przeczytaj ten artykuł , aby dowiedzieć się więcej na ten temat), umożliwiając zespołom efektywniejszą współpracę i unikanie powielania wysiłków. Tworząc współdzieloną bibliotekę komponentów NestJS, takich jak moduły obsługi poleceń i zapytań, możesz zmniejszyć ilość kodu potrzebnego do napisania i utrzymania w całym portfolio aplikacji. Ponadto Bit umożliwia wersjonowanie i śledzenie zmian w komponentach w czasie, ułatwiając zarządzanie zależnościami i zapewniając kompatybilność między aplikacjami.

Narzędzia do modelowania domeny — Wizualizuj swój model domeny

Ach, narzędzia do modelowania domen. Jeśli interesujesz się projektowaniem opartym na domenie (DDD), prawdopodobnie je znasz. Jeśli nie, nie martw się — jestem tutaj, aby pomóc Ci przyspieszyć.

Czym więc są narzędzia do modelowania domen? Krótko mówiąc, są to aplikacje, które pomagają programistom tworzyć i wizualizować model domeny ich systemu oprogramowania. Model domeny jest reprezentacją rzeczywistych koncepcji i relacji, które system oprogramowania ma modelować. Jest to zasadnicza część DDD, która podkreśla znaczenie jasnego, zwięzłego i wspólnego zrozumienia modelu domeny przez wszystkich interesariuszy.

Dostępne są różne narzędzia do modelowania domen, które mogą pomóc w tworzeniu i wizualizacji modeli domen dla systemów oprogramowania. Narzędzia te mogą być szczególnie przydatne podczas pracy z ekspertami domenowymi i innymi członkami zespołu, aby upewnić się, że model domeny jest dokładny i zrozumiały.

Jednym z przykładów takiego narzędzia jest PlantUML , które jest tekstowym narzędziem do tworzenia diagramów, które umożliwia tworzenie diagramów UML, w tym diagramów klas, diagramów sekwencji, diagramów przypadków użycia i innych, przy użyciu prostej składni. PlantUML jest open source i obsługuje wiele formatów wyjściowych, w tym PNG, SVG i PDF. Może być zintegrowany z różnymi edytorami i IDE, w tym z Visual Studio Code, poprzez rozszerzenia lub wtyczki.

Innym popularnym narzędziem jest Lucidchart , które jest internetowym narzędziem do tworzenia diagramów, które umożliwia tworzenie różnego rodzaju diagramów, w tym schematów blokowych, diagramów UML, diagramów ER i innych, za pomocą interfejsu „przeciągnij i upuść”. Lucidchart oferuje szereg szablonów i kształtów, co ułatwia szybkie tworzenie profesjonalnie wyglądających diagramów.

Ponadto niektóre edytory kodu i środowiska IDE, takie jak IntelliJ IDEA, zapewniają wbudowaną obsługę diagramów UML i innych narzędzi do modelowania wizualnego, które mogą być przydatne podczas pracy z systemami oprogramowania, które mają złożone modele dziedzin.

Ogólnie rzecz biorąc, narzędzia do modelowania domen mogą być cennym atutem podczas pracy nad systemami oprogramowania, które obejmują złożone modele domen. Mogą pomóc w tworzeniu, wizualizacji i skutecznej komunikacji modelu domeny z innymi członkami zespołu, ułatwiając tworzenie systemów oprogramowania zgodnych z wymaganiami biznesowymi.

Frameworki ORM (mapowanie obiektowo-relacyjne).

Jednym z głównych wyzwań związanych z wdrażaniem DDD jest mapowanie obiektów do relacyjnych baz danych. Tutaj z pomocą przychodzą frameworki ORM. Ramy ORM umożliwiają mapowanie obiektów na tabele w relacyjnej bazie danych. Pozwala to na pracę z obiektami w kodzie, podczas gdy framework zajmuje się interakcjami z bazą danych.

Istnieje wiele wspólnych ram ORM dla wszystkich języków. W przypadku ekosystemu JavaScript, ponieważ nie może być inaczej, masz mnóstwo do wyboru. To powiedziawszy, niektóre z najpopularniejszych opcji to Sequelize i Prisma . Struktury te zapewniają sposób mapowania obiektów na tabele w bazie danych, a także umożliwiają wysyłanie zapytań do bazy danych przy użyciu składni zorientowanej obiektowo.

Jedną z zalet używania frameworków ORM jest to, że zmniejszają one ilość kodu, który trzeba napisać. Ułatwiają również zmianę podstawowego schematu bazy danych bez konieczności modyfikowania kodu.

Jednak ramy ORM mogą również powodować pewne obciążenie wydajności i utrudniać wykonywanie złożonych zapytań (takich jak złożone JOIN i zapytania podrzędne), dlatego ważne jest, aby wybrać odpowiednią strukturę dla swojej aplikacji.

Oprócz wszystkich korzyści, jakie dodają ORM, Bit dodaje jeszcze więcej wartości, umożliwiając ponowne wykorzystanie modeli danych i ogólnego kodu w wielu projektach, które z łatwością współdzielą struktury danych. Na przykład możesz utworzyć komponent ORM, który definiuje określony model danych, a następnie użyć go ponownie w różnych częściach aplikacji. Może to zaoszczędzić czas i wysiłek, ponieważ nie trzeba wielokrotnie pisać tego samego kodu. Dodatkowo, ponieważ Bit umożliwia łatwe zarządzanie i wersjonowanie komponentów, możesz mieć pewność, że wszystkie Twoje komponenty są aktualne i odpowiadają aktualnej wersji Twojej struktury danych.

Podobało ci się to, co przeczytałeś? Rozważ subskrypcję mojego BEZPŁATNEGO biuletynu , w którym dzielę się ze wszystkimi swoją mądrością zdobytą przez dwie dekady w branży IT. Dołącz do „ The Rambling of a old developer ”!

Frameworki testowe

Jeśli chodzi o testowanie w Domain-Driven Design (DDD), ważne jest, aby upewnić się, że model domeny jest poprawny i zachowuje się zgodnie z oczekiwaniami. W tym miejscu wkraczają frameworki testowe. Twoje testy powinny w jakiś sposób opisywać model domeny, aby upewnić się, że ostateczna logika twojego oprogramowania spełnia oczekiwania.

Istnieje wiele platform testowych dostępnych dla JavaScript, z których każda ma swoje mocne i słabe strony.

Dwa bardzo popularne frameworki do testowania JavaScript to Jest i Mocha.

Jest to platforma testowa JavaScript zbudowana przez Facebooka. Zapewnia prosty i intuicyjny testowy interfejs API, ułatwiający pisanie testów dla kodu JavaScript. Jest również udostępnia takie funkcje, jak mockowanie i testowanie migawek, które mogą pomóc w pisaniu bardziej wydajnych i skutecznych testów.

Mocha to framework do testowania JavaScript, który umożliwia pisanie testów w dowolnym preferowanym stylu. Zapewnia elastyczny interfejs API, którego można używać do testowania zarówno kodu synchronicznego, jak i asynchronicznego. Mocha obsługuje również wiele formatów raportowania, co ułatwia integrację z innymi narzędziami w przepływie pracy testowej.

Korzystanie ze środowiska testowego, takiego jak Jest lub Mocha, może pomóc w wyłapywaniu błędów i upewnieniu się, że model domeny zachowuje się zgodnie z oczekiwaniami. Jednak konfigurowanie testów i upewnianie się, że zawsze je uruchamiasz, może być czasochłonne i żmudne. Tutaj Bit może pomóc.

Bit automatycznie generuje szablon testowy dla każdego tworzonego komponentu. Nie tylko to, ale etap testowania jest obowiązkowy we wszystkich głównych procesach (takich jak oznaczanie i budowanie komponentów), więc nawet jeśli nie chcesz, musisz napisać testy, aby upewnić się, że komponenty można wypchnąć i udostępniane innym programistom. Co więcej, konfiguracja Jest (lub pożądanych platform testowych) jest wykonywana automatycznie przez Bit, więc tak naprawdę nie musisz się martwić o ten krok.

Podsumowując, korzystanie ze środowiska testowego ma kluczowe znaczenie podczas tworzenia aplikacji przy użyciu zasad Domain-Driven Design (DDD). Jest i Mocha są popularnymi narzędziami do testowania aplikacji JavaScript, a użycie Bita może pomóc usprawnić proces testowania. Może to zaoszczędzić czas i wysiłek oraz zapewnić, że testy są aktualne i działają poprawnie.

Podsumowując, projektowanie oparte na domenach (DDD) to potężna metodologia tworzenia systemów oprogramowania, która koncentruje się na dostosowaniu modelu domeny do implementacji. Aby obsługiwać DDD, można korzystać z różnych narzędzi i technologii, w tym pozyskiwania zdarzeń, CQRS, narzędzi do modelowania domen, struktur ORM i platform testowych.

Ponadto Bit umożliwia zespołom tworzenie i udostępnianie komponentów obejmujących określone funkcje biznesowe, co ma kluczowe znaczenie dla tworzenia i utrzymywania złożonych aplikacji opartych na DDD. Komponentów można używać do budowania modeli domen, integracji z bazami danych i wykonywania złożonej logiki biznesowej.

Niezależnie od tego, czy dopiero zaczynasz pracę z DDD, czy jesteś doświadczonym profesjonalistą, te narzędzia i technologie mogą pomóc w tworzeniu lepszych aplikacji, które są zgodne z Twoimi potrzebami biznesowymi.

Więc śmiało, wypróbuj je i zobacz, co działa najlepiej dla Ciebie!

Ucz się więcej