<rmcreative>

RSS

Толстые контроллеры не так уж ужасны

22 мая 2011

Jani Hartikainen, разработчик, которого я всегда читаю с большим удовольствием, написал заметку о толстых контроллерах. Обычно преобладает академическая точка зрения, что контроллер должен быть тонким, т.е. вся логика должна быть вынесена в модели и сервисный слой. Как и почти всё академическое, идеальный тонкий контроллер — это крайность, которая не всегда нужна. В пользу толстого контроллера можно привести следующие аргументы:

  • Сервисный слой — дополнительная сложность. Чтобы работать с ним, нужно сначала посмотреть, что там и как, то есть увеличивается порог, который нужно преодолеть новым членам команды.
  • Проблема, которую дополнительные слои точно не могут решить — наличие слишком большого числа дополнительных слоёв.

Слишком толстый контроллер — другая крайность. Выносить функционал в сервисный слой определённо стоит если:

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

Комментарии RSS

  1. №4703
    AmdY
    AmdY 22 мая 2011 г., 22:55:42

    Есть промежуточное решение, в качестве сервиса может выступать другой контроллер, я это называю "подзапрос".

    $this->getView()->SUB_SKILLS = $this->forward("footballer/skills/id:$id/");
  2. №4704
    Sam
    Sam 22 мая 2011 г., 23:13:45

    AmdY, в Kohana это зовётся HMVC. Тоже вариант, конечно, хотя плюсов перед нормальным сервисным слоем я не вижу. А вот минусы все присутствуют.

  3. №4709
    Константин
    Константин 23 мая 2011 г., 4:16:12

    поясните для нубов, что такое "Сервисный слой" :)

  4. №4710
    Максим
    Максим 23 мая 2011 г., 11:30:39

    Ну это дополнительный класс, выполняющие схожие задачи для всех контроллеров. В рамках yii его проще описать как компонент приложения, к которому обращаются контроллеры для выполнения каких либо действий.

  5. №4711
    Максим
    Максим 23 мая 2011 г., 13:56:51

    Sam, можно поподробней про минусы HMVC ? Я очень мало встречал информации по этой теме. Ну кроме производительности, так как этот пункт можно решить.

  6. №4713
    Serge
    Serge 23 мая 2011 г., 14:23:20

    Я считаю что если вы занимаетесь "производством" сайтов то у вас должны быть тонкие контроллеры и куча сервисов. Это необходимо для того что бы избавиться от капипейста и иметь возможность использовать сервисы в любых комбинациях. Если вы делаете один сайт (проект) код которого нельзя будет использовать дальше вне этого сайта (проекта) то нужно использовать толстые контроллеры. Это избавит вас от лишних трудозатрат. Вообщем все зависит от поставленной задачи.

  7. №4714
    Sam
    Sam 23 мая 2011 г., 14:57:22

    Максим, по сравнению с нормальным сервисным слоем — это невозможность нормально оттестировать, очень ветвистая иерархия, в которой легко запутаться.

    Serge, верно. Копи→пейст — верный сигнал для начала выноса кода в сервисы.

  8. №4717
    AmdY
    AmdY 23 мая 2011 г., 15:21:53

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

  9. №4718
    Максим
    Максим 23 мая 2011 г., 17:16:16

    AmdY, Это уже зависит от реализации.

  10. №4721
    Sam
    Sam 23 мая 2011 г., 19:36:20

    AmdY, именно, что не отличается. Приходится вместо модульных тестов использовать функциональные.

  11. №4724
    Максим
    Максим 24 мая 2011 г., 11:38:37

    Sam, а если вместо виджетов использовать некое подобие HMVC ? (Это для моей аякс либы) Тогда проблем не должно быть, верно ?

  12. №4725
    Sam
    Sam 24 мая 2011 г., 13:24:55

    Максим, смотря каких проблем. Проблемы с невозможностью нормально оттестировать контроллер, будь то обычный контроллер или HMVC, будут.

  13. №4726
    Максим
    Максим 24 мая 2011 г., 16:20:17

    Ну почему же, если действие контроллера будет по аякс дергаться :) и в некоторых случаях вызываться по HMVC то проблем с тестированием не должно быть.

  14. №4727
    Sam
    Sam 24 мая 2011 г., 17:14:16

    С функциональным не будет.

  15. №4728
    Максим
    Максим 24 мая 2011 г., 19:57:48

    Sam, можешь пояснить в чем смысл модульного тестирования контроллера ? Кроме сохраняет/меняет ли он запись ?

  16. №4730
    Sam
    Sam 24 мая 2011 г., 21:53:03

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

  17. №5319
    OZ
    OZ 06 сент. 2011 г., 17:27:01

    "Обычно преобладает академическая точка зрения, что контроллер должен быть тонким"

    Я сейчас ищу программистов в команду, и могу сказать, что обычно никакой точки зрения по этому вопросу нет вообще, никто про такие вещи и не слышал. Люди, где найти хороших программистов?

  18. №5321
    Sam
    Sam 06 сент. 2011 г., 21:47:31

    OZ, мне посчастливилось, что я Yii core developer. Думаю, отчасти поэтому на объявление на форуме откликнулось удивительно много адекватных разработчиков.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.