neyronius
@neyronius

Инкапсуляция формой логики приложения?

Допустим, есть web-сайт, написанный на каком-либо языке программирования, использующий паттерн MVC. Все формы на сайте представлены объектами, публичными свойствами которых являются элементы формы, а методы позволяют произвести проверку формы на факт отправки, валидацию и т.д. Данные формы извлекаются из свойств, которые реализуют также рендеринг контролов, собственную валидацию, изменение состояния.



Вопрос концептуальный и состоит в том, где должна в этом случае располагаться логика приложения, например сохранение данных из формы в базу, – в контроллере или в самой форме, например как реализация метода onPostAndValidate, onValidateError(), etc. В случае обработки формы из контроллера возникает копирование логики обработки POST запроса для каждой формы. Если все инкапсулировать в форму, то возникает смутное сомнение в смешивании ответственности – не окажется ли перегруженым класс формы. Вот такая делема. Как посоветуете сделать?
  • Вопрос задан
  • 2764 просмотра
Решения вопроса 1
@niko83
А вы добавте сюда ещё случай когда нужно добавить правило валидации типа «уникальныный емэйл в базе», или с течением времени вы решили изменить столбец в таблице БД и теперь сохранять длинну поля не 100 а скажем 200 символов — получится совсем путаница. Другими словами валидация формы в общем случае так или иначе тесно переплетается с моделью.

Можно попробовать сделать так:

Вся валидация должна происходить в моделе при сохранении. Модель при сохранении возвращает «объект овета» в котором содержится результат работы: перечислены ошибки валидации, какието вспомогательные данные (сколько строк было сохранено или обнавлено), при удачном сохранении также объект сущности которую сохраняем.

В контроллере проиходит связывание и согласовывание объекта формы и «объекта ответа»
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Shedal
@Shedal
Возможно, вам стоит создать отдельные классы-Entity, которыми и манипулировать на всех слоях приложения.
M, V и C — это «подслои» UI. А кроме UI часто выделяют отдельные слои бизнес-логики (BLL) и доступа к данным (DAL). Таким образом, в своем MVC вы можете манипулировать данными, а затем передавать их в виде Entity-объектов в классы бизнес-логики, которая, в свою очередь, будет вызывать методы доступа данных для CRUD-операций.

Это всего лишь один из вариантов архитектуры. Все зависит от конкретного приложения, но подробности у вас бы вряд ли уместились в вопрос, так что… думайте, выбирайте :) Или же задавайте более конкретные вопросы.
Ответ написан
x0rHamster
@x0rHamster
full stack web- и c#-разработчик
Попробуйте выделить отдельный класс, который будет отвечать за данные, которые нужно послать в БД или вытащить из нее, а при сохранении в БД в контроллере запрашивайте этот класс из формы и отдавайте его на растерзание классу БД (или терзайте прямо там).

Форма как элемент UI не должна знать про БД, но должна отдавать данные в каком-то виде. Контроллер как прослойка между UI и DB должен превращать данные из UI в данные, пригодные для DB.

Походу ответ похож на предыдущий (^_^)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы