Практически пример за DDD: Избягвайте организацията на техническия код

В днешната глава от моето пътуване, управлявано от домейн дизайн, искам да се потопя в това как структурираме нашия код. Тази тема заема специално място за мен. Виждате ли, когато кодът расте, той лесно може да се превърне в объркана бъркотия, което го прави труден за четене, труден за управление и труден за всеки да си хване главата. И ако има нещо, което научих, то е, че ако нашият код не отразява реалния свят, той пропуска марката. В крайна сметка голяма част от DDD е свързана със създаването на модели, които всеки може да разбере, от разработчиците до заинтересованите страни.

През последните 15 години успях да приложа DDD към различни проекти и да опитам различни подходи. Някои не бяха най-добрите, докато други удариха ноктите на главата. Ако сте следили моите писания, ще знаете, че съм голям в чистия код. За мен обърканият код, пълен с объркващи съкращения и вътрешен жаргон, е пълен кошмар. Това е нещо, което ме подлудява.

Борбата с техническото структуриране: Къде често грешим

За да започнем нещата, нека се задълбочим в един повтарящ се въпрос: Защо разработчиците често клонят към структуриране на кода си около технически аспекти, вместо да се фокусират върху домейна?

Вярвам, че тази склонност произтича преди всичко от обектива на инженер. Това е начинът, по който са били обучени да виждат системите. И все пак, в основата си, домейн-ориентираният дизайн се стреми да поправи това несъответствие. DDD насърчава всички участващи - не само разработчиците, но и всички заинтересовани страни - да възприемат общ език и визия за системата. Това споделено разбиране в идеалния случай трябва да бъде отразено в начина, по който структурираме нашия код, като го приведем в тясно съответствие с модела на домейна.

Добавяйки масло в огъня, многобройните уроци и дори някои видни рамки защитават тази техническа перспектива. Забележителен пример е рамката ASP.NET MVC на Microsoft.

За контекст, ето типична структура на папки на ASP.NET MVC:

- Controllers
    - HomeController.cs
    - AccountController.cs
- Models
    - HomeModel.cs
    - AccountModel.cs
- Views
    - Home
        - Index.cshtml
    - Account…