[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ActiveRecord в боевом применении.
Страницы: 1, 2, 3, 4, 5, 6
twin
Да там есть и ленивая и жадная загрузка. Не в этом проблема.

Другими словами, как мне получить объекты акций, которые сейчас я получаю SQL запросм (можно даже хитрее):
SELECT * FROM `promotions` 
WHERE `id` IN (тут список полученных ранее `id_promotion`)
AND `date_start` >= NOW() AND `date_end` <= NOW()
Если они должны выбираться отдельно, а не как связанные с конкретным продуктом. Вытаскивать их всех, а потом искать среди них нужные? А если их очень много? Выбирать запросом, DDD не позволяет, я говорил уже. :(
Или я чего то не понимаю, или Active Record использовать в DDD можно только через задницу. О чем собственно и говорилось.

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

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

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

user posted image
Guest
twin, используй репозиторий
twin
Использовать не проблема. Проблема создать. О чем я и спрашиваю. Мне все возможные варианты поместить в репозиторий? Какой тогда смысл в Active Record? И не слишком ли это жирно будет?

Вот вариант с CQRS я даже рассматривать не хочу. Потому что на кой мне нужно два параллельных хранилища, да еще и принцип испортится. Я же не просто магазин сляпать хочу. Он бы работал давно уже. Я хочу по полной программе использовать AR.

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

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

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

user posted image
Guest
Цитата (twin @ 4.04.2018 - 14:54)
Какой тогда смысл в Active Record?

Концепция репозитория не конфликтует с ар и не как не ущемляет ее
twin
Конфликтует, и еще как. Репозиторий, это хранилище готовых и самодостаточных объектов. AR - это инструмент для изготовления объектов, чаще всего на основе реляционных хранилищ.

Вот я и хочу понять, как этот конфликт нивелировать с минимальными потерями. Пока получается плохо. sad.gif

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

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

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

user posted image
chee
twin, я тем там не вижу того что ты говоришь. Ты неправильно интерпретируешь паттерн репозиторий

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Ну может мы с разных сторон смотрим. Вот из твоей ссылки:
Цитата
Паттерн Repository посредничает между слоем области определения и слоем распределения данных, работая, как обычная колекция объектов области определения.
Он не создает объектов, он их коллекционирует. А значит по сути хранит. Меня же интересовал как раз момент создания. В этой части репозиторий просто бесполезен. Он много раз мне попадался, и много раз я видел, что использовать его для создания объектов - моветон. Вот допустим неплохая статья.

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

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

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

user posted image
twin
Нашел что-то более менее подходящее. Так называемая луковая или гексагональная архитектура. Они очень похожи, я пока не выбрал. Но принцип обоих вполне подходит для "правильного" использования AR в ООП.

Все новое, хорошо забытое старое. Я мельком рассматривал их, когда сочинял систему мидлваров для фреймворка. И сейчас, видимо интуитивно, я сделал примерно тоже самое. Те же кольца, так же запрос идет снаружи внутрь и обратно.

В двух словах (см. картинку). Внутренность розового цвета, это и есть та самая, преславутая доменная модель. Её можно вполне безболезненно строить по всем правилам DDD, нужно только абстрагироваться от механизмов, и рассуждать исключительно с точки зрения объектов. Нет там ничего, кроме объектов. Ни классов, ни функций, ни базы данных. Только сущности, VO и DTO. Ну может совсем чуток сервисов, хотя лучше без них. Там нужно рассматривать только взаимодействия и общение.

И совершенно не важно, откуда и как берутся эти объекты. Если исползуется AR и РСУБД, ничего страшного в этом нет. Больше скажу (тут я вынужден не согласиться с многоуважаемым Сантехником), ничего страшного нет даже в использовании элементов DAO, если делать это в разумных пределах. Важен результат - в итоге должны появляться объекты, и общаться между собой должны на уровне объектов.

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

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

Второй слой - зеленый, это приложение. Это сцена с реквизитом и суфлерской будкой. Вот тут уже строится логика поведений согласно сценарию.

Ну а всякие гримерки, раздевалка для зрителей, партер и буфет - это третий слой - фреймворк или инфраструктура. Он обеспечивает комфорт для зрителей и актеров.

Как я понял принцип этой архитектуры (нужно конечно еще долго разбираться в тонкостях), это независимость, но и тесное сотрудничество слоев. Труппа может поехать на гастроли (доменная модель не должна быть жестко привязана к сцене приложению), а уж тем более к театру фреймворку. На сцене может играть и другая труппа. В театре можно поставить разные спектакли, а то и съезд какой-нибудь Единой России провести. smile.gif

Резюмируя самое главное. Не важно, каким образом генерируются и сохраняются объекты. Важно, что бы логика строилась на их взаимодействиях, а не на линейной обработке полученных от них данных. Тогда не особо важно, AR используется, DataMapper или черт в табакерке.

Вопросов конечно много осталось, но направление кажется я все же выбрал. smile.gif

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

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

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

user posted image
twin
На повестке дня теперь стоит вопрос анемичности моделей. По такой схеме велик соблазн всю бизнес-логику разместить в слое приложения. Но Фаулер говорит - аяаяй. Хотя многим нравится. Вот и дядя Боб что то говорил про недопустимость логики в AR.

Но я нкогда слепо не молился на паттерны, можно и немного нарушить SOLID. Тем более, что Фаулер мне импонирует больше.

И вот теперь очередной вопрос встал. Прокинуть калькулятор скидок в класс товара, или пусть висит в слое приложения?

Кстати, а где вообще распологать сами классы AR? По сути это же билдеры (или фабрики, хотя мне кажется тут это название паттерна не подходит). Само напрашивается сделать еще один слой между доменной моделью и приложением. Сделать его пограничным и в нем разместить доменную логику. Вроде логично получается...

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

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

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

user posted image
chee
Цитата (twin @ 4.04.2018 - 19:01)
Он много раз мне попадался, и много раз я видел, что использовать его для создания объектов - моветон. Вот допустим неплохая статья.

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

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee
Цитата (twin @ 4.04.2018 - 19:39)
На повестке дня теперь стоит вопрос анемичности моделей.

давай определимся, модели это сущности или это модель из терминологии DDD?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 4.04.2018 - 16:30)
Чувак в статье воспринимает репозиторий как коллекцию, утверждений в статье нет.

Это он у Вернона подглядел. Но суть не в том. Если на репозоторий возложить ответственность создания сущностей, это в лучшем случае будет надстройка над AR, а в худшем - параллельная структура. Ни то ни другое мне не нужно пока.

Цитата (chee @ 4.04.2018 - 16:36)
давай определимся, модели это сущности или это модель из терминологии DDD?
Если следовать сухой логике, то ни то, ни другое. Если разговор о модели идет в поскости наличия или отсутствия бизнес-логики в виде методов, то это класс, инициирующий сущность. Я имел ввиду именно это, когда говорил о Фаулере и Мартине.
Вот Michael цитату дяди Боба приводил:
Цитата
К сожалению, разработчики часто пытаются интерпретировать такие структуры
данных, как объекты, и включают в них методы, реализующие бизнес-логику.


В данном случае имеются ввиду наследники Active Record. Если я правильно понял опять же. Хотя он четко говорит - объекты.

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

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

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

user posted image
twin
Кстати, тут нужно уточнить. Я, кроме той цитаты, с удивлением увидел у Мартина еще вот это:
Цитата
Объекты скрывают свои данные за абстракциями и предоставляют функции, работающие с этими данными. Структуры данных раскрывают свои данные и не имеют осмысленных функций.
И вот еще:
Цитата
Объекты предоставляют поведение и скрывают данные. Это позволяет программисту легко добавлять новые виды объектов, не изменяя существующего поведения.

Мне кажется от этого и вся путаница в интерпретации AR. Он вообще дал изначально неверную трактовку объектов. Дело в том, что объект никогда не предосталяет никаких функций. Он может только ссылаться на класс, который эти функции предоставит. Так что он прав в части того, что объект AR - это структура данных. Но не прав в том, что в него добавляется поведение. Поведение добавляется в класс. Любой класс AR может создать как сущность, так и коллекцию сущностей. Причем может изменить структуру (те же типы атрибутов) или преобразовать их, или генерировать события или еще много чего. Класс и объект - совершенно разные вещи. В итоге нет никакого нарушения SOLID.

Так что модели, это однозначно классы, в которых можно/нужно размещать часть бизнес-логики, относящейся к деятельности базирующихся на нем сущностей. Соответственно можно разместить их в слое (фиг знает как назвать) между приложением и доменом. Тогда объекты будут тусоваться в своей песочнице по законам DDD, а приложение будет технически общаться с классами. И никакой разрухи (с). smile.gif

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

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

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

user posted image
chee
twin, я сваливаю, ты какой-то дубовый.

Сам создаешь проблемы, сам решаешь, просишь советов, но советов не слушаешь, умудряешься интерпретировать простые и понятные вещи, какой-то безумной "теологией". Ну и плюс, спустился до уровня адептов "луковой архитектуры", которые обычную практику разделения кода на ответственности(слои) называли "луковой" или "гексагональной". Я все, кончился.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
А я что, держал кого то? blink.gif Кончился, не успев начаться.
Цитата (chee @ 4.04.2018 - 18:19)
Сам создаешь проблемы, сам решаешь,
А кто еще кроме меня? Чет очереди желающих помочь не наблюдается. biggrin.gif
Цитата (chee @ 4.04.2018 - 18:19)
просишь советов, но советов не слушаешь,
А где советы то были? Видосики про негра? Выбр пачками, ленивая загрузка и репозиторий? Это советы? Это как чукча советовал геологам, как застрявший вездеход вытащить. Трактор нужно, однако!

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

По сути то ничего толком не сказал. Я да, мечусь туда-сюда, ибо поле для меня незнакомое. Рассуждаю вслух. Не стесняюсь нубом показаться. Ты пару фраз ниочем написал и сдулся. Да и ради Бога, пользы все равно практически никакой.

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

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

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

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

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