Чи бояться PHP-розробники функцій?

      Нещодавно я звернув увагу на одну річ, яка стала мене турбувати: 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 ставить сам капітан Очевидність, код від них розпухає в два-три рази. Нічого не маю проти доблоков там, де вони справді необхідні , але в більшості випадків (принаймні в хорошому з архітектурної точки зору коді) назву методу і параметрів говорять самі за себе.
 
Ось я і думаю, можливо, варто бути лаконічніше: замість створення файлу під кожен клас, об'єднати невеликі класи в один файл. Замість свого класу під кожну дрібницю, просто написати функцію. Замість забивання коду марними докблокамі, залишати їх тільки з потреби.
 
Такі от думки. Може я взагалі все не так розумію?
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.