2009-02-04 5 views
4

Я начинаю новый проект, и недавно я нашел проект активизации замкового проекта, который выглядит как БОЛЬШОЕ решение, но в то же время он выглядит как нечто реальное нетрадиционное. Мне было интересно, это чувство приходит от изучения чего-то нового (и я должен просто привыкнуть к нему) или это действительно плохая практика?Является ли ActiveRecord плохой практикой?

ответ

4

ActiveRecord - это шаблон дизайна, впервые названный Мартином Фаулером в Шаблоны корпоративных прикладных архитектур. Он довольно распространен и широко используется в популярном Ruby framework Rails.

Это контрастирует с более обычным стилем развития в мире .Net, который должен использовать DAO, и это, возможно, объясняет, почему вам неловко.

Предложение: прочитайте исходный код для некоторых приложений Ruby on Rails, которые похожи на ваши собственные проекты, и оцените, как вам нравится стиль дизайна, который является результатом интенсивного использования ActiveRecord.

3

Это неплохое решение, но оно имеет свои недостатки.

В шаблонах архитектуры корпоративных приложений Мартин Фаулер описывает несколько способов проектирования приложений, построенных на базе базы данных. Эти методы отличаются тем, как приложение отделено от базы данных. Он также описывает, что более развязка делает более сложные приложения возможными. Active Record описывается как способ разработки более простых приложений, но для приложений с более сложным поведением вам нужна модель домена, которая не зависит от базы данных и что-то вроде объектно-реляционного сопоставителя между ними.

+1

Я был бы признателен, если бы вы могли использовать некоторые примеры, в которых использование активной записи является плохим решением. – Orentet

0

ActiveRecord очень хорошо работает в Ruby, но его легко переносить на все языки. Центральным подвигом AR является метафора table = class, row = instance. Это выглядит довольно элегантно в Ruby, потому что классы также являются объектами. В других языках классы обычно представляют собой особый тип конструкции, и тогда вам нужно пройти всевозможные обручи, чтобы они работали, как должным образом. Это устраняет некоторые естественные ощущения, которые он имеет в Ruby.

0

Нет, это не плохая практика. Даже в .NET это довольно хорошо зарекомендовавший себя шаблон. SubSonic (http://subsonicproject.com) и LINQ to SQL также используют шаблон.

Реализации шаблона, такие как Subsonic, отлично подходят для быстрого и легкого создания уровня доступа к данным, который управляет CRUD для вашего приложения.

Это не значит, что это хорошее решение для всех систем. Для больших сложных систем вы, вероятно, хотите иметь меньшую связь с хранилищем данных.

0

Смесь объекта домена с уровнем обслуживания является самой большой плохой практикой (если вы видите это как плохую практику). Вы в конечном итоге вызываете user.Save(), что означает, что если вы хотите изменить ORM, вы полагаетесь на этот шаблон. В 2 альтернативы слой ака набора классов фасадных выполнять свои операции CRUD, или поместить это внутри объекта домена, как что-то вроде

User.Service.Save(user); 

Если вы используете .NET, то ActiveRecord, очевидно, на основе ActiveRecord, Coolstorage, Subsonic и few others.

5

Часть того, что мне показалось странным в использовании ActiveRecord, должно было наследовать от ActiveRecordBase<T> и иметь все эти методы сохранения на вашем объекте (Save и т. Д.).

Но, оказывается, вам не обязательно! Вместо того, чтобы, скажем:

[ActiveRecord] 
class Customer : ActiveRecordBase<Customer> { } 

Вы можете просто

[ActiveRecord] 
class Customer : inherit from whatever you want { } 

, а затем использовать ActiveRecordMediator<Customer>. Он имеет в основном те же статические методы, что и у ActiveRecordBase<T>, но таким образом вам не нужно загромождать вашу объектную модель ими. Если вам не нужны различные защищенные вызовы событий метода в ActiveRecordBase<T>, это упростит ситуацию.

Смежные вопросы