Domena w kontekście DDD jest kluczem. Bez niej całe podejście do projektowania sterowanego domeną nie ma sensu. Dlatego też bardzo ważne jest abyśmy ją odkryli i poznali. Z tą wiedzą będzie można przejść do dalszych etapów DDD oraz utworzyć model kodu, który nie będzie przypominał kodu spaghetti.
Cześć
Jest to drugi wpis z serii o DDD. Dziś zdefiniujemy domenę oraz naprowadzę Cię jak możesz ją poznawać.
W dzisiejszym artykule:
Domena – czym jest?
Aby odkryć domenę na początku dobrze byłoby ją zdefiniować. Według słownika PWN
zakres zainteresowań lub działalności jakiejś osoby, instytucji lub dziedziny wiedzy
– Słownik PWN
A według bardziej programistycznych forów (SO i SE):
Domena odnosi się do konkretnego tematu, dla którego projekt jest opracowywany. Jest przestrzenią problemową, którą należy rozwiązać projektując oprogramowanie.
Czyli w prostych słowach – domena reprezentuje problem do rozwiązania.
Rozważmy metaforę producenta statków. Statek może składać się z setek tysięcy części, a pracownicy pracujący nad jego rozwojem nie mają pełnego kontekstu całej produkcji wymaganej do budowy statku ze względu na jego skalę. Pracownicy koncentrują się na jednym konkretnym obszarze statku i wykonują go, podczas gdy inni pracownicy pracują równolegle na innych częściach. Postęp zachodzi jednocześnie. Pracownik, który pracuje z tyłu statku, nie musi dokładnie wiedzieć, jak postępują prace z przodu, ponieważ wykracza to poza jego zakres i nie wpłynie na wykonywaną przez niego pracę.
Są jednak osoby, które mają za zadanie wiedzieć jaki jest dokładny stan produkcji statku z szerszej perspektywy. Osoby te mają lepszy przegląd pełnego postępu, ale nie muszą znać dokładnej szczegółów implementacji, ponieważ do tego wymagana jest konkretna wiedza. Są również osoby, które znają się doskonale właśnie na szczegółach, jak np. budowa kadłubu czy instalacja silników. Na każdym poziomie wymagana jest nowa wiedza, aby zrozumieć granice wykonywanej pracy i jak ją wykonać.
Jak więc poznać domenę? Angażując specjalistów, ekspertów danej dziedziny, ludzi, którzy faktycznie mają wiedzę o tym, dlaczego podejmujemy decyzje, które podejmujemy. Są to ludzie, którzy będą przekazywać wiedzę, która ostatecznie będzie odzwierciedlać podstawowe elementy domeny, aby stworzyć dobre oprogramowanie. Aby domena była dobrze odwzorowana w kodzie musisz ją poznać, zrozumieć i zamodelować.
Zauważ, że produkcja statku nie jest trywialnym procesem. Składa się z wielu odrębnych domen (dziedzin). Na pewno każdy z elementów jest istotny jednak często bywa tak, że niektóre domeny są ważniejsze od innych. Z tego powodu domeny można podzielić na trzy rodzaje.
Rodzaje domen
W przypadku złożonych domen – a zazwyczaj takie chcemy odkrywać i modelować – często okaże się, że tylko konkretna subdomena jest istotna z biznesowego punktu widzenia. Inne również są ważne i być może bez nich nasza główna domena nie miałaby sensu. Nie są one jednak aż tak istotne i nie musimy wkładać w nie tyle uwagi i poświęcenia.
Domeny możemy podzielić na 3 rodzaje:
- główna (core domain) – najważniejsza część systemu. Dzięki niej biznes odnosi sukces i ma przewagę nad konkurencją. Odpowiada na pytania dlaczego powstaje (powstał) dany system i dlaczego go nie kupiliśmy.
- wspierająca (supporting domain) – zapewnia funkcje wspierające domenę główną. Nie zapewnia żadnej przewagi konkurencyjnej bez obecności core domain. Nie istnieje gotowy produkt by je dostarczyć ze względu np. na specyfikację naszej domeny głównej.
- generyczna (generic domain) – zapewnia ważne funkcje dla działania biznesu ale nie są one unikalne i istnieją już gotowe rozwiązania. Np. wysyłka maili czy też usługa monitorowania.
Jak odkrywać domenę?
Nie jestem ekspertem w tej działce. Dlatego lepiej będzie jak po prostu powiem krótko o istnieniu czegoś takiego jak Event Storming. Jest to metoda odkrywania i konkretyzowania informacji o domenie biznesowej. Jest chyba najpopularniejszą formą odkrywania domeny. Wymaga zaangażowania co najmniej kilku osób – ekspertów. Ekspertów znających się na problemie jaki rozwiązujemy od strony biznesowej. Przy ich pomocy jesteśmy w stanie utworzyć mapę problemu jaki rozwiązujemy. Rozpisać występujące zdarzenia, przypisać ich aktorów oraz rozdzielić na odpowiednie subdomeny.
Przy pomocy event stroming’u jesteśmy w stanie:
- zrozumieć domenę
- poznać język biznesowy
- zidentyfikować problemy (znane lub nieznane do tej pory)
- znaleźć subdomeny
Więcej na temat Event Stromingu możesz przeczytać w tym artykule.
Podsumowanie
Dlaczego odkrywanie domeny jest ważne? Po pierwsze – rozumiemy działania biznesu, znamy kontekst, wiemy dokąd zmierzamy. Dwa, jesteśmy w stanie podzielić problem na mniejsze problemy a co za tym idzie zrównoleglić prace. Trzy – po podzieleniu problemu na mniejsze możemy nadać im odpowiedni priorytet decydując co jest najistostniejsze dla biznesu a co można outsourcować z zewnątrz.
Źródła:
Za tydzień
Zajmiemy się definicją bounded contextów oraz tego jak to się ma do subdomen.