[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: DDD в PHP
Страницы: 1, 2
McLotos
Всем привет.
Кто знает такой паттерн как Domain Driven Design?
купил книжку Эрика Эванса (которая Big Blue Book), прочитал (жуть как тяжело читается, первые 70 страниц можно вообще выкинуть), и теперь у меня осталось несколько вопросов
1. Как организовывать домены в плане кода, вот с SOLID и MVC всё понятно, а вот тут вообще не ясно какие должны быть объекты, как они должны распологаться.
2. Зачем нужны ОЗ, если Сущности на много более функциональны?
3. Агрегаты vs Сущностей, не совсем понимаю, можно ли в сущности inject'ить другие сущности или это можно только в Агрегатах?
Вопросов еще много, но хотя бы с этим разобраться

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
twin
Вообще DDD зиждется на махровом ООП. А последнее гласит - первичны объекты, а не классы. Не класс производит объект, а объект пользуется классом, как инструментом.

По этому проектирование начинается именно с объектов. И когда домен спроектирован, тогда только пишутся классы. Когда это усвоишь (что очень трудно на самом деле), все остальное разложится само собой, как пасьянс "косынка". smile.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Ron
McLotos, напрашивается вопрос: какие книги изучал в плане ООП? Потому что DDD - способ применения (и не только), книга оч. серьезная. Туда лезть без хорошего бэкграунда бестолку.

Кстати, DDD не паттерн а методология разработки проекта, там не только об архитектуре речь.

McLotos
twin привет. Давно не виделись! )
Ну понятно что нужно ориентироваться на бизнес-процесс (кстати в этом случае получается много дублирования кода, потому что в разных бизнес-процессах, а значит и в разных доменах встречаются одни и те же сущности)
Вот на счёт того что не класс создаёт объект вообще поставил меня в тупик.
А по 2 и 3 пункту можешь объяснить?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
twin
Второй и третий пункт не объяснить без понимания настоящего ООП. То, что вы привыкли считать ООП, таковым вовсе не является, это обычная процедурка на классах. Особенно если ты пытаешься это все спроецировать на MVC и SOLID. Забудь про них вообще. И про классы забудь. И уж точно забудь про базу данных, ничего этого нет. Потому что это всё касается реализации. А DDD, это чистое проектирование.

Сначала нужно научиться мыслить объектами. В объекте нет никаких методов, есть только свойства. Объект не умирает после завершения скрипта, как привыкли в PHP. Объект создается один раз и живет долго и счастливо, пока его принудительно не грохнут. Соответственно никаких конструкторов и new. Вот в процессе жизнедеятельности объект можно ассоциировать с классом, и он воспользуется его методами.

Так что если действительно хочешь погрузиться в DDD, и про IDE забудь. Нет ни одной IDE, которая работает с объектами, все они для классов. Никаких классов, только объекты. Можешь на бумажке рисовать, можешь какой то софт для UML юзать, не важно. Важно то, что проектирование домена, это верхний уровень. Реализация уже потом.

Ну как то так:

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
McLotos
User это Entity, у него есть например параметр Address, который в свою очередь является VO.
А теперь сделаем такой фокус, Address у нас тоже имеет зависимость например на Country, в этом случае Address уже не VO, а Entity, а User уже не Entity а Aggregate?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
twin
Агрегат, это не объект, это совокупность объектов. Сущностей и VO. У агрегата должен быть главный объект - корень. Root. Все обращения к объектам агрегата должны быть только через корень, никак не напрямую. Корнем может быть только сущность.

Entity отличается от VO тем, что у сущности есть идентификатор. А у VO нету. Как и что использовать, зависит от контекста.

Хороший пример с деньгами. Есть купюра в 1000 рублей. Если она нужна для платежа, это VO, потому что пофиг какая это купюра, главное номинал. Но если эта купюра проходит по делу о взятках, это уже сущность. Потому что нужно доказать, что именно её дали на взятку. И тогда там важен серийный номер. Это уже сущность.

Ну и так далее.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
McLotos
Цитата (twin @ 31.10.2018 - 12:23)
Корнем может быть только сущность.

Вот тут уже стало понятнее, т.е. Агрегат это своего рода фасад, но при этом имеющий собственный идентификатор, например User.id
Всё объекты внутри агрегата это либо сущности (в случае если нам нужна их идентификация по ID, либо VO, если мы их идентифицируем только по значениям полей. При этом в пределах агрегата Сущности могут быть изменяемыми, а VO нет (что логично ибо как что-то изменить если не можешь его идентифицировать).
Это понятно.
Теперь вот мне не ясно, как писать классы для такой системы.
Мы все привыкли мыслить классами, в этом случае придется немного мыслить по-другому, но не отходя далеко от реализации, поэтому мы сначала создаем классы, которые будут представлять из себя VO, потом из них под требование бизнеса меняем классы чтобы некоторые из них стали Entity (по сути просто добавляем свойство $id), и получив в итоге пару-тройку Entity и несколько VO собираем из них Агрегат, заточенный под конкретную задачу, например редактирование того же самого юзера, так?
А если в каких-то случаях VO должен быть изменяем? Писать отдельную реализацию этого VO?
Вот еще хороший материал по теме https://izif.com/uploads/ddd-in-php-sample.pdf

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
twin
Да забудь ты про классы. Если будешь на них сползать, толку не выйдет. Сначала нужно проработать взаимодействия объектов. Потом классы сами напишутся.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
McLotos
Как? Вот у меня есть модели бизнес-процессов, мне нужно реализовать их в коде.
А если бизнес-процесс поменяется мне что отдельный домен создавать под новый процесс или все-таки можно будет подправить текущий?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
twin
Нет у тебя еще ничего. Какой код))) До кода нужно дойти постепенно. Сначала с объектами разберись.

Вообще если это DDD, то там на столько код не важен, что не важно даже на каком ЯП это реализовывать. А если будешь думать кодами, то сползешь обратно в процедурку и нифига толку не выйдет.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
McLotos
Цитата (twin @ 31.10.2018 - 13:22)
Вообще если это DDD, то там на столько код не важен, что не важно даже на каком ЯП это реализовывать.

Да, я так и хочу сделать, чтобы можно было безболезненно переносить это всё на разные платформы, например сейчас всё реализовывается на laravel, но постепенно переносится на другой фреймворк, а что-то вообще выносится на микросервисы на go, поэтому и пришел в итоге к DDD, чтобы не зависеть от кода.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Michael
Цитата (McLotos @ 31.10.2018 - 09:44)
Да, я так и хочу сделать, чтобы можно было безболезненно переносить это всё на разные платформы, например сейчас всё реализовывается на laravel, но постепенно переносится на другой фреймворк, а что-то вообще выносится на микросервисы на go, поэтому и пришел в итоге к DDD, чтобы не зависеть от кода.

Для этого не нужно разбираться в дебрях космолета под названием DDD.
Фреймворконезависимость - это идеи из Чистых архитектур. Когда фрейм используется только на внешних слоях.
Можешь ознакомиться по Kristopher Wilson - The Clean Architecture in PHP
Ситуация с Laravel упрощается тем что используя Eloquent ты в новом проекте его можно оставить, т.к. он - независимая библиотека.

_____________
There never was a struggle in the soul of a good man that was not hard
Michael
Цитата (twin @ 30.10.2018 - 16:23)
Вообще DDD зиждется на махровом ООП. А последнее гласит - первичны объекты, а не классы. Не класс производит объект, а объект пользуется классом, как инструментом.

По этому проектирование начинается именно с объектов. И когда домен спроектирован, тогда только пишутся классы. Когда это усвоишь (что очень трудно на самом деле), все остальное разложится само собой, как пасьянс "косынка".  smile.gif

Не знал что для тебя было проблемой понимание что программа на ООП - это набор взаимодействующих объектов.
Насчет "объект пользуется классом", крайне неудачная формулировка, может тебе и приходится понимать вещи такими путями, но думаю людей такое только запутает.
Думаю ты зацепился так на этой проблеме понимания связи понятий объект-класс т.к. постоянно статику юзал и поэтому все время существовало размытое понятие объекта.

Например в книге по тестам эти вещи так объясняются:
Цитата
We view classes for objects as an “implementation detail”—a way of implementing types, not the types themselves.


_____________
There never was a struggle in the soul of a good man that was not hard
twin
Цитата (Michael @ 1.11.2018 - 06:15)
Не знал что для тебя было проблемой понимание что программа на ООП - это набор взаимодействующих объектов.

Это не моя проблема. Это проблема всеобщая. Обычно сначала пишут класс, потом уже думают, какой получится объект. Соответственно в большинстве случаев (особенно в фреймворках) объект выполняет роль набора типизированных данных, который гоняется по классам и уже они что то с ним делают. Обычный процедурный подход.

Цитата (Michael @ 1.11.2018 - 06:15)
Насчет "объект пользуется классом", крайне неудачная формулировка
Может быть неудачная, но суть именно такая. Первичен объект. Вот к примеру объект:

object(car)#1 (1) {
["model"]=>
string(18) "Запорожец"
}


Что этот объект умеет делать? Ничего. Потому что нужен класс, тогда что то может произойти. Причем, при взаимодействии с разными классами, он может выполнять совершенно различные действия.

Допустим, если его сериализовать:
Цитата
"O:3:"car":1:{s:5:"model";s:18:"Запорожец";}"


а потом использовать в разных системах:
class car
{
public function run()
{
echo 'go!';
}

}


$car = 'O:3:"car":1:{s:5:"model";s:18:"Запорожец";}';
$car = unserialize($car);

$car->run();


а в другой так:
class car
{
public function drive()
{
echo "let's go!";
}

}


$car = 'O:3:"car":1:{s:5:"model";s:18:"Запорожец";}';
$car = unserialize($car);

$car->drive();


ТО все отлично сработает, совершенно не взирая на то, как объект был получен. Простой инициализацией, гидрацией или еще как.

Важно то, что объект может пользоваться любыми методами любого созвучного класса, оставаясь при этом неизменным.

Вот и получается, что объект пользуется классом, а не класс производит объект. И это краеугольный камень в DDD. Если думать, что объект жестко привязан к классу, то будет довольно сложно проектировать домен, ибо там только объекты.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.