Тонкий контроллер, всё в моделях

Вурдалак

Продвинутый новичок

MiksIr

miksir@home:~$
Вурдалак, а разве инкапсуляция говорит что-то об ответственности модели? Вроде она говорит, что есть данные - и есть логика работы с данными рядом с данными. А какие данные уже - пофиг. Пусть данные модели, метаданные таблиц в одной модели - это нарушение других принципов как бы. Да, знание о хранилище должно быть инкапсулированно в отдельный объект, но не потому, что это нарушает инкапсуляцию, а потому что нарушает другие принципы. Как я это вижу.

>Почему ты противопоставляешь AR и анемичную модель?
Не, я этого не делал. Анемичная модель может быть где угодно, хоть в AR, хоть в DM. Это "противопоставление" - всего лишь был взгляд на яблоко и стул со стороны инкапсуляции.

Вообще-то один из самых главных признаков: модель рассматривается как структура данных, меньше уделяется внимания API модели.
Признак, но не критерий. Анемичность скорее всего не может быть без геттеров и сеттеров (если не брать пхп как основу), но наличие геттеров и сеттеров не говорит об анемичности, вот что я хотел сказать. Хотя может провоцировать ее со стороны тех, кто будет далее использовать эту модель в своем коде.
 

hell0w0rd

Продвинутый новичок
Vano, у тебя есть основное условие поиска и второстепенные. Например тебе нужно найти заблокированных юзеров - это основное условие, а кол-во, сортировка - это второстепенные.
Поэтому делаешь метод с такой сигнатурой User::findAllBanned($count, $offset, $order); на пример. Тогда все логично и красиво.
Другое дело, что такой подход часто не работе, ибо основных правил несколько и получается что ты создаешь метод исключительно под 1 контроллер, но что поделать:)
PS вот как обычно тут у нас. Спросили про одно, а вы пошли в разнос
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Вурдалак, я не умею читать мысли и ленюсь читать весь код приложения.
кишки AR скрывается в предках класса точно так же, как неявное описание модели в yml-файле, и совершенно незаметны в работе
 

Вурдалак

Продвинутый новичок
я не умею читать мысли и ленюсь читать весь код приложения.
механизм работы с AR скрывается в предках класса точно так же, как в yml-файле, и совершенно незаметен
Да, я согласен, ты тут вообще не в тему, чувак. :) И кто бы говорил про бузину и дядьку.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
прости, но я не вижу приниципиального отличия.
класс, маппинг которого на базу описывается через конфиг или в аннотациях, принципиально отличается от такого же с описанием мапинга в массиве?
ладно, это уже религия
 

Вурдалак

Продвинутый новичок
Это ты меня прости, меня слабо интересует спор DM vs AR, это унылая тема, я хотел поговорить на тему затронутой anemic domain model.
 

fixxxer

К.О.
Партнер клуба
Вурдалак, чем anemic model отличается от тупого value object (иными словами структуры с рефлексией)? Мне вот кажется, что ничем. :) А пошло это от EJB, наверное, для упрощения кодогенерации.
 

Вурдалак

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

Начиная вот с того момента, как ты ответил на мой пост:
Doctrine использует рефлексию, она не требует сеттеры, геттеры (JavaBean), никто не заставляет выкидывать из твоей модели логику. Ну да, примеры из мануалов — это anemic domain model, но мы же взрослые люди, мы знаем что пишут в мануалах. :)
Когда тебе привели реальный пример о чем идет речь:
Ты сказал, что это вовсе не Doctrine и «вывсеврети»:
нет, Route - не AR и не доктрина. традиционная бузина в огороде
Потом понял, что обосрался:
Вурдалак, я не умею читать мысли и ленюсь читать весь код приложения
и решил съехать на тему DM vs AR, рассказывая про то какие они одинаковые.
 

Вурдалак

Продвинутый новичок
Вурдалак, чем anemic model отличается от тупого value object (иными словами структуры с рефлексией)? Мне вот кажется, что ничем. :) А пошло это от EJB, наверное, для упрощения кодогенерации.
Мне не нравится, что ты это называешь value object. VO — это immutable-структура, которая вполне может содержать бизнес-логику. Ты имеешь в виду DTO? Да, это DTO. Ну и? Я же против anemic.
 

fixxxer

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

Вурдалак

Продвинутый новичок
Вурдалак, ага, DTO, вот уже хотел отредактировать, да опоздал. Не, ничего, просто для уточнения. В некоторых случаях "под капотом" DTO и скрывается. А вытаскивать его в паблик - не, ну так вроде уже никто не делает, это ж в чистом виде олдскульная процедурщина со структурой и функциями получается.
А под «пабликом» что ты подразумеваешь? И под «капотом» чего, соответственно? :)
 

fixxxer

К.О.
Партнер клуба
А под «пабликом» что ты подразумеваешь? И под «капотом» чего, соответственно? :)
1) ActiveRecord, где "под капотом" dto как представление table row
2) В языке без рефлексий я вполне могу себе представить его использование (вероятно, совмещенного с кодогенерацией) для обмена данными и метаинформацией с персистером для избежания лишних тяжелых операций копирования.
 

Вурдалак

Продвинутый новичок
1) ActiveRecord, где "под капотом" dto как представление table row
А вытаскивать его в паблик - не, ну так вроде уже никто не делает, это ж в чистом виде олдскульная процедурщина со структурой и функциями получается.
В том-то и дело, что людям нравится пихать логику в сервисы, а сеттеры и геттеры они очень любят, я не буду показывать пальцем, но точно помню такие высказанные мысли у некоторых участников этого форума. Да и потом, все известные мне AR наружу всё равно выпячивают setters/getters, и по закону Мёрфи обязательно будет код, который юзает их напрямую, если только ты не работаешь один. :) Правда опять что-то речь про AR зашла, а у меня на это аллергия.

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

MiksIr

miksir@home:~$
А есть еще питон, у которого вообще все на соглашениях, и по закону Мёрфи...
А описанные проблемы, имхо, это не проблемы геттеров и сеттеров, это проблемы разработчика класса, который не включил эти геттеры и сеттеры в логику модели. В конце концов, если кому-то приспичит создать анемичную модель, он просто пойдет и поменяет ваш класс засунув туда нужные ему геттеры и сеттеры. Так что стоит разделять геттеры/сеттеры и анемичность. А плохо или хорошо геттеры/сеттеры - вообще какой-то сферический конь.
 

fixxxer

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