Толстые контроллеры не так уж ужасны
22 мая 2011
Jani Hartikainen, разработчик, которого я всегда читаю с большим удовольствием, написал заметку о толстых контроллерах. Обычно преобладает академическая точка зрения, что контроллер должен быть тонким, т.е. вся логика должна быть вынесена в модели и сервисный слой. Как и почти всё академическое, идеальный тонкий контроллер — это крайность, которая не всегда нужна. В пользу толстого контроллера можно привести следующие аргументы:
- Сервисный слой — дополнительная сложность. Чтобы работать с ним, нужно сначала посмотреть, что там и как, то есть увеличивается порог, который нужно преодолеть новым членам команды.
- Проблема, которую дополнительные слои точно не могут решить — наличие слишком большого числа дополнительных слоёв.
Слишком толстый контроллер — другая крайность. Выносить функционал в сервисный слой определённо стоит если:
- Вы начинаете копировать свой же код.
- Вы в точности знаете, что вам нужно и это что-то точно будет использоваться много раз.
- Вы используете разработку через тестирование и хотите максимального покрытия кода.
Комментарии RSS по email OK
Есть промежуточное решение, в качестве сервиса может выступать другой контроллер, я это называю "подзапрос".
AmdY, в Kohana это зовётся HMVC. Тоже вариант, конечно, хотя плюсов перед нормальным сервисным слоем я не вижу. А вот минусы все присутствуют.
поясните для нубов, что такое "Сервисный слой" :)
Ну это дополнительный класс, выполняющие схожие задачи для всех контроллеров. В рамках yii его проще описать как компонент приложения, к которому обращаются контроллеры для выполнения каких либо действий.
Sam, можно поподробней про минусы HMVC ? Я очень мало встречал информации по этой теме. Ну кроме производительности, так как этот пункт можно решить.
Я считаю что если вы занимаетесь "производством" сайтов то у вас должны быть тонкие контроллеры и куча сервисов. Это необходимо для того что бы избавиться от капипейста и иметь возможность использовать сервисы в любых комбинациях. Если вы делаете один сайт (проект) код которого нельзя будет использовать дальше вне этого сайта (проекта) то нужно использовать толстые контроллеры. Это избавит вас от лишних трудозатрат. Вообщем все зависит от поставленной задачи.
Максим, по сравнению с нормальным сервисным слоем — это невозможность нормально оттестировать, очень ветвистая иерархия, в которой легко запутаться.
Serge, верно. Копи→пейст — верный сигнал для начала выноса кода в сервисы.
Sam, тестирование ничем не отличается от тестирования контроллера, иерархия так же ничем не отличается от выделения в сервисный слой. разницы особой нет и по производительности проседания нет, если не слишком уж толстый фронт контроллер как некогда было для ZF.
AmdY, Это уже зависит от реализации.
AmdY, именно, что не отличается. Приходится вместо модульных тестов использовать функциональные.
Sam, а если вместо виджетов использовать некое подобие HMVC ? (Это для моей аякс либы) Тогда проблем не должно быть, верно ?
Максим, смотря каких проблем. Проблемы с невозможностью нормально оттестировать контроллер, будь то обычный контроллер или HMVC, будут.
Ну почему же, если действие контроллера будет по аякс дергаться :) и в некоторых случаях вызываться по HMVC то проблем с тестированием не должно быть.
С функциональным не будет.
Sam, можешь пояснить в чем смысл модульного тестирования контроллера ? Кроме сохраняет/меняет ли он запись ?
Смысла в том, что контроллер не очень реально оттестировать модульными тестами для всех ситуаций т.к. он общается со средой. Да и воспроизводить эту самую среду, пусть и частично, довольно сложно. Поэтому в ход идут функциональные тесты.
"Обычно преобладает академическая точка зрения, что контроллер должен быть тонким"
Я сейчас ищу программистов в команду, и могу сказать, что обычно никакой точки зрения по этому вопросу нет вообще, никто про такие вещи и не слышал. Люди, где найти хороших программистов?
OZ, мне посчастливилось, что я Yii core developer. Думаю, отчасти поэтому на объявление на форуме откликнулось удивительно много адекватных разработчиков.