Видимо, я не до конца понимаю тогда. При чём здесь гидратор? Это же сущность? У неё ведь должен быть ID, иначе этого не сущность? В данном случае, оказывается, что ID может не быть, но есть второстепенные свойства, которые почему-то обязательны.
Пример чистой архитектуры на оценку
- chungachguk
- Сообщения: 435
- Зарегистрирован: 2012.07.17, 11:52
Re: Пример чистой архитектуры на оценку
Re: Пример чистой архитектуры на оценку
Я вот как раз от такой классической ии-шной схемы и думал попробовать уйти в сторону чтобы
usecase доставал через репозитории сущности, делал с ними что надо(в памяти), а потом все измененное состояние уже через репозиторий сохранить. И посмотреть насколько получится.
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
Дело в том, что идеального ничего не бывает. В теории да, сущность у нас должна уже создаваться с ID, но есть хранилища, которые имеют некоторую специфику, например БД. Если Вам удобнее использовать UUID и подобное - ваше право, можно ID задавать явно и это, безусловно будет верно. Но многая часть пользователей пользуется AI uint полем для генерации ID, я например в их числе. Тогда вполне осознанно мы несколько нарушаем правила, присваивая объекту ID уже после завершения транзакции сохранения данных. Почему гидратор? Потому что у нас в сущности так и нет сеттера для ID. Нарушаем правила, понимая цену этого нарушения и это вполне нормально.chungachguk писал(а): ↑2019.09.30, 17:39 Видимо, я не до конца понимаю тогда. При чём здесь гидратор? Это же сущность? У неё ведь должен быть ID, иначе этого не сущность? В данном случае, оказывается, что ID может не быть, но есть второстепенные свойства, которые почему-то обязательны.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
Вы правда не понимаете того, что у Вас репозиторий ничего не сохраняет и он бесполезный объект?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
- chungachguk
- Сообщения: 435
- Зарегистрирован: 2012.07.17, 11:52
Re: Пример чистой архитектуры на оценку
Хм, а может не стоит смешивать? Если UUid, то параметр в конструкторе нужен, если AutoInc, то нет?BrusSENS писал(а): ↑2019.10.01, 13:25 Дело в том, что идеального ничего не бывает. В теории да, сущность у нас должна уже создаваться с ID, но есть хранилища, которые имеют некоторую специфику, например БД. Если Вам удобнее использовать UUID и подобное - ваше право, можно ID задавать явно и это, безусловно будет верно. Но многая часть пользователей пользуется AI uint полем для генерации ID, я например в их числе. Тогда вполне осознанно мы несколько нарушаем правила, присваивая объекту ID уже после завершения транзакции сохранения данных. Почему гидратор? Потому что у нас в сущности так и нет сеттера для ID. Нарушаем правила, понимая цену этого нарушения и это вполне нормально.
Re: Пример чистой архитектуры на оценку
Кто такой дядя Петя я не знаю, будет он весомым специалистом в ООП, как дядя Боб(или не в курсе кто это?), тогда о нем и поговорим. Чего попытка у меня, указано в первом посте темы.
Причем тут ActiveQuery?? О чем вы вообще?
beforeSave вы не переопределяете потому что используете AR просто как строки в таблице в вашем процедурном скрипте
Так они есть у меня, и что избавили?
Где у меня что там течет?, вы просто случайным образом вещаете услышанные на этом же форуме девизы.
Я не утверждаю что код где внутри сущности запросили другие прям супер, можно и в сервисе это делать, пробуются так сказать варианты
Доменная модель как бы в центре всего.
Будь то TS, или AR или чистые Domain models.
Что то выбирать придется, это никак не подделать, не фейкануть.
Кто хочет отказаться от готового типа soft delete, nested sets и т.д., ваше право
Re: Пример чистой архитектуры на оценку
Я бы над выбором к кому прислушиваться подумал бы более детально. Когда читаешь какого-то эксперта, надо понимать, в чем именно он эксперт. Где работал Роберт Мартин? Над какими проектами? Какого масштаба? Сколько строк кода? Сколько разработчиков? Какая платформа?
Тогда может станет ясно, что может не из той оперы его рекомендации, и надо их пропускать через своё опыт и интеллект, прежде чем применять в PHP. Что оказалось полезным в проектах Мартина может оказаться вредным у нас. Не исключено, что если Мартину сказали бы, что на основе его Clean Architecture люди пишут сайты, он поржал бы, но это мои догадки, уж не придирайтесь
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
Вам аргумента о том, что у Вас сущность сама себя сохраняет просто в объекте-обёртке, называемой "репозиторием" мало? Вы просто сделали вызова метода save() изнутри другого объекта.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
И будем плодить тонну реализаций сущности для каждого случая? Проще чутка начать играть "по своим правилам".chungachguk писал(а): ↑2019.10.01, 14:52 Хм, а может не стоит смешивать? Если UUid, то параметр в конструкторе нужен, если AutoInc, то нет?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
Re: Пример чистой архитектуры на оценку
Это слова педанта, увидевшего реализацию репозитория, а не аргументы.
Там может быть и другой код, сохранение связанных моделей, предобработка и т.д.
Ибо в ООП мыслят по другому, мыслят о сокрытии информации, о инкапсуляции.
Клиенту этого репозитория не надо догадываться что и как там сохраняется, достаточно знать что отдаем ему несохраненную модель, получаем сохраненную. А что там у него внутри - не наше дело.
Re: Пример чистой архитектуры на оценку
Ну его на какой то конференции по RoR (как бы под сайты) кто то спросил как натянуть все это красивое на ActiveRecord, он ответил: "натягивайте, что мешает "
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
Вы прежде чем читать труды Мартина посмотрели бы с каким он языком работает. Многое реализуемое на крестах будет очень больно реализовывать на PHP. И не нужно рассказывать о том, что всё от разработчика зависит. C++ и PHP языки разного уровня всё-таки.
При том, что выборка с AQ ничем не уступает выборке посредством репозитория.
Не несите бред, если не понимаете совершенно, что AR - это объект имеющий состояние и количество бизнес логики в нём не делает его "строкой данных". Тупо цитируете Елисеева, хотя не понимаете вообще о чём он говорил.
Что у Вас есть? Это?
Код: Выделить всё
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;
}
}
Везде у Вас течёт. Вам каждый раз на пальцах объяснять?
Она у Вас уже не чистая. Как минимум в ней уже и UoW и вся начинка для работы с БД.
А что сложного в NS? Его с QB можно за час написать, если понимать, как оно работает. И да. Что забавно, yii2-nested-sets, не в обиду Creocoder'у, но он сам, судя по всему не понимает алгоритм Multiple Roots, или такая реализация была намеренно выбрана. Посему проще для себя написать самому.
P.S.: Вы начинаете агриться в этой теме на то, что Вам наоборот пытаются помочь, возможно оно не всегда понятно, что это помощь, но люди разные. А видим что?
Я: У Вас не репозиторий, это просто обёртка непонятная над AR (пытаюсь донести то, что это просто нерациональное расходование памяти на лишний объект).
Вы: Так ты сам тут на форуме же вопросы задавал и отвечаешь примерно как там. Вообще ты пытаешься ко мне придраться, а не помочь.
Получается тема не о том, что бы получить советы, а просто сказать, какие некоторые, несогласные с Вашим мнением, пользователи недоумки.
P.P.S.: Я данный подход с чистой архитектурой, DDD и т.п. испытал на проекте PHP и на другом проекте C++. И пытаюсь Вам донести то, что если и нужно с таким заморачиваться, то выкидывайте AR. Но это будет дорого и очень сложно. Да и на блог сие не натянуть нормально. В прочем поддержу тот момент, что "архитектурой" нужно переболеть.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
У меня в городе тут есть человек, который в жигули запихал 2JZ-GTE двигатель, мощностью около 700лс. Ему вроде тоже ничего не мешало, но это корыто не то, что не комфортно использовать, на нём в принципе нельзя передвигаться по дорогам общего пользования. И в гонках не поучаствуешь, ибо оно для этого не безопасно.
Это я к чему? А к тому, что ничего вроде не мешает, но смысл сих действий только визуально удлиняет детородный орган в определённых кругах общения.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
Re: Пример чистой архитектуры на оценку
Да язык тут вообще не причем. Книги по ООП и архитектуре идут вообще без привязки к какой то реализации.
Ну так у меня в репозитории и будут выборки с AQ.
Только у меня будут эти выборки в одном месте, а у вас Post::find()->where() будет размазано везде, в контроллерах, виджетах, моделях и вьюхах
Какой то бессмысленный набор слов. Я сказал что у вас он работает тупо как замена mysql_query() потому и не нужны вам beforeSave. А у меня он как задумывалось
Про тайпхинт пока единое замечание по сути. А вот если его тут еще и валидировать то как то неорганично получится.
опять пустые закидоны
сказочки эти оставьте кому то другому. Ничего уровнего подобного данной серьезной задачи вы не расшарили с сообществом и не поддерживаете как расширение
Это больше ваши перекосы в восприятии.
Я пишу код, в соответствии с правилами всех этих статей, и смотрю насколько понятным он получается, а люди уточняют.
Да, я помню вы все горели желанием по всем этим правилам цмс-ку собрать, но потом пришли такие, ой у меня ничего не получилось, все фигня. Что этому могли быть за причины?, учитывая вашу как бы так сказать специфичную трактовку ООП, когда даже момент про Low coupling вами не понят, хотя уж о чем, а о нем как раз в каждой ООП книге орут.
Так в этом то и суть. Мне не нужно дорого и очень сложно.
Re: Пример чистой архитектуры на оценку
Вопрос всем, чем в принципе не устраивает момент когда сущность получая в зависимость интерфейсы репозитариев сможет сама получать нужные ей сущности?
Ну вот как я в примере проверил что коммент присваивается к существующему посту:
Можно это все готовить и снаружи, в сервисах, но ответственность ли это сервисов?
Например такая условная задача:
Запретить редактирование поста если самый первый коммент к нему был запощен пол года назад или ранее.
Разве плохо было бы в сущности сделать проверку:
Ну вот как я в примере проверил что коммент присваивается к существующему посту:
Код: Выделить всё
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 ...}
}
}
- chungachguk
- Сообщения: 435
- Зарегистрирован: 2012.07.17, 11:52
Re: Пример чистой архитектуры на оценку
Непонятно о какой тонне реализаций идёт речь. Вижу всего 2BrusSENS писал(а): ↑2019.10.01, 16:16И будем плодить тонну реализаций сущности для каждого случая? Проще чутка начать играть "по своим правилам".chungachguk писал(а): ↑2019.10.01, 14:52 Хм, а может не стоит смешивать? Если UUid, то параметр в конструкторе нужен, если AutoInc, то нет?
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
Прекратите рассказывать мне о теории. На практике сначала потренеруйтесь на разных языках, тогда расскажете о том, как всё одинаково готовится.
Не делать выборки в виджетах и вьюхах можно и без репозиториев - это первое. Второе - у Вас нет репозитория. У Вас бестолковый объект, поймите уже это и прекращайте рассказывать про репо с AR и AQ.
Вы мне цитируете Елисеева, подкидывая своих словечек. Откуда Вы знаете, что у меня работает и как? У меня нет Валидации в AR, у меня AR имеет бизнес логику, которая уместна в нём, на мой взгляд, я не горожу кусок чего-то дурнопахнующего, называя это репозиторием, я использую или сервисы для определённых действий или шину команд, когда что удобнее. У меня нет выборок в View. Получается, что все проблемы, которые Вы решаете своей реализацией "clear architect" - это ваша неопытность, не более. И Фаулера уж перестаньте сюда кидать ссылки. У Вас всё, как задумывалось, но в голове, почему-то каша.maleks писал(а): ↑2019.10.01, 17:26 Какой то бессмысленный набор слов. Я сказал что у вас он работает тупо как замена mysql_query() потому и не нужны вам beforeSave. А у меня он как задумывалось
Валидация там по сути нужна в зависимости от выбраной стратегии (не Strategy паттерн) сохранения. Если используете, как я думаю, различного рода форматирование и чистку содержимого статьи (Purifier например), то может понадобиться проверка на допустимый размер контента, помимо самого typehint'а. Опять же, зависит от того, когда и где Вы производите эти действия.
Не закидоны, а просто тупо надоело уже говорить 100 раз одно и то же.
Я разве сказал, что я выкладывал подобное расширение? Вроде нет. Задача нисколько не серьёзная, а наоборот вполне тривиальная для большей части проектов. Если Вы не понимаете философию NS и не можете реализовать управление NS на "голом" Query, то тут уже это Ваши проблемы, но приравнивать к себе остальных не нужно. Шарить и поддерживать такое расширение и не собираюсь, для Ваших проектов оно явно не подойдёт.
Это именно Ваши перекосы в восприятии. Вы пытаетесь создать серебряную пулю, внося в проект бестолковые объекты, тем самым не думая о памяти и других важных вещах. Хотите вечно читать теорию? Да читайте на здоровье. Хотите практиковать - отчасти прислушивайтесь к тому, что Вам говорят "коллеги по цеху" и пробуйте это на практике. Чаще всего, теория остаётся теорией и на практике делается всё иначе. Мы разрабатываем программные продукты, которые, к сожалению, никогда не будут иметь идеальный код. Прежде всего поймите, что описанные в этих статьях подходы - это решения. Решения конкретных проблем. А Вы, получается ничего не решаете, просто усложняете жизнь себе.
Да, было дело, хотел сделать систему, близкую DDD. Болел, как и Вы архитектурой. Теперь имею закрытую, если это можно назвать CMF (Хотя по сути это удобная админ панель для определённого набора компонентов приложения для быстрого старта работы с проектами), на которой, например сейчас реализовывал работу с 6 базами (любительский сервер онлайн игры), так там пул соединений, но единая сущность, работающая с 2 базами. И представляете... Это всё AR! Да ещё и данные об аккаунте в 2 разных базах. Например пароль в одной, а логин в другой. Всё красиво, сущности имеют только необходимую бизнес логику, остальное в сервисах. Вот такая система из этого вышла. Но в опенсорс она не попала в виду того, что она не предназначена для домохозяек и прочего контенгента. Она специфична и используется для проектов, которые разрабатываются узким кругом разработчиков. Хотя до сих пор хочу CMS сделать, как и раньше.maleks писал(а): ↑2019.10.01, 17:26 Да, я помню вы все горели желанием по всем этим правилам цмс-ку собрать, но потом пришли такие, ой у меня ничего не получилось, все фигня. Что этому могли быть за причины?, учитывая вашу как бы так сказать специфичную трактовку ООП, когда даже момент про Low coupling вами не понят, хотя уж о чем, а о нем как раз в каждой ООП книге орут.
Касаемо "непонятых мной моментов", трактовок и т.п. скажу так, что бы не обидеть: не нужно оценивать мои возможности, оценивайте свои. Я давал оценку Вашей архитектуры, т.к. Вы создали данную тему и написал о том, что, по моему мнению не так. Не хотите прислушаться, то хоть не начинайте мне навязывать Ваши, где-то на просторах прочитанные куски теории, которые по большей части Вы не сможете применить на практике.
Уже писали много раз о том, что серебряной пули не бывает. Хотите просто - AR и не выдумывайте лишнего. Нужно красиво - это будет сложно и дорого в любом случае.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
В куске псевдокода, который я приводил тут в теме, показан один из вариантов решения такой проблемы. Всегда видел, как возвращается из репозитория массив сущностей, что я считаю неверным решением.maleks писал(а): ↑2019.10.01, 17:56 Вопрос всем, чем в принципе не устраивает момент когда сущность получая в зависимость интерфейсы репозитариев сможет сама получать нужные ей сущности?
Ну вот как я в примере проверил что коммент присваивается к существующему посту:
Можно это все готовить и снаружи, в сервисах, но ответственность ли это сервисов?
Например такая условная задача:
Запретить редактирование поста если самый первый коммент к нему был запощен пол года назад или ранее.
Разве плохо было бы в сущности сделать проверку:
Для решения подобной задачи я использую возврат т.н. коллекции. По сути объект-итератор, хранящий в себе набор одинаковых сущностей, в который можно инкапсулировать как-раз все кишки, отвечающие за добавление комметариев к посту, что бы получить подобное API
Код: Выделить всё
$comment = new Comment();
$post->getCommentCollection()->addComment($comment);
$blogRepository->updatePost($post);
Последний раз редактировалось BrusSENS 2019.10.01, 21:35, всего редактировалось 1 раз.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x
- BrusSENS
- Сообщения: 565
- Зарегистрирован: 2012.07.26, 06:51
- Откуда: Новороссийск
- Контактная информация:
Re: Пример чистой архитектуры на оценку
Люблю final классы) Так что 2 не вариант вообще)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Режим обслуживания сайта для Yii 2.x.x