Вчимося проектувати на основі предметної області (ddd domain driven design)

1. Введення

У даній статті я хотів би розповісти про ці трьох буквах, які постійно перебувають на слуху, але для багатьох є таємницею за сімома печатками, а так само привести ряд ресурсів, з якими непогано було б познайомитися при бажанні продовжити розвиток в проектуванні на основі предметної області ( DDD: Domain Driven Design).

2. Так чому ж DDD?

Є кілька шаблонів реалізації предметної області (Domain Logic) або бізнес-логіки (Business Logic):

1) Table Module - являє собою об'єкт, в єдиному екземплярі, що обробляє бізнес логіку для всіх записів в таблиці бази даних, або уявлення.

2) Transaction script - організовує взаємодію з бізнес-логікою посредствам процедур, які приймають запити з рівня уявлення.

3) Domain Model - безпосередньо, об'єктна модель предметної області, що включає в себе як поведінка, так і дані.

На основі цього зробимо невеликий висновок про те, що даний шаблон ( "Модель предметної області") найкраще підійде, наприклад, для такої непростої області, як фінансовий ринок. Більшість, створюваного в наші дні програмного забезпечення призначене для різних потреб бізнесу, отже якісь абстрактні, узагальнені рішення знаходять своє місце на ринку (з досить таки високою конкуренцією) все рідше і рідше. До чого я пишу про все це? Тому що DDD - це не тільки якісне проектування, але так само і показовий приклад того, як слід виділити предметну область в програмному забезпеченні, для того, щоб простіше долати труднощі, часті зміни, проблеми комунікації та інші недуги предметної області, замість того щоб розробляти потворну, складну для розуміння систему, в якій будь-яка зміна або виправлення здатне обрушити на вас лавину все нових і нових дефектів.

DDD ні в якому разі не заперечує спадщини практик розробки, таких як:

DDD лише доповнює їх. Пошук підходящої моделі і абстракцій в складних сценаріях вимагає значних знань в сфері об'єктно-орієнтованого підходу, і достатнього досвіду застосування різних принципів, шаблонів і практик, а не просто DDD, як може здатися.

3. З чого можна почати?

Якщо мій "нудний PR" проектування на основі предметної області (DDD) вас до сих пір не втомив, то думаю нам варто продовжити, якщо ж інакше, то подивіться хоча б посилання на матеріали.

Першою книгою пролити світло на DDD для широкої публіки була так звана "Велика синя книга" (мем. BBB: Big Blue Book): Domain-Driven Design: Tackling Complexity in the Heart of Software byEric Evans (на російську мову поки не переведена).

Книга задоволена докладно розповідає про те, що з себе представляє DDD, і всі пов'язані аспекти, такі як: мова предметної області, шаблони, практики проектування, рефакторинг, моделювання, як зробити розробку гнучкої і багато іншого. Але навіть якщо ви ознайомитеся з усіма питаннями, піднятими в книзі (що є не зовсім простим заняттям), ви зверніть увагу, що питання розглядаються тільки з теоретичної точки зору, залишаючи весь простір для практики (книга не прив'язана до конкретної платформі розробки). Для більшості з нас читання чистої теорії, без підкріплення практичними прикладами не подобається, в зв'язку з цим можна звернути свою увагу на скорочену (і вільну для доступу) версію цієї книги, підготовлену порталом InfoQ. Domain Driven Design Quickly.

Є так само кілька хороших презентацій Еріка Івенса (Eric Evans), з яких можна почати:

На порталі InfoQ можна знайти безліч інших презентацій, статей та інтерв'ю. присвячених DDD.

Отже, з теоретичною частиною ми розібралися, де ж можна знайти приклади практичного застосування DDD? Відмінною книгою для цього є .NET Domain-Driven Design with C #, Problem - Design - Solution написана Tim McCarthy.

У цій книзі ви наёдете практичні приклади:

1) Як проходить процес проектування і розробки, від визначення вимог, до написання коду

2) Як організовувати архітектурні шари в своїх рішеннях

3) Як застосовувати шаблони і практики DDD

4) Як побудувати невеликий каркас для DDD

5) Як ізолювати домен предметної області від моделі

6) Сучасні патерни представлення даних і взаємодії з ними (Model-View-ViewModel) в такому середовищі як WPF (так само застосовні до Silverlight) в практики.

Ця книга - відмінний практикум по DDD, що містить дуже широкий пласт ідей. Починається книга з розробки вимог, а закінчується реалізацією промислового застосування, вихідні коди якого доступні на Codeplex.

Вся концепція книги побудована на 3 книгах-стовпах DDD:

У цій книзі поверхнево розглянуті всі питання, техніки і патерни, застосовувані в DDD, все приклади супроводжуються кодом, що спрощує розуміння. Книга чудова, проте російський переклад підкачав, тому, рекомендую прочитати оригінал.

Однак DDD - це не просто практичні рішення або шаблони, це мислення і підхід, і є безліч нюансів, які необхідно враховувати, якщо ви вирішили слідувати DDD, таких як: фокусування на високий пріоритет віддається моделі, вироблення мови предметної області, контекст моделі, процес моделювання, поділ знань, рефакторинг, стратегічний дизайн і т.д ... це є основною причиною ознайомитися з книгою Еріка Івенса, так як вона дасть вам більш об'ємне і глибоке розуміння філософії DDD.

DDD не прихильність до конкретної технології, проте дотримуватися DDD буде не так просто, без наявності хороших засобів і практик у вашому арсеналі, таких як: TDD-фреймворк, ORM, можливість реалізації незалежності зберігання (Persistence Ignorance), IoC-контейнер (Inversion of Control ), і можливостей AOP (аспектно-Орієнтованого Програмування), звичайно не означає, що всі ці інструменти нам знадобляться, однак вони наблизять нас до реалізації DDD на практиці. Практична цінність цих коштів у тому, що вони дозволяти ізолювати модель предметної області, що є ключовою метою DDD. Книга Джиммі Нильссона може познайомити вас з можливостями і видами даних інструментів. Джиммі так само показує як використовувати шаблони реалізації корпоративних додатків. і будувати, завдяки їм, незбиране рішення, засноване на сучасних інструментах і практиках.

Деякі реалізації шаблонів DDD на Ruby On Rails:

4. Актуальні питання DDD

C DDD так само тісно пов'язана така тема, як DDDD: Distributed Domain Driven Design (Розподілений DDD). DDDD - це DDD в розподілених сценаріях. В даний час існує не так багато ресурсів, присвячених DDDD, в декількох словах про DDDD: покриває проблему реалізації повідомлень і DDD, поділ команд і запитів (Command Query Separation (CQS)) допомагає реалізувати даний підхід. Грег Янг (Greg Young) повідомив, що готує книгу, присвячену DDDD.

SOA і DDD - це ще одна об'ємна тема, часто обговорювана Udi Dahan

5. DDD шаблони, концепції і поняття

Ось деякі з них:

6. Приклади додатків

Знайти хороші приклади реалізації DDD дуже складно, не тому що їх не існує, а тому що реальна сила DDD реалізується в додатках, що використовуються в досить складних областях, і, як правило, є комерційними проектами. Однак можна знайти кілька непоганих проектів, в яких можна простежити деякі ідеї реалізації шаблонів DDD.

1) Додаток Тіма Маккарті його проект. описаний в деталях в його книзі. Він описує не тільки застосування шаблонів, але так само акцентує увагу в розробці моделі предметної області з точки зору DDD.

Проект так само цікавий тим, що побудований на .NET 3.5 і демонструє всю силу сучасного підходу зв'язування даних з моделлю предметної області (data binding, реалізація шаблону MVVM). Так само його стиль примітний умінням виділяти абстракції і повторно використовуваний код.

2) Наступний проект, на який слід звернути увагу - це додаток розроблене Yves Goeleven. створення цього додатка описано в його блозі (так само присвяченому основним концепту DDD). Іншим його додатком є ​​DDD-каркас. Слід звернути увагу на його реалізацію взаємодії шаблонів Repository і Specification.

3) Billy McCafferty розробляє приголомшливий open source фреймворк, сфокусований на DDD, під назвою S # arp Architecture. У нього є дуже хороший опис. що включає в себе опис шаблонів і підходів, укладених в фреймворку. Фреймворк націлений на розробку ASP.NET MVC додатків із застосуванням NHibernate.

4) C # Domain-Driven Design sample application (ndddsample). це додаток, що розробляється Джиммі Нільссон, демонструє розбиття програми на ключові шари з точки зору DDD. Так само демонструється практичне застосування шаблонів building block в предметної області перевезення вантажів, описаної в його книзі.

Цей проект заснований на спільній роботі компанії Еріка Івенса "Domain Language" і шведської консалтингової компанії "Citerus".

Мета цього проекту:

  • Показати практичне застосування використання DDD із застосуванням .NET.
  • Використання актуальних утиліт, технологій і методологій розробки в області .NET, обговорюваних ALT.NET -коммуніті.
  • Привести практичні приклади реалізації типових DDD додатків.
  • Показати спосіб реалізації DDD на конкретній платформі, що дозволить без праці здійснити те ж саме на будь-який інший платформі.
  • Допомогти у виборі реалізованих практик. Різні підходи дозволять спільноті обговорити їх і вибрати відповідний для конкретної реалізації.

7. Ресурси по Domain Driven Design

8. Висновок

Якщо ви зацікавлені в розширенні ваших "об'єктно-орієнтованих горизонтів" в складних корпоративних системах і вивченні нових способів розробки і проектування, то DDD - саме те що потрібно.

Це цікаво: