Иногда функции действия в классе контроллера могут стать огромными и неприятными, с множеством строк кода, которые просто контролируют поток данных из модели в представление. В какой-то момент эти огромные функции полностью теряют основные принципы хорошего кода, то есть делают только одну вещь, будучи маленькими, удобочитаемыми и управляемыми и т. Д.
Будет ли хорошей практикой разбивать эти огромные функции действия на более мелкие частные функции в классе контроллера или необходимость такой оптимизации означает, что мы должны добавить их в модель?
Я бы проголосовал за то, чтобы меньшие функции были частными в контроллере, чтобы они относились к действию, но я слышал аргументы, что контроллер должен быть простым, в то время как модель может стать огромной и комковатой; и просто задавался вопросом, какой из них будет наиболее предпочтительным методом.
источник
Лучший ответ, который я могу дать, это процитировать замечательную книгу Роберта Мартина «Чистый код», которую я настоятельно рекомендую всем, кто интересуется этой темой:
Лучше сказать не могу. Применяется еще одна замечательная цитата из той же книги:
Разбивая ваш код на большее количество функций, вы вынуждены давать этим функциям осмысленные имена, которые могут значительно улучшить читабельность вашего кода. Излишне говорить, что все функции, не предназначенные для использования вне класса, должны быть закрытыми, чтобы вы могли легко повторно использовать свой код с помощью наследования.
Если ваш контроллер теперь имеет слишком много функций, это признак того, что он, вероятно, делает слишком много. Затем вы можете разделить его на несколько независимых частей или попробовать перенести некоторые функции в модели, как указано в другом ответе. Также, если вы следуете неклассической версии MVC, где представлениям разрешено иметь некоторую логику, вы можете поместить некоторые свои функции туда, где они подходят.
источник
В MVC я стараюсь сделать так, чтобы мой контроллер был максимально «тонким», а также чтобы мои модели были настолько тупыми, насколько это возможно.
Необходимая логика и вспомогательные функции помещаются в отдельные автономные вспомогательные классы. Это также значительно облегчает мое тестирование (вы тестируете .. правильно ??: D) Тестирование контроллеров, как известно, сложно, каждый раз, когда вы пытаетесь создать экземпляр контроллера для тестирования, вы должны думать о HTTP-контексте и подделке. http это и то, и это боль, но это боль нарочно. Вам нужно все это, потому что контроллер так тесно связан с HTTP и сетью. Это точка входа в ваше веб-приложение.
Логические и вспомогательные функции не имеют ничего общего с сетью. Они полностью независимы от окружающей среды (или должны быть). Одно это должно сказать вам, что они не принадлежат друг другу в одном месте. Кроме того, если вы привязываете всю логику своих приложений к Интернету или конкретной веб-реализации, вы никогда не сможете взять ее с собой.
Мы разработали наш сайт MVC со всеми нашими объектами базы данных (не нашими моделями mvc, нашими фактическими объектами db), нашим хранилищем, нашими вспомогательными классами и нашей логикой в отдельных автономных библиотеках DLL. У нас только у каждого был один веб-сайт, но мы все равно сделали это так.
Несколько месяцев назад нас попросили создать несколько настольных приложений, связанных с некоторыми из наших периферийных систем. Это было легко сделать, так как весь наш протестированный код можно было легко использовать повторно. Если бы мы вставили наш код в наш веб-проект или вставили в наши контроллеры, мы бы никогда не смогли этого сделать.
источник
Кроме хороших ответов Дмитрия Зайцева и космонавта, я не знаю, действительно ли следующее также верно для PHP: вам следует избегать частных методов из-за отсутствия возможностей автоматического тестирования.
Да, вы также можете использовать метапрограммирование или внедрение зависимостей для тестирования приватных методов, но вы не должны этого делать, поскольку это сильно влияет на читабельность вашего кода.
Всегда помните принцип KISS: будь проще, глупее.
источник