Model View Controller - Как разделить код?

У меня есть более общий вопрос о том, как разделить код и обязанности модели, представления и контроллера в рамках шаблона MVC. Для лучшего понимания я собираюсь использовать пример кейса.

Мой вопрос

Приложение делится на модель, вид и контроллер. Как обрабатывается ошибка во время какой-либо операции на уровне модели, которая должна отображаться в представлении?

Я думал о двух возможностях:

а) Модель сохраняет строку ошибки и уведомляет контроллер и представление. Затем представление опрашивает строку ошибки из модели и сохраняет ее. После этого контроллер сообщает представлению отобразить ошибку.

б) Модель возвращает ошибку контроллеру, который передает ее отображаемому виду.

Что бы вы сказали, что лучше всего подходит для шаблона MVC? Или что будет ближе к шаблону MVC?

заранее большое спасибо

1 ответ

Решение

Есть в основном два подхода:

Для начала следует помнить о принципе разделения командных запросов (CQS).

Поэтому мы ожидаем ошибки в командах при изменении состояния модели.

Ваша модель может либо бросить какую-то BusinesModelException исключение или возвращаемое значение типа параметра. None тогда означает успех (без ошибок) и Some содержит информацию об ошибке

Наличие результата операции позволяет упростить агрегацию ошибок, например, во время валидации и явно через сигнатуру метода уведомлять вызывающих о возвращенных ошибках. Например, в C#, если не задокументировано должным образом, не очень очевидно, какие исключения могут быть выброшены.
Исключения также не влияют на производительность, если у вас большой пакет операций, некоторые из которых возвращают ошибку.
Когда исключение не генерируется, мы обычно подразумеваем, что приложение не имеет поврежденного состояния, и результат Operation передает это более естественно, тогда как исключения требуют соглашения (независимо от того, подлежит ли оно восстановлению или нет).

С другой стороны, исключения могут перемещаться по слоям до точки, где они действительно должны быть обработаны. Это позволяет коду быть чище: например, мне вообще не нужно перехватывать логические исключения бизнес-процессов, но я создаю фильтр исключений в MVC, который правильно преобразует его в соответствующий код состояния htmls и сообщение об ошибке. Также промежуточные слои не знают всей кухни, связанной с ошибками.

Исключения легче вписываются в Аспектно-ориентированное программирование.

Эти два подхода могут быть объединены.

Я предпочитаю исключения.

Другие вопросы по тегам