Недавно я обратил внимание на одну вещь, которая стала меня беспокоить: PHP-программисты не используют функции.
Пожалуй, слишком сильное обобщение, поэтому уточню: PHP-разработчики, достичшие определенного уровня мастерства, практически перестают писать обычные функции, вместо них сплошные классы и методы. Во всяком случае, такое впечатление складывается, когда смотришь код библиотек и фреймворков с открытым кодом. Все “крутые” библиотеки используют разве что анонимные функции, и только.
С другими языками ситуация совсем не такая. Скажем, код на Питоне будет по большей части состоять из определений классов, но и обычным функциям найдется место.
В PHP функции как правило используются в двух случаях: программист не умеет в ООП, или скрипт настолько прост, что городить ООП нет смысла. Кажется, не существует такого понятия, как функция-хелпер или чего-то подобного.
И это меня в некотором смысле беспокоит, я считаю неправильным распихивать все по классам. Такой подход ведет к Классо-Ориентированному Программированию, когда использование классов становится самоцелью. (Напомню: наличие классов само по себе не делает код объектно-ориентированным!)
Кроме того считаю, что причина появления все новых и новых функций в ядре языка кроется именно в нелюбви к хелперам. Вот совсем недавно несколько человек просили добавить array_rand_value
. Она бы делала тоже самое, что array_rand
, только возвращала не ключ, а значение. В клиентском коде ее можно написать в две строчки
function array_rand_value(array $array) {
if (empty($array)) return null;
return $array[array_rand($array)];
}
Малюсенькая функция, ничего такого. Но тут возникает самая главная по моему мнению сложность: где ее расположить? И как подружить ее с автозагрузкой?
PHP во многом перенял ООП-модель из Явы, в частности однозначное соответствие: один класс — один файл. Сам язык этого не требует, однако это уже общепринятое соглашение. И, более того, оно поддерживается механизмом автозагрузки и стандартом PSR-0.
В других похожих на PHP языках такого нет. К примеру, в Питоне вполне нормально сгруппировать несколько классов и функций в одном файле, поскольку в этом языке файл это скорее модуль, набор взаимосвязанных компонентов. Очевидно, что при такой организации найти место функциям значительно проще.
Я вообще считаю, что такое однозначное соответствие класс — файл это источник проблем для PHP. Помимо сложностей с функциями появляются дополнительные затраты на создание маленьких классов. Грамотное ООП зачастую порождает большое количество небольших классов, что хорошо с точки зрения поддержки, повторного использования кода и тестирования. Но в PHP для каждого классика надо заводить свой файл. И это по-настоящему бесит. Меня совершенно не смутит десяток коротких классов, живущих в одном файле. Но создавать десять файлов для каждого из них мне реально кажется неэффективным (и осложняющим поддержку).
Заодно упомяну еще один “общепринятый” подход, который мне не нравится, это избыточные блоки комментариев. В львиной доле случаев phpdoc ставит сам капитан Очевидность, код от них распухает в два-три раза. Ничего не имею против доблоков там, где они в самом деле необходимы, но в большинстве случаев (по крайней мере в хорошем с архитектурной точки зрения коде) название метода и параметров говорят сами за себя.
Вот я и думаю, возможно, стоит быть лаконичнее: вместо создания файла под каждый класс, объединить небольшие классы в один файл. Вместо своего класса под каждую мелочь, просто написать функцию. Вместо забивания кода бесполезными докблоками, оставлять их только по необходимости.
Такие вот мысли. Может я вообще все не так понимаю?
Автор: f3ath