Ще деякі рекомендації, щодо написання php коду
Настав час продовжити розмову, про написання програмних проектів здатних до масштабування. Минулого разу я спробував поділитись своїми думками що до масштабованості. Цього разу хочу трішки зосередитись на одному моменті, необхідному для створення якісних програмних продуктів. А саме на написанні оптимального коду. На прикладі php.
Дуже давно я розповідав про правила культурного написання коду на php. В тій замітці поділився я думками, чому стільки неякісного коду, написаного на php, виклав декілька прийомів підвищення якості коду і т.д. Гадаю, що буде доречним додати ще декілька аспектів що до написання коду на php.
Пишемо гарний код на php
1. Регулярні вирази. Часто постає питання, якими регулярними виразами користуватись: POSIX чи PERL. З точки зору швидкодії та багатства можливостей PERL-сумісні регулярні вирази значно кращі за аналогічні POSIX. Єдиний випадок, коли іх ефективність псотупається POSIX – коли в великих за обсягом файлах вираз відсутній.
До речі, хочу нагадати, що откомпільовані регулярні вирази кешуються, що в деяких випадках може суттєво вплинути на швидкодію (при багаторазовому використанні). Слід також зазначити, що при багаторазовому використанні одного й того ж самого PERL-сумісного виразу в рамках одного запуску швидкість порівняно з POSIX зростає ще більше.
2. Перебір елементів масиву – доволі розповсюджена робота. Тут слід розглядати два випадка: асоційовані масиви, та масиви з числовим індексом.
Одразу скажу, що швидкість доступу до елементу асоціативного масиву та елементу нумерованого масиву практично не відрізняється. Тобто використання асоціативних масивів для збереження даних з точки зору читабельності коду є цілком правильним, оскільки падіння швидкодії буде в межах 1% (мабуть масиви в php всі асоціативні). Швидкість роботи двовимірних масивів майже не поступається швидкості роботи з одновимірними, так що й тут не слід нічого вигадувати.
Найкращим варіантом перебору елементів масиву з цілочисленим індексом є використання циклу for (while фактично не поступається за швидкожією, однак for здається мені більш зрозумілішим, та інтуїтивним). Останнє місце займає foreach. Доречі, в умові циклу для великих масивів слід використовувати константне значення чи змінну замість count() чи sizeof() (на великих масивах, рекомендовано користуватись останнім, оскільки за деякими даними, не дивлячись на документацію, sizeof праціє швидше). Тут добре зрозуміло, що кожен виклик функції буде для обрахування кількості елементів буде коштувати дорожче, ніж звернення до змінної, чи тим паче константи.
foreach, який не рекомендується використовувати для масивів з неперервним числовим індексом, у випадку з асоціативними масивами є найбільш привабливим варінтом, коли не має потреби отримувати не лише значення комірки масиву, але й відповідний ключ. Тому слід де можливо уникати великих асоціативних масивів, які необхідно перебирати – все ж таки швидше перебрати масив з неперервним числовим індексом.
3. Передача параметрів у функцію за посиланням.
Раніше інтерпретатор php для кожного параметру, що передавався у функцію створював копію, що негативно впливало на швидкодію та використання оперативної пам’яті. Тепер ця проблема за словами розробників усунена: введено механізм відкладеного копіювання. Як це працює? До першої дії зі змінною, що буде впливати на запис змінної, копія цієї змінної не робиться, тобто інтерпретатор працює з посиланням. Отже необхідність в передачі параметрів функції за посиланням де не відбувається зміна параметрів не є необхідною.
Однак, передача параметру функції за посиланням може стати доброю заміною використанню global змінних, оскільки виконується швидше.
4. Використання include/require може прискорити виконання програми для випадку, коли підлючається досить великий шматок коду, причому підключається він в місце, яке не буде обов’язково виконуватись, тобто в один з варіантів switch чи if. Чому так? Зрозуміло, що до початку нової гілки легше дійти, коли замість великої порції коду присутня лише директива.
Однак надмірне розбиття коду на файли, що будуть підключатись теж сповільнює роботу програми.
5. Використання file() в ряді випадків є більш доцільним ніж використання fopen+цикл. Доречі, використання !foef(), як умови для циклу ще більше уповільнює роботу.
Однак, що до цієї рекомендації хотілось бі зробити ще одне зауваження: використання file() не є доцільним, коли виникає необхідність обробляти отримані дані, оскільки це знову ж потребує використання циклу.
Висновки
Ну що ж. Сподіваюсь наведені вище рекомендації стануть в нагоді при написанні коду. Однак це лишень правила написання якісного коду, які будуть працювати у рамках правильного підходу до написання серйозних проектів, вміння оптимізувати код, продумувати на перед та оргнізовувати взаємодую між елементами програми.
Цьому будть присвячені наступні мої замітки. Дякую за увагу!
Ще не має кометарів
