Thunderdome MVC- почему одна модель в MVC?
Когда Джереми и Чад опубликовали информацию о своем проекте FubuMvc, одним из отличий, который они упомянули, был их "Принцип Thunderdome":
"Принцип Thunderdome" - все методы Controller принимают один объект ViewModel (или, в некоторых случаях, нулевые объекты) и возвращают один объект ViewModel (один объект входит, один объект покидает). Классы Controller НИКОГДА не будут напрямую подвергаться воздействию всего, что связано с HttpContext. Ничто так не заставляет меня плакать, как видеть людей, пытающихся написать тесты, которые высмеивают или заглушают новый интерфейс IHttpContextWrapper. Аналогично, методы Controller не возвращают объекты ViewResult и, как правило, отделены от всей инфраструктуры MVC. Мы очень рано приняли эту стратегию, чтобы сделать механическое тестирование контроллера более простым. Эта цель определенно достигнута, но она также сделала код контроллера очень удобным и легким для чтения. Мы объясним, как это работает на KaizenConf.
В чем преимущество их подхода "один ViewModel (или ноль) в"?
3 ответа
Его основное преимущество заключается в том, что это соглашение и обеспечивает согласованность всех наших контроллеров. Это облегчает нам настройку "контекстов"/ приспособлений тестирования, которые могут инициализировать среду в сценарии интеграционного тестирования. В большинстве случаев условные обозначения == быстрота, поскольку это устраняет множество сценариев "что, если" из ваших соображений дизайна.
Поскольку все наши действия контроллера выполняются по одной схеме, мы можем предполагать много вещей, и это ускоряет и оптимизирует наши усилия по интегрированному тестированию контроллера.
В этом нет ничего плохого, обязательно с несколькими аргументами для действия контроллера, но мы обнаружили, что наличие фактического объекта модели дает нам некоторую дополнительную функциональность, поскольку модель может содержать простую логику и предоставлять удобные свойства, которые могут просто некоторые из более сложных аспектов его собственное состояние и т. д. - в основном, это аргумент в пользу наличия какой-либо богатой модели и не является уникальным для шаблона Thunderdome/OMIOMO.
Преимущество состоит в том, что вы не полагаетесь на какой-либо контекст (например, состояние сеанса) извне методов контроллера. Это облегчает их тестирование, поскольку вам не нужно "имитировать" этот контекст с помощью макетов, но это также делает его менее практичным, так как вы должны передавать все по параметрам.
Преимущество принципа грома состоит в том, что он упрощает контроллеры. Поскольку работа по отображению значений http на объекты выполняется за пределами контроллеров, это означает, что контроллеры делают только то, что должны.