SlideShare una empresa de Scribd logo
1 de 21
Домейн Дрівен Дізайн, це цибуля
Title
Data driven design (а може MVC?)
Не заморочуємся щодо бази даних
ЮІ повинно якомога меньше містити бізнес-логіки
Тримати всі наші слої такими як задумувалося
Замінити в будь-який час будь-який рівень
Onion diagram (IOC)
DDD diagram
DDD – сукупність принципів і схем
DDD in action
На цьому все!
Ok ... time for some code ...
Постановка завдання
Cоціальна мережа для поціновувачів літератури надає своїм
користувачам зручний розширений пошук, який містить такі
поля, як:
ISBN
назва (точна або частково точна)
автор твору
видавець
рік видання (перевидання)
...
Реалізація даного функціоналу
Створити форму з великою кількість UI елементів під кожен з
критеріїв;
Прийняти запит на пошук від користувача у вигляді GET або
POST
Провалідувати кожен з цих пошукових критеріїв
У разі валідності запиту передати список цих критеріїв на
рівень нижче і вибрати дані з БД
...
Целі
знизити до нуля дублювання коду
максимально наблизитись до SOLID, розбиваючи код на
невеликі і абсолютно прозорі шматки функціоналу
домогтися реюзабельності написаного коду в інших
частинах програми
забезпечити максимальну простоту додавання нових
критеріїв, а також внесення змін в обробку існуючих
повністю абстрагуватися від персістентного сховища (БД та
ін)
Ручний шлях
Що отримаємо?
довге полотно коду форми і сервісу
валідація даних на рівні сервісу
велика кількість залежностей у випадку складних критеріїв
відсутність будь-якої гнучкості - а що якщо завтра доведеться
підключити в цю схему Sphinx або інший пошуковий движок
а що робити якщо таку ж фільтрацію потрібно застосувати для масиву
(колекції) books, без участі репозиторію - знову доведеться дублювати
код
непрозорість інтерфейсу функції findAll() - ми не дізнаємося які можуть
бути $ params, якщо явно не заліземо в код сервісу
...
Трохи про патерни
Специфікація
$isbnFilter = new DomainBookFilterIsbn('978-5-8459-1597-9');
Кусень коду
use DomainBookFilter as BookFilter;
/// ....
$filter = new BookFilterChain();
$filter->appendFilter(new BookFilterIsbn('978-5-8459-1597-9'))
->appendFilter(new BookFilterTitle('Domain Driven', BookFilterTitle::CONTAINS))
->appendFilter(new BookFilterPublisher('Вильямс', BookFilterPublisher::EQUALS))
->appendFilter(new BookFilterPrice(100, 10.000))
->appendFilter(new BookFilterEbook(true));
// фантазування на тему вітаються
// ...
$bookCollection = $bookSearchService->findAllByFilter($filter);
Використання фільтрів на рівні
репозиторію
Перевірити, що фільтр реалізує потрібний інтерфейс і може
бути використаний;
Перевірити, що поточний користувач має право на
фільтрацію об'єктів у сховищі;
Знайти потрібний репозітрій і передати цьому репозиторію
фільтр.
Функції сервісу
Рефлекції, медіатор, QueryBuilder
Структура сховища інкапсулюється в невеликих і легко
тестованих об'єктах, відокремлена від фільтрів та сервісу
Ми можемо використовувати кілька різних варіантів
технічної реалізації вибірки, просто додавши новий
QueryBuilder зі своїми рефлекціями (наприклад, додати
Sphing SE Query Builder)
Best practice
Замість:
$bookReporsitory->findOneByIsbn('978-5-8459-1597-9');
Краще використовувати:
$bookReporsitory->findOneBy(
new BookFilterIsbn('978-5-8459-1597-9')
);
Specification pattern
$books = $bookRepository->findByFilter($filterChain);
$viewedBooks = $books->filter(new BookFilterViewer($this-
>getCurrentUser()));
Питання
?

Más contenido relacionado

Destacado

Nhibernate Part 1
Nhibernate   Part 1Nhibernate   Part 1
Nhibernate Part 1
guest075fec
 
nHibernate Caching
nHibernate CachingnHibernate Caching
nHibernate Caching
Guo Albert
 
Introduction to NHibernate
Introduction to NHibernateIntroduction to NHibernate
Introduction to NHibernate
Dublin Alt,Net
 
NHibernate for .NET
NHibernate for .NETNHibernate for .NET
NHibernate for .NET
Guo Albert
 
NHibernate (The ORM For .NET Platform)
NHibernate (The ORM For .NET Platform)NHibernate (The ORM For .NET Platform)
NHibernate (The ORM For .NET Platform)
Samnang Chhun
 
The Innovation Game: Why & How Businesses are Investing in Innovation Centers
The Innovation Game: Why & How Businesses are Investing in Innovation Centers The Innovation Game: Why & How Businesses are Investing in Innovation Centers
The Innovation Game: Why & How Businesses are Investing in Innovation Centers
Capgemini
 

Destacado (15)

Nhibernate Part 1
Nhibernate   Part 1Nhibernate   Part 1
Nhibernate Part 1
 
nHibernate Caching
nHibernate CachingnHibernate Caching
nHibernate Caching
 
"ORMs – Entity Framework and NHibernate" - Bob Davidson, South Dakota Code Ca...
"ORMs – Entity Framework and NHibernate" - Bob Davidson, South Dakota Code Ca..."ORMs – Entity Framework and NHibernate" - Bob Davidson, South Dakota Code Ca...
"ORMs – Entity Framework and NHibernate" - Bob Davidson, South Dakota Code Ca...
 
Introduction to NHibernate
Introduction to NHibernateIntroduction to NHibernate
Introduction to NHibernate
 
NHibernate
NHibernateNHibernate
NHibernate
 
NHibernate
NHibernateNHibernate
NHibernate
 
NHibernate for .NET
NHibernate for .NETNHibernate for .NET
NHibernate for .NET
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
NHibernate (The ORM For .NET Platform)
NHibernate (The ORM For .NET Platform)NHibernate (The ORM For .NET Platform)
NHibernate (The ORM For .NET Platform)
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
 
Руйнуємо .NET Міфи
Руйнуємо .NET МіфиРуйнуємо .NET Міфи
Руйнуємо .NET Міфи
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
Lviv MDDay 2014. Дмитро Андреєв “знайомство з .Net micro framework”
Lviv MDDay 2014. Дмитро Андреєв “знайомство з .Net micro framework”Lviv MDDay 2014. Дмитро Андреєв “знайомство з .Net micro framework”
Lviv MDDay 2014. Дмитро Андреєв “знайомство з .Net micro framework”
 
State of entity framework
State of entity frameworkState of entity framework
State of entity framework
 
The Innovation Game: Why & How Businesses are Investing in Innovation Centers
The Innovation Game: Why & How Businesses are Investing in Innovation Centers The Innovation Game: Why & How Businesses are Investing in Innovation Centers
The Innovation Game: Why & How Businesses are Investing in Innovation Centers
 

Similar a Ddd

"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
OdessaJS Conf
 
Lec10 11 ado-net
Lec10 11 ado-netLec10 11 ado-net
Lec10 11 ado-net
cit-cit
 

Similar a Ddd (20)

JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
 
Роман Савіцький, "Webcomponents & lit-element in production."
Роман Савіцький, "Webcomponents & lit-element in production."Роман Савіцький, "Webcomponents & lit-element in production."
Роман Савіцький, "Webcomponents & lit-element in production."
 
ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
Як прокачати трьох студентів за п’ять тижнів
Як прокачати трьох студентів за п’ять тижнівЯк прокачати трьох студентів за п’ять тижнів
Як прокачати трьох студентів за п’ять тижнів
 
Як прокачати трьох студентів за п’ять тижнів
Як прокачати трьох студентів за п’ять тижнівЯк прокачати трьох студентів за п’ять тижнів
Як прокачати трьох студентів за п’ять тижнів
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
Oleksandr Brychuk "UniSender architecture. Growth from 100kk to 1.5kkk letter...
Oleksandr Brychuk "UniSender architecture. Growth from 100kk to 1.5kkk letter...Oleksandr Brychuk "UniSender architecture. Growth from 100kk to 1.5kkk letter...
Oleksandr Brychuk "UniSender architecture. Growth from 100kk to 1.5kkk letter...
 
"Rethinking Continuous Delivery", Andrii Nasinnyk
"Rethinking Continuous Delivery",  Andrii Nasinnyk"Rethinking Continuous Delivery",  Andrii Nasinnyk
"Rethinking Continuous Delivery", Andrii Nasinnyk
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
 
"Key considerations in implementing a distributed message-sending system usin...
"Key considerations in implementing a distributed message-sending system usin..."Key considerations in implementing a distributed message-sending system usin...
"Key considerations in implementing a distributed message-sending system usin...
 
Sql db
Sql dbSql db
Sql db
 
WordPress meetup Kyiv - Starting theme
WordPress meetup Kyiv - Starting themeWordPress meetup Kyiv - Starting theme
WordPress meetup Kyiv - Starting theme
 
Dbase
DbaseDbase
Dbase
 
[Knowledge Sharing] - Microservices Step-by-Step
[Knowledge Sharing] - Microservices Step-by-Step[Knowledge Sharing] - Microservices Step-by-Step
[Knowledge Sharing] - Microservices Step-by-Step
 
Повнотекстовий пошук - кішочки
Повнотекстовий пошук - кішочкиПовнотекстовий пошук - кішочки
Повнотекстовий пошук - кішочки
 
Lecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-CLecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-C
 
System programing module 2
System programing module 2System programing module 2
System programing module 2
 
Lec10 11 ado-net
Lec10 11 ado-netLec10 11 ado-net
Lec10 11 ado-net
 
DAL
DALDAL
DAL
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets
 

Ddd

  • 1. Домейн Дрівен Дізайн, це цибуля Title
  • 2. Data driven design (а може MVC?) Не заморочуємся щодо бази даних ЮІ повинно якомога меньше містити бізнес-логіки Тримати всі наші слої такими як задумувалося Замінити в будь-який час будь-який рівень
  • 5. DDD – сукупність принципів і схем
  • 8. Ok ... time for some code ...
  • 9. Постановка завдання Cоціальна мережа для поціновувачів літератури надає своїм користувачам зручний розширений пошук, який містить такі поля, як: ISBN назва (точна або частково точна) автор твору видавець рік видання (перевидання) ...
  • 10. Реалізація даного функціоналу Створити форму з великою кількість UI елементів під кожен з критеріїв; Прийняти запит на пошук від користувача у вигляді GET або POST Провалідувати кожен з цих пошукових критеріїв У разі валідності запиту передати список цих критеріїв на рівень нижче і вибрати дані з БД ...
  • 11.
  • 12. Целі знизити до нуля дублювання коду максимально наблизитись до SOLID, розбиваючи код на невеликі і абсолютно прозорі шматки функціоналу домогтися реюзабельності написаного коду в інших частинах програми забезпечити максимальну простоту додавання нових критеріїв, а також внесення змін в обробку існуючих повністю абстрагуватися від персістентного сховища (БД та ін)
  • 14. Що отримаємо? довге полотно коду форми і сервісу валідація даних на рівні сервісу велика кількість залежностей у випадку складних критеріїв відсутність будь-якої гнучкості - а що якщо завтра доведеться підключити в цю схему Sphinx або інший пошуковий движок а що робити якщо таку ж фільтрацію потрібно застосувати для масиву (колекції) books, без участі репозиторію - знову доведеться дублювати код непрозорість інтерфейсу функції findAll() - ми не дізнаємося які можуть бути $ params, якщо явно не заліземо в код сервісу ...
  • 15. Трохи про патерни Специфікація $isbnFilter = new DomainBookFilterIsbn('978-5-8459-1597-9');
  • 16. Кусень коду use DomainBookFilter as BookFilter; /// .... $filter = new BookFilterChain(); $filter->appendFilter(new BookFilterIsbn('978-5-8459-1597-9')) ->appendFilter(new BookFilterTitle('Domain Driven', BookFilterTitle::CONTAINS)) ->appendFilter(new BookFilterPublisher('Вильямс', BookFilterPublisher::EQUALS)) ->appendFilter(new BookFilterPrice(100, 10.000)) ->appendFilter(new BookFilterEbook(true)); // фантазування на тему вітаються // ... $bookCollection = $bookSearchService->findAllByFilter($filter);
  • 17. Використання фільтрів на рівні репозиторію Перевірити, що фільтр реалізує потрібний інтерфейс і може бути використаний; Перевірити, що поточний користувач має право на фільтрацію об'єктів у сховищі; Знайти потрібний репозітрій і передати цьому репозиторію фільтр. Функції сервісу
  • 18. Рефлекції, медіатор, QueryBuilder Структура сховища інкапсулюється в невеликих і легко тестованих об'єктах, відокремлена від фільтрів та сервісу Ми можемо використовувати кілька різних варіантів технічної реалізації вибірки, просто додавши новий QueryBuilder зі своїми рефлекціями (наприклад, додати Sphing SE Query Builder)
  • 20. Specification pattern $books = $bookRepository->findByFilter($filterChain); $viewedBooks = $books->filter(new BookFilterViewer($this- >getCurrentUser()));