2010-01-15 8 views
2

Контроллеры могут стать большими и громоздкими, когда они содержат большое количество действий. Является ли это серьезной проблемой в реальном использовании, и если да, то какие стратегии ее смягчают (или она достаточно хороша, чтобы просто держать счетчик действий на каждом контроллере)?Избегание больших контроллеров в MVC

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

ответ

3

По моему опыту, это происходит главным образом, когда я не применяю нож «ОТДЫХ» достаточно агрессивно. Иногда метафора не согласуется с тем, как мы думаем о проблеме; например, легко думать, что «логин» - это действие в «учетной записи», но если вы применяете нож REST, вы понимаете, что вход в систему действительно «начинает новую сессию», и вы инвертируете идею, применяя «новый "(или Создать) на SessionController. Затем у вас есть небольшой контроллер, ответственный за создание и уничтожение сеансов (вход в систему и выход из системы).

Я уверен, что некоторые люди не будут любить грязные воды REST с грязной концепцией аутентификации, поэтому давайте рассмотрим более наглядный пример. Я могу иметь объект BlogPost, и он может иметь кучу комментариев. Вместо того, чтобы иметь действие AddComment на BlogPostController, у меня есть обычные методы создания/редактирования/удаления в BlogPost и еще один контроллер CommentController, чьи новые/создаваемые действия ожидают BlogPostId и реализуют методы создания/редактирования/удаления.

Я столкнулся с ситуациями, когда мне понадобилось действие, не относящееся к REST, такое как «импортировать список X из файла CSV», каждый из которых принадлежит Y; «список» не очень важен как концепция домена, так как я просто пытаюсь добавить к существующей коллекции Xes. В этом случае я воспринял то, что я воспринимаю как слегка уродливый подход добавления действия «импорта» к моему XController. Этот код является самым беспорядочным кодом в любом из моих контроллеров, и я был бы склонен учитывать его в чем-то более ответственном (класс XImporter, возможно), но пока он «работает». Я уверен, что у кого-то более умного, чем у меня, будет лучшее решение.

Итак, мой аргумент таков: если у вас много действий un-RESTy, есть своего рода запах кода; возможно, вы не моделируете то, что контролируете правильно. Но если вы скажете, что действия 1-3 REVERY и попытки переосмыслить проблему не приводят вас в правильном направлении, возможно, это не стоит беспокоиться.