Вопрос

В последнее время, благодаря популярности Rails, многие люди начинают использовать ActiveRecord в качестве модели.однако до того, как я услышал о рельсах (моя группа сверстников не была поклонником материалов с открытым исходным кодом, нас учили в школе .NET...) и пока я работал над своим выпускным проектом, я нашел это определение модели

Модель представляет корпоративные данные и бизнес-правила, которые регулируют доступ к этим данным и их обновление.Часто модель служит программной аппроксимацией реального процесса, поэтому при определении модели применяются простые методы моделирования реального мира.

он не говорит, что модель должна представлять одну таблицу, как это делает activerecord.И обычно в рамках транзакции может потребоваться запросить несколько несвязанных таблиц, а затем манипулировать данными из разных таблиц...поэтому, если в качестве модели используется activerecord, то либо придется втиснуть весь логический код в контроллер (что довольно популярно в некоторых php-фреймворках), что затрудняет тестирование или взлом модели activerecord, чтобы она выполняла операции с базой данных на не только таблица, с которой она сопоставляется, но и другие связанные таблицы...

Итак, что же такого хорошего в злоупотреблении (ИМХО) activerecord в качестве модели в архитектурном шаблоне MVC?

Это было полезно?

Решение

Мартин Фаулер описал этот шаблон в книге «Шаблоны архитектуры корпоративных приложений» вместе с двумя другими шаблонами или архитектурами.Эти шаблоны хороши для разных ситуаций и разной сложности.

Если вам нужны только простые вещи, вы можете использовать сценарий транзакции.Эту архитектуру вы видели на многих старых страницах ASP и PHP, где один сценарий содержал бизнес-логику, логику доступа к данным и логику представления.Это быстро разваливается, когда все становится сложнее.

Следующее, что вы можете сделать, это добавить некоторое разделение между презентацией и моделью.Это активная запись.Модель по-прежнему привязана к базе данных, но у вас немного больше гибкости, поскольку вы можете повторно использовать свою модель/доступ к данным между представлениями/страницами/что угодно.Это не так гибко, как могло бы быть, но в зависимости от вашего решения по доступу к данным оно может быть достаточно гибким.Такие фреймворки, как CSLA в .Net, имеют множество аспектов этого шаблона (я думаю, что Entity Framework тоже слишком похож на этот).Он по-прежнему может справляться со многими сложными задачами, не становясь при этом неподдерживаемым.

Следующий шаг — разделение уровня доступа к данным и вашей модели.Обычно для этого требуется хороший картограф ИЛИ или большая работа.Так что не все хотят идти по этому пути.Многие методологии, такие как предметно-ориентированное проектирование, описывают этот подход.

Так что все дело в контексте.Что вам нужно и какое решение лучше.Я даже до сих пор иногда использую скрипт транзакции для простого одноразового кода.

Другие советы

Я много раз говорил, что использование Active Record (или ORM, что почти то же самое) в качестве бизнес-моделей — не очень хорошая идея.Позволь мне объяснить:

Тот факт, что PHP является открытым исходным кодом, является бесплатным (и вся эта длинная история...) дает ему возможность использовать огромное сообщество разработчиков, размещающих код на форумах, таких сайтах, как GitHub, код Google и так далее.Вы можете считать это хорошей вещью, но иногда это не так уж и хорошо.Например, предположим, что вы столкнулись с проектом и хотите использовать платформу ORM для решения вашей проблемы, написанную на PHP, ну...у тебя будет много варианты выбора для:

  • Доктрина
  • продвигать
  • QCodo
  • оцепенение
  • Красная фасоль

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

Суть в том, что Active Record и ORM должны находиться на уровне данных вашего приложения. Если вы смешаете их со своим уровнем представления, вы можете столкнуться с проблемами, подобными этому примеру, который я только что привел.

Послушайте мудрые слова @Mendelt:Прочтите Мартина Фаулера.Он написал множество книг и статей по объектно-ориентированному дизайну и опубликовал несколько хороших материалов по этой теме.Кроме того, вы, возможно, захотите изучить Антипаттерны, точнее в Блокировка поставщика, что происходит, когда мы делаем наше приложение зависимым от сторонних инструментов.Наконец я написал этот сообщение в блоге, посвященное той же проблеме, поэтому, если хотите, проверьте его.

Надеюсь, мой ответ был чем-то полезен.

Самое замечательное в использовании Rails ActiveRecord в качестве модели в MVC заключается в том, что он дает вам автоматический ORM (реляционный преобразователь объектов) и простой способ создания ассоциаций между моделями.Как вы отметили, иногда может отсутствовать MVC.

Поэтому для какой-то сложной транзакции, включающей множество моделей, я бы предложил использовать Presenter между вашим контроллером и вашими моделями (Шаблон презентатора Rails).Presenter будет объединять ваши модели и транзакционную логику и оставаться легко тестируемым.Вы определенно хотите сохранить всю свою бизнес-логику в своих моделях или презентаторах, а не в своих контроллерах (Тощий контроллер, толстая модель).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top