Где Search вписывается в шаблон программного обеспечения MVC?
Я реализую алгоритм поиска в базе данных, который выполняет поиск по множеству коллекций в MongoDB и возвращает оптимизированные результаты, основанные на состоянии всей базы данных. У меня нет проблем с реализацией, но номенклатура и то, как я должен структурировать файловую систему, меня беспокоит. Где в шаблоне модель-представление-контроллер следует размещать операции только для чтения? Это услуга? У него есть контроллер, но я не думаю, что он удовлетворяет критериям быть моделью.
2 ответа
Этот вопрос чрезвычайно зависит от языка и особенностей, которые существуют в этом языке. Я буду говорить с точки зрения PHP.
Функции поиска должны входить в модель, модель резервируется как поставщик данных в шаблоне MVC. Единственная центральная точка, из которой можно вычленить экземпляры самого себя.
Некоторые MVC реализуют то, что известно как factory
классы. Они специально предназначены для того, чтобы находиться вне нормального шаблона MVC, чтобы иметь возможность предоставлять данные: http://en.wikipedia.org/wiki/Factory_method_pattern. Как человек, который использовал этот шаблон, я могу сказать, что он становится сложным и неуправляемым очень быстро. Вот почему я предпочитаю делать резервную копию модели как поставщика данных, просто требуется организация классов.
Архитектура Model View Controller является в значительной степени эквивалентом трех или четырехуровневого решения в настройке клиентского сервера, и применяются те же правила.
Сложная и интенсивная функциональность базы данных работает с инструментом, который лучше всего подходит для этой задачи и наиболее пригоден для повторного использования, и в этом случае я бы сказал, что СУБД будет лучшим вариантом в подавляющем большинстве СУБД, поскольку именно СУБД лучше всего умеет манипулировать данными, разрабатывать планы запросов и т. д.
Можно также утверждать, что уровень модели был бы наиболее естественным местом с точки зрения пуристического кодирования, где у вас есть все ваши данные доступа на одном уровне.
Крайне маловероятно, что когда-либо было бы выгодно размещать такого рода функциональные возможности в наименее повторно используемом слое, т.е.
Это, конечно, только мое мнение, и я подозреваю, что вы получите много альтернативных мнений, но (я не могу подумать, что с точки зрения производительности логика yopur принадлежит не на уровне базы данных, а где-то еще).
ОБНОВИТЬ
Модель является хранителем всех данных. если представление или контроллер хочет данные, он запрашивает модель для этих данных. Представление или контроллер не должны заботиться о том, как данные получены или откуда они берутся. Речь идет о разделении интересов. Так что это оставляет вопрос. Поместить ли код для запроса базы данных в модель или в СУБД?
Ну, конечно, у вас должен быть метод в модели, чтобы представление или контроллер вызывали его в первую очередь, поэтому, конечно, вам нужна модель, но что находится внутри этого метода и где живет фактический запрос SQL, зависит от дизайнера. Дело в том, что до тех пор, пока запрос живет на уровне модели или базы данных, вы скрываете реализацию от представления или контроллера и можете свободно изменять реализацию в любое время, не беспокоясь о потенциально многих местах, из которых он вызывается.
Таким образом, модель или RDBMS является ответом. Выбор решения зависит от инструментов MVC, которые вы используете, и от СУБД, которую вы используете. Также помните, что модель не обязательно должна состоять из единственного метода, который, как вы подразумеваете, может быть лишен вашего комментария.