Как распознать Active Record?

Фанат

oncle terrible
Команда форума
Тут вот чувак сделал "каминг-аут", https://thecodingmachine.io/tdbm5-coming-out

Я не все из его объяснений понял. Собственно, вот эта часть поставила меня в тупик:
Avoiding the active record pitfalls
The active record pattern violates the single responsibility principle (objects used to query the database are the same that hold data)
Not in TDBM. TDBM does a strict distinction between Repositories (also called DAOs) that are used to perform the query and Models (also called beans or entities) that map rows. In that regard, TDBM is not an active record ORM.
А почему он тогда в принципе называет свой фреймворк эктив рекородом?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Сам по себе AR не может нарушать SRP, только конкретные реализации могут. Можно легко написать реализацию AR, которая будет работать c отдельным DAO, и не будет нарушать SRP. По-моему, у него не очень с пониманием. (Или терминологией)
 

fixxxer

К.О.
Партнер клуба
А где там вообще ORM? То, что я вижу - это DBAL с плюшками.

Вот есть у меня тщательно выпиленный напильником class User с бизнес-логикой. И куда мне его там, простите, засунуть?

От одной замены php-шного array на автогенеренные классы ORM не получится. ORM нужен, чтобы мапить мои объекты, а не какие-то там им же сгенеренные (чего там мапить-то, если сам сгенерил один в один как в базе?)

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

Фанат

oncle terrible
Команда форума
По-моему, у него не очень с пониманием. (Или терминологией)
Ну, с терминологией у него точно не очень, он называл таблицы-связки многие ко многим пивот-таблицами, пока его не поправили.
Сам по себе AR не может нарушать SRP, только конкретные реализации могут. Можно легко написать реализацию AR, которая будет работать c отдельным DAO, и не будет нарушать SRP.
Так а в чем тогда отличительный признак АР? Вот Мартин нашевсё Фаулер фиолетовым по белому вещает, "putting data access logic in the domain object."

Я, видимо, всю жизнь неправильно понимал смысл АР. Вот сейчас хочу понять )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ну, я допускаю, что я не прав, и что если сделать AR у которого наружный DAO, он перестанет быть AR. =) Я не утверждаю, что я сам в терминологии силен)) Но с моей точки зрения, отличительная особенность AR именно в том, что он торчит наружу реляционной записью в таблице, а не обьектом бизнес-логики.
 

fixxxer

К.О.
Партнер клуба
А какой смысл пытаться применять термины, определяющие тип ORM, не к ORM?
 

Фанат

oncle terrible
Команда форума
А какой смысл пытаться применять термины, определяющие тип ORM, не к ORM?
Ну, DM vs. AR это практически единственная тема, в которой я хоть немного разбираюсь - поэтому просто интересно.
Ну то есть, думал что разбираюсь :)
 

fixxxer

К.О.
Партнер клуба
Маппинг нужен потому, что есть объективно существующая проблема impedance mismatch.
Если структура свойств объекта 1 в 1 соответствует таблице, это такой примитивный случай, что даже обсуждать неинтересно. PDO::FETCH_CLASS, ну.

А не ORM это хотя бы потому, что тут вообще нет M. Не, ну можно сказать, что под M подразумевается persistence model, но на нее-то кто реальные domain models мапить будет?
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Если структура свойств объекта 1 в 1 соответствует таблице
Ну я не думаю что там все до такой степени.
Просто направление другое - у тебя уже есть объект со своими плюшками и для него надо сделать персистенс
А тут есть персистенс, который генерит базовый объект, к которому ты можешь прицепить плюшки после
 

MiksIr

miksir@home:~$
Пробежался мельком - имхо, примитивный датамапер. Почему он его назвал AR понять сложно. Что бы AR был AR - необходимо, что бы в объекте а) был интерфейс сохранения в базу и б) была бизнес-логика (ибо если ее нет - это будет Row Data Gateway). У него же поиском и сохранением занимается "DAO", которое по сути своей является мапером.
 

MiksIr

miksir@home:~$
Да не тянет это на DM, там ж автогенеренные классы
Эм, а какая связь между автогенерацией и паттерном? Имхо, датамапер - это когда у нас мапом между сущностью и базой занимается мапер. Ну... и все. А сгенерен уж этот мапер или нет, какая разница. Нужно нам поменять способ мапа - влезаем в FooDao (который мапер) и меняем. Эти маперы у него довольно независимы, т.е. не наследуются от чего-то базового, а используют агрегацию.

А вот с самой сущностью все не очень хорошо. В попытках "упростить" он сделал общий класс, от которого наследуются сущности и вхреначил туда подобие UoW для слежения за статусом сущности (новая / измененная и т.п.). Убрать бы вот эту херню и можно будет спокойно свои сущности подсовывать.
 

fixxxer

К.О.
Партнер клуба
@MiksIr, так там не маппер генерируется, а то, что он почему-то называет моделью.

@Фанат, я так понял, что у него там "автогенерено, руками не трогать".
 

MiksIr

miksir@home:~$
Там генерируется и мапер и сущность (он ее beans называет). Т.е. для User генерируется User и UserDAO, все find/save в UserDAO, а данные - в User.
Руками там трогать можно, именно для этого он генерит UserAbstract и UserDAOAbstract... типа, что бы вносить изменения в основные классы, а вся автогенеренная мутатень в абстрактных.
Но вот сделать "модели" полностью независимыми от персиста - такого нет, это фигня. Пытался типа упростить, видимо.
 

fixxxer

К.О.
Партнер клуба
А, я так глубоко не вникал, ну понятно, типичная банальная persistence model-фигня с наследованием. Таких недо-орм как дерьма за баней, ничего интересного.
 
Сверху