Пример чистой архитектуры на оценку

Обсуждаем, как правильно строить приложения
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Пример чистой архитектуры на оценку

Сообщение chungachguk »

BrusSENS писал(а): 2019.09.30, 17:02
chungachguk писал(а): 2019.09.30, 14:17 Как в таком случае задаётся ID?
А гидраторы нам на что? :)
Видимо, я не до конца понимаю тогда. При чём здесь гидратор? Это же сущность? У неё ведь должен быть ID, иначе этого не сущность? В данном случае, оказывается, что ID может не быть, но есть второстепенные свойства, которые почему-то обязательны.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

anton_z писал(а): 2019.09.30, 16:50 Там, где вызывается save(). Я это делаю внутри бизнес-методов AR, например так:
Я вот как раз от такой классической ии-шной схемы и думал попробовать уйти в сторону чтобы
usecase доставал через репозитории сущности, делал с ними что надо(в памяти), а потом все измененное состояние уже через репозиторий сохранить. И посмотреть насколько получится.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

chungachguk писал(а): 2019.09.30, 17:39 Видимо, я не до конца понимаю тогда. При чём здесь гидратор? Это же сущность? У неё ведь должен быть ID, иначе этого не сущность? В данном случае, оказывается, что ID может не быть, но есть второстепенные свойства, которые почему-то обязательны.
Дело в том, что идеального ничего не бывает. В теории да, сущность у нас должна уже создаваться с ID, но есть хранилища, которые имеют некоторую специфику, например БД. Если Вам удобнее использовать UUID и подобное - ваше право, можно ID задавать явно и это, безусловно будет верно. Но многая часть пользователей пользуется AI uint полем для генерации ID, я например в их числе. Тогда вполне осознанно мы несколько нарушаем правила, присваивая объекту ID уже после завершения транзакции сохранения данных. Почему гидратор? Потому что у нас в сущности так и нет сеттера для ID. Нарушаем правила, понимая цену этого нарушения и это вполне нормально.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

maleks писал(а): 2019.10.01, 13:14 а потом все измененное состояние уже через репозиторий сохранить.
Вы правда не понимаете того, что у Вас репозиторий ничего не сохраняет и он бесполезный объект?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

BrusSENS писал(а): 2019.10.01, 13:27 Вы правда не понимаете того, что у Вас репозиторий ничего не сохраняет и он бесполезный объект?
Будут какие то аргументы для этого утверждения?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Пример чистой архитектуры на оценку

Сообщение chungachguk »

BrusSENS писал(а): 2019.10.01, 13:25 Дело в том, что идеального ничего не бывает. В теории да, сущность у нас должна уже создаваться с ID, но есть хранилища, которые имеют некоторую специфику, например БД. Если Вам удобнее использовать UUID и подобное - ваше право, можно ID задавать явно и это, безусловно будет верно. Но многая часть пользователей пользуется AI uint полем для генерации ID, я например в их числе. Тогда вполне осознанно мы несколько нарушаем правила, присваивая объекту ID уже после завершения транзакции сохранения данных. Почему гидратор? Потому что у нас в сущности так и нет сеттера для ID. Нарушаем правила, понимая цену этого нарушения и это вполне нормально.
Хм, а может не стоит смешивать? Если UUid, то параметр в конструкторе нужен, если AutoInc, то нет?
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

BrusSENS писал(а): 2019.09.30, 17:01 Хоть дяди Боба, хоть дяди Пети :) У Вас просто попытка изощрённо заюзать AR, не более.
Кто такой дядя Петя я не знаю, будет он весомым специалистом в ООП, как дядя Боб(или не в курсе кто это?), тогда о нем и поговорим. Чего попытка у меня, указано в первом посте темы.
BrusSENS писал(а): 2019.09.30, 17:01 В ActiveQuery тоже ничего и нигде не раскидано. А что обычно в beforeSave()? Я вот лично года 2 уже не переопределял beforeSave...
Причем тут ActiveQuery?? О чем вы вообще?
beforeSave вы не переопределяете потому что используете AR просто как строки в таблице в вашем процедурном скрипте
BrusSENS писал(а): 2019.09.30, 17:01 т.н. "статичные конструкторы" (прости Господи) прекрасно избавляют от таких правил.
Так они есть у меня, и что избавили?
BrusSENS писал(а): 2019.09.30, 17:01 Сущность не должна знать о хранилище. От слова совсем. Хотя у Вас AR - там всё течёт по всему приложению.
Где у меня что там течет?, вы просто случайным образом вещаете услышанные на этом же форуме девизы.
Я не утверждаю что код где внутри сущности запросили другие прям супер, можно и в сервисе это делать, пробуются так сказать варианты
BrusSENS писал(а): 2019.09.30, 17:01 Забавно видеть, как для некоторых Yii хорош только из-за AR :)
Доменная модель как бы в центре всего.
Будь то TS, или AR или чистые Domain models.
Что то выбирать придется, это никак не подделать, не фейкануть.
Кто хочет отказаться от готового типа soft delete, nested sets и т.д., ваше право
Yii2 universal module sceleton - for basic and advanced templates
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Пример чистой архитектуры на оценку

Сообщение anton_z »

maleks писал(а): 2019.10.01, 14:53 Кто такой дядя Петя я не знаю, будет он весомым специалистом в ООП, как дядя Боб(или не в курсе кто это?), тогда о нем и поговорим. Чего попытка у меня, указано в первом посте темы.
Я бы над выбором к кому прислушиваться подумал бы более детально. Когда читаешь какого-то эксперта, надо понимать, в чем именно он эксперт. Где работал Роберт Мартин? Над какими проектами? Какого масштаба? Сколько строк кода? Сколько разработчиков? Какая платформа?
Тогда может станет ясно, что может не из той оперы его рекомендации, и надо их пропускать через своё опыт и интеллект, прежде чем применять в PHP. Что оказалось полезным в проектах Мартина может оказаться вредным у нас. Не исключено, что если Мартину сказали бы, что на основе его Clean Architecture люди пишут сайты, он поржал бы, но это мои догадки, уж не придирайтесь :D
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

maleks писал(а): 2019.10.01, 14:38 Будут какие то аргументы для этого утверждения?
Вам аргумента о том, что у Вас сущность сама себя сохраняет просто в объекте-обёртке, называемой "репозиторием" мало? Вы просто сделали вызова метода save() изнутри другого объекта.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

chungachguk писал(а): 2019.10.01, 14:52 Хм, а может не стоит смешивать? Если UUid, то параметр в конструкторе нужен, если AutoInc, то нет?
И будем плодить тонну реализаций сущности для каждого случая? Проще чутка начать играть "по своим правилам".
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

BrusSENS писал(а): 2019.10.01, 16:15
maleks писал(а): 2019.10.01, 14:38 Будут какие то аргументы для этого утверждения?
Вам аргумента о том, что у Вас сущность сама себя сохраняет просто в объекте-обёртке, называемой "репозиторием" мало? Вы просто сделали вызова метода save() изнутри другого объекта.
Это слова педанта, увидевшего реализацию репозитория, а не аргументы.
Там может быть и другой код, сохранение связанных моделей, предобработка и т.д.
Ибо в ООП мыслят по другому, мыслят о сокрытии информации, о инкапсуляции.
Клиенту этого репозитория не надо догадываться что и как там сохраняется, достаточно знать что отдаем ему несохраненную модель, получаем сохраненную. А что там у него внутри - не наше дело.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

anton_z писал(а): 2019.10.01, 16:05 Не исключено, что если Мартину сказали бы, что на основе его Clean Architecture люди пишут сайты, он поржал бы, но это мои догадки, уж не придирайтесь :D
Ну его на какой то конференции по RoR (как бы под сайты) кто то спросил как натянуть все это красивое на ActiveRecord, он ответил: "натягивайте, что мешает :lol: "
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

maleks писал(а): 2019.10.01, 14:53 Кто такой дядя Петя я не знаю, будет он весомым специалистом в ООП, как дядя Боб(или не в курсе кто это?), тогда о нем и поговорим. Чего попытка у меня, указано в первом посте темы.
Вы прежде чем читать труды Мартина посмотрели бы с каким он языком работает. Многое реализуемое на крестах будет очень больно реализовывать на PHP. И не нужно рассказывать о том, что всё от разработчика зависит. C++ и PHP языки разного уровня всё-таки.
maleks писал(а): 2019.10.01, 14:53 Причем тут ActiveQuery?? О чем вы вообще?
При том, что выборка с AQ ничем не уступает выборке посредством репозитория.
maleks писал(а): 2019.10.01, 14:53 beforeSave вы не переопределяете потому что используете AR просто как строки в таблице в вашем процедурном скрипте
Не несите бред, если не понимаете совершенно, что AR - это объект имеющий состояние и количество бизнес логики в нём не делает его "строкой данных". Тупо цитируете Елисеева, хотя не понимаете вообще о чём он говорил.
maleks писал(а): 2019.10.01, 14:53 Так они есть у меня, и что избавили?
Что у Вас есть? Это?

Код: Выделить всё

    public static function factoryCreateNew($title, $body)
    {
        $post = new self;
        $post->assignData($title, $body);
        return $post;
    }

    public function assignData($title, $body)
    {
        $this->title = $title;
        $this->body = $body;
    }
}
Метод assignData в котором смысла nullptr. Данные совершенно не проверяются при создании, даже на уровне тайпхинта.
maleks писал(а): 2019.10.01, 14:53 Где у меня что там течет?, вы просто случайным образом вещаете услышанные на этом же форуме девизы.
Я не утверждаю что код где внутри сущности запросили другие прям супер, можно и в сервисе это делать, пробуются так сказать варианты
Везде у Вас течёт. Вам каждый раз на пальцах объяснять?
maleks писал(а): 2019.10.01, 14:53 Доменная модель как бы в центре всего.
Будь то TS, или AR или чистые Domain models.
Она у Вас уже не чистая. Как минимум в ней уже и UoW и вся начинка для работы с БД.
maleks писал(а): 2019.10.01, 14:53 Что то выбирать придется, это никак не подделать, не фейкануть.
Кто хочет отказаться от готового типа soft delete, nested sets и т.д., ваше право
А что сложного в NS? Его с QB можно за час написать, если понимать, как оно работает. И да. Что забавно, yii2-nested-sets, не в обиду Creocoder'у, но он сам, судя по всему не понимает алгоритм Multiple Roots, или такая реализация была намеренно выбрана. Посему проще для себя написать самому.

P.S.: Вы начинаете агриться в этой теме на то, что Вам наоборот пытаются помочь, возможно оно не всегда понятно, что это помощь, но люди разные. А видим что?
Я: У Вас не репозиторий, это просто обёртка непонятная над AR (пытаюсь донести то, что это просто нерациональное расходование памяти на лишний объект).
Вы: Так ты сам тут на форуме же вопросы задавал и отвечаешь примерно как там. Вообще ты пытаешься ко мне придраться, а не помочь.

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

P.P.S.: Я данный подход с чистой архитектурой, DDD и т.п. испытал на проекте PHP и на другом проекте C++. И пытаюсь Вам донести то, что если и нужно с таким заморачиваться, то выкидывайте AR. Но это будет дорого и очень сложно. Да и на блог сие не натянуть нормально. В прочем поддержу тот момент, что "архитектурой" нужно переболеть.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

maleks писал(а): 2019.10.01, 16:32 Ну его на какой то конференции по RoR (как бы под сайты) кто то спросил как натянуть все это красивое на ActiveRecord, он ответил: "натягивайте, что мешает :lol: "
У меня в городе тут есть человек, который в жигули запихал 2JZ-GTE двигатель, мощностью около 700лс. Ему вроде тоже ничего не мешало, но это корыто не то, что не комфортно использовать, на нём в принципе нельзя передвигаться по дорогам общего пользования. И в гонках не поучаствуешь, ибо оно для этого не безопасно.
Это я к чему? А к тому, что ничего вроде не мешает, но смысл сих действий только визуально удлиняет детородный орган в определённых кругах общения.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

BrusSENS писал(а): 2019.10.01, 16:46 Вы прежде чем читать труды Мартина посмотрели бы с каким он языком работает.
Да язык тут вообще не причем. Книги по ООП и архитектуре идут вообще без привязки к какой то реализации.
BrusSENS писал(а): 2019.10.01, 16:46 При том, что выборка с AQ ничем не уступает выборке посредством репозитория.
Ну так у меня в репозитории и будут выборки с AQ.
Только у меня будут эти выборки в одном месте, а у вас Post::find()->where() будет размазано везде, в контроллерах, виджетах, моделях и вьюхах
BrusSENS писал(а): 2019.10.01, 16:46 Не несите бред, если не понимаете совершенно, что AR - это объект имеющий состояние и количество бизнес логики в нём не делает его "строкой данных". Тупо цитируете Елисеева, хотя не понимаете вообще о чём он говорил.
Какой то бессмысленный набор слов. Я сказал что у вас он работает тупо как замена mysql_query() потому и не нужны вам beforeSave. А у меня он как задумывалось
BrusSENS писал(а): 2019.10.01, 16:46 Что у Вас есть? Это?
Метод assignData в котором смысла nullptr. Данные совершенно не проверяются при создании, даже на уровне тайпхинта.
Про тайпхинт пока единое замечание по сути. А вот если его тут еще и валидировать то как то неорганично получится.
BrusSENS писал(а): 2019.10.01, 16:46 Везде у Вас течёт. Вам каждый раз на пальцах объяснять?
опять пустые закидоны
BrusSENS писал(а): 2019.10.01, 16:46 А что сложного в NS? Его с QB можно за час написать, если понимать, как оно работает.
сказочки эти оставьте кому то другому. Ничего уровнего подобного данной серьезной задачи вы не расшарили с сообществом и не поддерживаете как расширение
BrusSENS писал(а): 2019.10.01, 16:46 Получается тема не о том, что бы получить советы, а просто сказать, какие некоторые, несогласные с Вашим мнением, пользователи недоумки.
Это больше ваши перекосы в восприятии.
Я пишу код, в соответствии с правилами всех этих статей, и смотрю насколько понятным он получается, а люди уточняют.
BrusSENS писал(а): 2019.10.01, 16:46 P.P.S.: Я данный подход с чистой архитектурой, DDD и т.п. испытал на проекте PHP и на другом проекте C++. И пытаюсь Вам донести то, что если и нужно с таким заморачиваться,
Да, я помню вы все горели желанием по всем этим правилам цмс-ку собрать, но потом пришли такие, ой у меня ничего не получилось, все фигня. Что этому могли быть за причины?, учитывая вашу как бы так сказать специфичную трактовку ООП, когда даже момент про Low coupling вами не понят, хотя уж о чем, а о нем как раз в каждой ООП книге орут.
BrusSENS писал(а): 2019.10.01, 16:46 то выкидывайте AR. Но это будет дорого и очень сложно.
Так в этом то и суть. Мне не нужно дорого и очень сложно.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Пример чистой архитектуры на оценку

Сообщение maleks »

Вопрос всем, чем в принципе не устраивает момент когда сущность получая в зависимость интерфейсы репозитариев сможет сама получать нужные ей сущности?
Ну вот как я в примере проверил что коммент присваивается к существующему посту:

Код: Выделить всё

    public function assignPost($postid, PostRepositoryInterface $postRepository)
    {
        if ($post = $postRepository->find($postid)) {
            $this->postid = $post->id;
        }
    }
Можно это все готовить и снаружи, в сервисах, но ответственность ли это сервисов?

Например такая условная задача:
Запретить редактирование поста если самый первый коммент к нему был запощен пол года назад или ранее.
Разве плохо было бы в сущности сделать проверку:

Код: Выделить всё

    public function quardChangePost(CommentRepositoryInterface $commentRepository)
    {
        if ($firstComment = $commentRepository->getFirstComment($this->id)) {
            if ($firstComment->date < time() - полгода) {throw ...}
        }
    }
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Пример чистой архитектуры на оценку

Сообщение chungachguk »

BrusSENS писал(а): 2019.10.01, 16:16
chungachguk писал(а): 2019.10.01, 14:52 Хм, а может не стоит смешивать? Если UUid, то параметр в конструкторе нужен, если AutoInc, то нет?
И будем плодить тонну реализаций сущности для каждого случая? Проще чутка начать играть "по своим правилам".
Непонятно о какой тонне реализаций идёт речь. Вижу всего 2 8-)
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

maleks писал(а): 2019.10.01, 17:26 Да язык тут вообще не причем. Книги по ООП и архитектуре идут вообще без привязки к какой то реализации.
Прекратите рассказывать мне о теории. На практике сначала потренеруйтесь на разных языках, тогда расскажете о том, как всё одинаково готовится.
maleks писал(а): 2019.10.01, 17:26 Ну так у меня в репозитории и будут выборки с AQ.
Только у меня будут эти выборки в одном месте, а у вас Post::find()->where() будет размазано везде, в контроллерах, виджетах, моделях и вьюхах
Не делать выборки в виджетах и вьюхах можно и без репозиториев - это первое. Второе - у Вас нет репозитория. У Вас бестолковый объект, поймите уже это и прекращайте рассказывать про репо с AR и AQ.
maleks писал(а): 2019.10.01, 17:26 Какой то бессмысленный набор слов. Я сказал что у вас он работает тупо как замена mysql_query() потому и не нужны вам beforeSave. А у меня он как задумывалось
Вы мне цитируете Елисеева, подкидывая своих словечек. Откуда Вы знаете, что у меня работает и как? У меня нет Валидации в AR, у меня AR имеет бизнес логику, которая уместна в нём, на мой взгляд, я не горожу кусок чего-то дурнопахнующего, называя это репозиторием, я использую или сервисы для определённых действий или шину команд, когда что удобнее. У меня нет выборок в View. Получается, что все проблемы, которые Вы решаете своей реализацией "clear architect" - это ваша неопытность, не более. И Фаулера уж перестаньте сюда кидать ссылки. У Вас всё, как задумывалось, но в голове, почему-то каша.
maleks писал(а): 2019.10.01, 17:26 Про тайпхинт пока единое замечание по сути. А вот если его тут еще и валидировать то как то неорганично получится.
Валидация там по сути нужна в зависимости от выбраной стратегии (не Strategy паттерн) сохранения. Если используете, как я думаю, различного рода форматирование и чистку содержимого статьи (Purifier например), то может понадобиться проверка на допустимый размер контента, помимо самого typehint'а. Опять же, зависит от того, когда и где Вы производите эти действия.
maleks писал(а): 2019.10.01, 17:26 опять пустые закидоны
Не закидоны, а просто тупо надоело уже говорить 100 раз одно и то же.
maleks писал(а): 2019.10.01, 17:26 сказочки эти оставьте кому то другому. Ничего уровнего подобного данной серьезной задачи вы не расшарили с сообществом и не поддерживаете как расширение
Я разве сказал, что я выкладывал подобное расширение? Вроде нет. Задача нисколько не серьёзная, а наоборот вполне тривиальная для большей части проектов. Если Вы не понимаете философию NS и не можете реализовать управление NS на "голом" Query, то тут уже это Ваши проблемы, но приравнивать к себе остальных не нужно. Шарить и поддерживать такое расширение и не собираюсь, для Ваших проектов оно явно не подойдёт.
maleks писал(а): 2019.10.01, 17:26 Это больше ваши перекосы в восприятии.
Я пишу код, в соответствии с правилами всех этих статей, и смотрю насколько понятным он получается, а люди уточняют.
Это именно Ваши перекосы в восприятии. Вы пытаетесь создать серебряную пулю, внося в проект бестолковые объекты, тем самым не думая о памяти и других важных вещах. Хотите вечно читать теорию? Да читайте на здоровье. Хотите практиковать - отчасти прислушивайтесь к тому, что Вам говорят "коллеги по цеху" и пробуйте это на практике. Чаще всего, теория остаётся теорией и на практике делается всё иначе. Мы разрабатываем программные продукты, которые, к сожалению, никогда не будут иметь идеальный код. Прежде всего поймите, что описанные в этих статьях подходы - это решения. Решения конкретных проблем. А Вы, получается ничего не решаете, просто усложняете жизнь себе.
maleks писал(а): 2019.10.01, 17:26 Да, я помню вы все горели желанием по всем этим правилам цмс-ку собрать, но потом пришли такие, ой у меня ничего не получилось, все фигня. Что этому могли быть за причины?, учитывая вашу как бы так сказать специфичную трактовку ООП, когда даже момент про Low coupling вами не понят, хотя уж о чем, а о нем как раз в каждой ООП книге орут.
Да, было дело, хотел сделать систему, близкую DDD. Болел, как и Вы архитектурой. Теперь имею закрытую, если это можно назвать CMF (Хотя по сути это удобная админ панель для определённого набора компонентов приложения для быстрого старта работы с проектами), на которой, например сейчас реализовывал работу с 6 базами (любительский сервер онлайн игры), так там пул соединений, но единая сущность, работающая с 2 базами. И представляете... Это всё AR! Да ещё и данные об аккаунте в 2 разных базах. Например пароль в одной, а логин в другой. Всё красиво, сущности имеют только необходимую бизнес логику, остальное в сервисах. Вот такая система из этого вышла. Но в опенсорс она не попала в виду того, что она не предназначена для домохозяек и прочего контенгента. Она специфична и используется для проектов, которые разрабатываются узким кругом разработчиков. Хотя до сих пор хочу CMS сделать, как и раньше.
Касаемо "непонятых мной моментов", трактовок и т.п. скажу так, что бы не обидеть: не нужно оценивать мои возможности, оценивайте свои. Я давал оценку Вашей архитектуры, т.к. Вы создали данную тему и написал о том, что, по моему мнению не так. Не хотите прислушаться, то хоть не начинайте мне навязывать Ваши, где-то на просторах прочитанные куски теории, которые по большей части Вы не сможете применить на практике.
maleks писал(а): 2019.10.01, 17:26 Так в этом то и суть. Мне не нужно дорого и очень сложно.
Уже писали много раз о том, что серебряной пули не бывает. Хотите просто - AR и не выдумывайте лишнего. Нужно красиво - это будет сложно и дорого в любом случае.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

maleks писал(а): 2019.10.01, 17:56 Вопрос всем, чем в принципе не устраивает момент когда сущность получая в зависимость интерфейсы репозитариев сможет сама получать нужные ей сущности?
Ну вот как я в примере проверил что коммент присваивается к существующему посту:

Можно это все готовить и снаружи, в сервисах, но ответственность ли это сервисов?

Например такая условная задача:
Запретить редактирование поста если самый первый коммент к нему был запощен пол года назад или ранее.
Разве плохо было бы в сущности сделать проверку:
В куске псевдокода, который я приводил тут в теме, показан один из вариантов решения такой проблемы. Всегда видел, как возвращается из репозитория массив сущностей, что я считаю неверным решением.

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

Код: Выделить всё

$comment = new Comment();
$post->getCommentCollection()->addComment($comment);
$blogRepository->updatePost($post);
updatePost() метод у нас по сути знает как сохранить весь агрегат Post вместе с комментариями.
Последний раз редактировалось BrusSENS 2019.10.01, 21:35, всего редактировалось 1 раз.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Пример чистой архитектуры на оценку

Сообщение BrusSENS »

chungachguk писал(а): 2019.10.01, 18:02 Непонятно о какой тонне реализаций идёт речь. Вижу всего 2 8-)
Люблю final классы) Так что 2 не вариант вообще)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Ответить