Мой длинный и запоздалый ответ, даже не полный, но хорошее объяснение, ПОЧЕМУ я ненавижу этот шаблон, мнения и даже некоторые эмоции:
1) краткая версия: Active Record создает « тонкий слой » « сильной связи » между базой данных и кодом приложения. Которая не решает ни логических, ни каких бы то ни было проблем, вообще никаких проблем. IMHO он не предоставляет НИКАКОГО ЗНАЧЕНИЯ, кроме некоторого синтаксического сахара для программиста (который затем может использовать «синтаксис объекта» для доступа к некоторым данным, которые существуют в реляционной базе данных). Усилия по созданию некоторого комфорта для программистов должны (IMHO ...) лучше быть вложены в инструменты доступа к базам данных низкого уровня, например, некоторые варианты простых, легких, простых hash_map get_record( string id_value, string table_name, string id_column_name="id" )
и подобных методов (конечно, концепции и элегантность сильно варьируются в зависимости от используемый язык).
2) длинная версия: в любых проектах, основанных на базе данных, где у меня был «концептуальный контроль», я избегал AR, и это было хорошо. Я обычно строю многоуровневую архитектуру (вы рано или поздно делите свое программное обеспечение на слои, по крайней мере, в проектах среднего и большого размера):
А1) сама база данных, таблицы, отношения, даже некоторая логика, если СУБД позволяет это (MySQL теперь тоже вырос)
A2) очень часто существует нечто большее, чем просто хранилище данных: файловая система (большие двоичные объекты в базе данных - не всегда хорошее решение ...), устаревшие системы (представьте себе, «как» они будут доступны, возможно множество разновидностей .. но это так. не суть ...)
B) уровень доступа к базе данных (на этом уровне методы инструментов, помощники для легкого доступа к данным в базе данных очень приветствуются, но AR не предоставляет здесь никакой ценности, кроме некоторого синтаксического сахара)
C) уровень объектов приложения: «объекты приложения» иногда представляют собой простые строки таблицы в базе данных, но в большинстве случаев они в любом случае являются составными объектами, и к ним присоединена некоторая более высокая логика, поэтому вкладывать время в объекты AR на этом уровне просто бесполезно. , пустая трата драгоценного времени программистов, потому что «реальная ценность», «высшая логика» этих объектов должна быть реализована поверх объектов AR, в любом случае - с AR и без! И, например, зачем вам абстракция «Объекты записей журнала»? Код логики приложения записывает их, но должен ли он иметь возможность обновлять или удалять их? звучит глупо, и App::Log("I am a log message")
его легче использовать, чемle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. И, например: использование «объекта записи журнала» в представлении журнала в вашем приложении будет работать для 100, 1000 или даже 10000 строк журнала, но рано или поздно вам придется оптимизировать - и я уверен, что в большинстве случаев вы просто используйте этот небольшой красивый оператор SQL SELECT в логике своего приложения (который полностью разрушает идею AR ...) вместо того, чтобы оборачивать этот небольшой оператор в жесткие фиксированные рамки идеи AR с большим количеством кода, обертывающего и скрывающего его. Время, которое вы потратили на написание и / или построение кода AR, можно было бы вложить в гораздо более умный интерфейс для чтения списков записей журнала (во многих случаях пределом нет). Программистам следует осмелиться изобретать новые абстракции, чтобы реализовать логику своего приложения, которая подходит для предполагаемого приложения, а не тупо повторно реализовывать глупые шаблоны.Звучит хорошо на первый взгляд!
D) логика приложения - реализует логику взаимодействия объектов и создания, удаления и перечисления (!) Объектов логики приложения (НЕТ, эти задачи редко должны быть привязаны к самим объектам логики приложения: говорит ли лист бумаги на вашем столе вы имена и расположение всех других листов в вашем офисе? Забудьте "статические" методы для перечисления объектов, это глупо, плохой компромисс, созданный для того, чтобы человеческий образ мышления вписался в [некоторые-не-все-AR-фреймворки -] AR мышление)
E) пользовательский интерфейс - ну, то, что я напишу в следующих строках, очень, очень, очень субъективно, но, по моему опыту, проекты, построенные на AR, часто игнорировали UI-часть приложения - время было потрачено на создание непонятных абстракций. . В конце концов, такие приложения тратят много времени кодировщиков и ощущаются как приложения от кодеров для кодеров, ориентированные на технические аспекты как внутри, так и снаружи. Кодировщики чувствуют себя хорошо (наконец-то тяжелая работа сделана, все закончено и правильно, в соответствии с концепцией на бумаге ...), а заказчики «просто должны понять, что так должно быть», потому что это «профессионально» .. окей извините, я отвлекся ;-)
Что ж, по общему признанию, все это субъективно, но это мой опыт (исключая Ruby on Rails, он может быть другим, и у меня нет практического опыта в этом подходе).
В платных проектах я часто слышал требование начать с создания некоторых объектов «активной записи» в качестве строительного блока для логики приложения более высокого уровня. По моему опыту, это заметно частобыло своего рода оправданием того, что заказчик (в большинстве случаев компания, занимающаяся разработкой программного обеспечения) не имел хорошей концепции, широкого представления, представления о том, каким должен быть продукт. Эти клиенты мыслят в жестких рамках («в проекте десять лет назад он работал хорошо ...»), они могут конкретизировать сущности, они могут определять отношения сущностей, они могут разрушать отношения данных и определять базовую логику приложения, но затем они останавливаются и передайте его вам, и подумайте, что это все, что вам нужно ... им часто не хватает полной концепции логики приложения, пользовательского интерфейса, удобства использования и так далее, и так далее ... им не хватает широкого обзора и любви к подробности, и они хотят, чтобы вы следовали тому образу жизни AR, потому что ... ну, почему это сработало в этом проекте много лет назад, заставляет людей быть занятыми и молчать? Я не знаю. Но «подробности» отделите мужчин от мальчиков, или .. как был оригинальный рекламный слоган? ;-)
По прошествии многих лет (десять лет активного опыта разработки), всякий раз, когда заказчик упоминает «активную схему записи», у меня звонит сигнал тревоги. Я научился пытаться вернуть их к этой важной фазе зачатия , позволить им подумать дважды, попытаться показать свои концептуальные слабости или просто избегать их вообще, если они не различают (в конце концов, вы знаете, покупатель, который еще не знает, чего хочет, может даже думает, что знает, но не знает, или пытается бесплатно передать концептуальную работу МНЕ, стоит мне много драгоценных часов, дней, недель и месяцев моего времени, жить слишком мало ...).
Итак, наконец: ЭТО ВСЕ - вот почему я ненавижу этот глупый «шаблон активной записи», и я ненавижу и буду избегать его, когда это возможно.
РЕДАКТИРОВАТЬ : Я бы даже назвал это без шаблона. Это не решает никаких проблем (шаблоны не предназначены для создания синтаксического сахара). Это создает много проблем: корень всех его проблем (упомянутых во многих ответах здесь ..) заключается в том, что он просто скрывает старый добрый, хорошо разработанный и мощный SQL за интерфейсом, который по определению шаблонов чрезвычайно ограничен.
Этот шаблон заменяет гибкость синтаксическим сахаром!
Подумайте, какую проблему решает для вас AR?