ActiveRecord vs DataMapper

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
nds
Сообщения: 26
Зарегистрирован: 2017.09.05, 07:57

ActiveRecord vs DataMapper

Сообщение nds »

Разбираясь с ActiveRecord и DataMapper столкнулся неким недопониманием(возможно в силу малого опыта), а именно не могу найти ключевых критериев по которым я бы выбрал тот или иной подход.
Во многих статьях (в том числе и англо.) дается сухое описание типо:
1. AR это нарушение первого принципа SOLID;
2. AR тяжело тестировать;
3. AR позволяет писать чистый SQL везде где попало.
4. Чем сложнее бизнес-логика тем раздутее становится объект AR
5. AR зло
...
и прочие "минусы", которые я смело могу повторить применяя ту же Doctrine(за исключением пожалуй тестирования).
Применяя ActiveRecord ни что не мешает мне сделать класс User, который будет использоваться только для проецирования данных на таблицу:

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

class User extends ActiveRecord {
	public function table()
	{
		return 'users';
	}
}
ну может добавить в него пару методов, связанных с бизнес-логикой(я бы и при использовании Doctrine их туда поместил):

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

class User extends ActiveRecord {

	private const STATE_ENABLE = 'enable';
	private const STATE_DISABLE = 'disable';
	
	public function table()
	{
		return 'users';
	}
	
	public function isActive()
	{
		// return state
	}
	
	public function hasSocialNet()
	{
		// наличие привязки соц сетей 
	}
}
В общем как понять, когда нужно применять ActiveRecord , а когда DataMapper?
Буду рад примерам, где применение AR вылилось в нечто устрашающее и неподдерживаемое, а применение DataMapper исправило бы ситуацию(или же не привело к такой ситуации).

PS: ВАЖНО: ActiveRecord рассматриваю не в контексте Yii2
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение samdark »

В контексте Yii 2 Active Record несколько более приятный, чем это обычно бывает. Поэтому минусов значительно меньше, чем должно было бы быть...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

ElisDN писал(а): 2019.12.31, 10:21 viewtopic.php?t=43009
Это кака, не надо людей учить так делать, потом будут вас поминать плохими словами, если дойдут до какого-то мало-мальски приличного проекта.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение ElisDN »

yiiliveext писал(а): 2020.01.01, 01:54 если дойдут до какого-то мало-мальски приличного проекта.
Если проект мало-мальски приличный, то сразу возьмут Symfony.

А на Yii они любой проект и без этого кАкой сделают. Так что не переживайте.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

ElisDN писал(а): 2020.01.01, 10:56
yiiliveext писал(а): 2020.01.01, 01:54 если дойдут до какого-то мало-мальски приличного проекта.
Если проект мало-мальски приличный, то сразу возьмут Symfony.

А на Yii они любой проект и без этого кАкой сделают. Так что не переживайте.
Я в том плане, что ваш материал был бы полезен в рамках статьи "Юнит-тестирование классов ActiveRecord", если выкинуть из вашей статьи упоминание домена и репозиторий. А так у людей может создаться иллюзия, что они используют DDD, что на самом деле не так. Вы же прекрасно понимаете, что в DDD со слоистой архитектурой сущности не могут наследоваться от классов фреймворка, это нонсенс.
С тем, что Symfony классная штука и больше подходит для больших проектов, я полностью согласен. Но. Есть еще требования и возможности бизнеса. Банально в Yii порог входа гораздо меньше и разработчиков больше на постсоветском пространстве, а следовательно и стоят они дешевле.
nds
Сообщения: 26
Зарегистрирован: 2017.09.05, 07:57

Re: ActiveRecord vs DataMapper

Сообщение nds »

yiiliveext писал(а): 2020.01.01, 13:21 со слоистой архитектурой сущности не могут наследоваться от классов фреймворка
Собственнно вопрос почти об этом, а точнее чем это черевато. Конечно, это нарушение направленности зависимостей, но к чему это может привести, если тот же yii-шный ActiveRecord я могу использовать по прямому назначению и в случае перехода на др. фреймворк - что крайне маловероятно, мне потребуется не так уж много действий чтобы перетащить код ядра(домена) в нужное место.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

nds писал(а): 2020.01.01, 14:26
yiiliveext писал(а): 2020.01.01, 13:21 со слоистой архитектурой сущности не могут наследоваться от классов фреймворка
Собственнно вопрос почти об этом, а точнее чем это черевато. Конечно, это нарушение направленности зависимостей, но к чему это может привести, если тот же yii-шный ActiveRecord я могу использовать по прямому назначению и в случае перехода на др. фреймворк - что крайне маловероятно, мне потребуется не так уж много действий чтобы перетащить код ядра(домена) в нужное место.
ActiveRecord позволяет легко писать плохо тестируемый, плохо поддерживаемый, плохо читаемый код.
Скажем так, если вы работаете над проектом один и другой разработчик никогда не будет работать над эти проектом, если вы никогда не будете менять фреймворк и источник данных, если вам не нужны быстрые юнит-тесты без танцев с бубном и если вы будете неукоснительно следить за соблюдением некоторого набора простых правил, то можете со спокойной душой использовать ActiveRecord. То же самое справедливо и для команды, если есть грамотный тимлид/техлид, который будет ревьюить 100% кода и бескомпромиссно следить за соблюдением того же набора простых правил (на практике на 100% недостижимо практически никогда).
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение ElisDN »

yiiliveext писал(а): 2020.01.01, 13:21Вы же прекрасно понимаете, что в DDD со слоистой архитектурой сущности не могут наследоваться от классов фреймворка, это нонсенс.
Не совсем. DDD – это про единый язык и выделение ограниченных контекстов. Про дисцилляцию предметной области. Это про философию, а не про код. А AR там или DM в коде с наследованием или без – не суть.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

ElisDN писал(а): 2020.01.01, 23:35
yiiliveext писал(а): 2020.01.01, 13:21Вы же прекрасно понимаете, что в DDD со слоистой архитектурой сущности не могут наследоваться от классов фреймворка, это нонсенс.
Не совсем. DDD – это про единый язык и выделение ограниченных контекстов. Про дисцилляцию предметной области. Это про философию, а не про код. А AR там или DM в коде с наследованием или без – не суть.
Здесь речь шла о слоистой архитектуре, а не о DDD. Понятно, что слоистая архитектура к DDD гвоздями не прибита, но мне показалось, что вы рассматриваете DDD именно в связке со слоистой архитектурой, если это не так, то вопросов нет, можно наследовать что угодно от чего угодно если это не противоречит принципам DDD.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение samdark »

Собственно вопрос почти об этом, а точнее чем это чревато. Конечно, это нарушение направленности зависимостей, но к чему это может привести, если тот же yii-шный ActiveRecord я могу использовать по прямому назначению и в случае перехода на др. фреймворк - что крайне маловероятно, мне потребуется не так уж много действий чтобы перетащить код ядра(домена) в нужное место.
AR удобен. Настолько, что лень пилить репозитории, DTO и вот это всё. Соответственно, есть соблазн везде просто использовать его без каких-то дополнительных прослоек. А ещё реюзать по полной.

В итоге может получиться что на разные контексты используется один класс AR (ну а чё, таблица-то одна!) и в этот класс запихивается бизнес-логика. И вешаются behavior-ы. Ну и формы делать отдельно тоже лениво. AR же может и как форма. А контексты разрулятся сценариями... Как результат — N контекстов зависят от сильно перегруженного класса AR. Поменять что-либо при этом очень сложно — где-то да отвалится...

Конечно, тут сильно зависит от дисциплины, но так бывает часто.
nds
Сообщения: 26
Зарегистрирован: 2017.09.05, 07:57

Re: ActiveRecord vs DataMapper

Сообщение nds »

samdark писал(а): 2020.01.02, 14:46 может получиться что на разные контексты используется один класс AR
Я с запозданием, но все же). Про контексты немного не понял.
Можно простой пример такой ситуации? Я попробую предположить, если не прав - поправьте: допустим имеется некая организация X, которая продает продукт N, и в контексте взаимодействия с обычным обывателем она является Продавцом. Есть еще одна организация Z, которая поставляет для X этот же продукт N и в контексте взаимодействия двух организаций X уже будет являтся Покупателем. И соответственно для организации X необходимо создать две сущности каждая со своим поведением? Если я примерно правильно описал, то как это все дело смапить на БД(не важно AR или DM)?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение ElisDN »

nds писал(а): 2020.01.09, 00:59Если я примерно правильно описал, то как это все дело смапить на БД(не важно AR или DM)?
Да, помимо companies иметь две таблицы buyers и sellers и две сущности. И у них одинаковый id.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

ElisDN писал(а): 2020.01.09, 09:07
nds писал(а): 2020.01.09, 00:59Если я примерно правильно описал, то как это все дело смапить на БД(не важно AR или DM)?
Да, помимо companies иметь две таблицы buyers и sellers и две сущности. И у них одинаковый id.
Не обязательно, может быть и только одна таблица companies для сущности Company и наследующих ее Buyer и Seller.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение ElisDN »

yiiliveext писал(а): 2020.01.09, 09:56 Не обязательно, может быть и только одна таблица companies для сущности Company и наследующих ее Buyer и Seller.
Можно. Но это не совсем будет соответствовать идее реляционной БД, так как нельзя будет проставить NOT NULL.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

ElisDN писал(а): 2020.01.09, 10:17 Можно. Но это не совсем будет соответствовать идее реляционной БД, так как нельзя будет проставить NOT NULL.
Ну и есть же еще вариант, когда сущности Seller и Buyer не хранят каких-либо дополнительных данных, а только реализуют определенное поведение.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение samdark »

Про контексты верно поняли. Не всё то одинаково, что похоже. Разные контексты со временем имеют свойство расходиться всё сильнее (если бизнес эволюционирует). Поэтому как минимум стоит бизнес-логику из двух контекстов никогда не засовывать в один класс как yiiliveext советует (если не на 100% уверены, что оно так и останется общим). Как максимум ещё и данные разнести как ElisDN говорит.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

samdark писал(а): 2020.01.09, 13:31 Поэтому как минимум стоит бизнес-логику из двух контекстов никогда не засовывать в один класс как yiiliveext советует (если не на 100% уверены, что оно так и останется общим).
А можно поподробнее, это где я такое советую?
И насколько я понял ElisDN, он предлагает не разнести данные, а хранить дополнительные данные наследников в отдельных таблицах, как JOINED в доктрине.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: ActiveRecord vs DataMapper

Сообщение ElisDN »

yiiliveext писал(а): 2020.01.09, 14:14И насколько я понял ElisDN, он предлагает не разнести данные, а хранить дополнительные данные наследников в отдельных таблицах, как JOINED в доктрине.
Нет. Я советую разнести на отдельные сущности без наследования.

Почти как в https://elisdn.ru/blog/86/module-relations-on-yii2, только в одном модуле.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ActiveRecord vs DataMapper

Сообщение yiiliveext »

ElisDN писал(а): 2020.01.09, 15:47 Почти как в https://elisdn.ru/blog/86/module-relations-on-yii2, только в одном модуле.
Подход, скажем так, сомнительный. Если еще для интеграции чужих модулей с натяжкой можно использовать, то для создания своей системы независимых модулей я бы его не советовал. Гораздо лучше получается через интерфейсы, внедрение зависимостей и композицию.
Ответить