Чим хороший код відрізняється від поганого? Хороший код читається легко, а поганий — погано. На цьому можна було закінчити статтю, але давайте розберемося в тому, який код хороший і чому.
Хороший і чистий код — це, перш за все, код очевидний для інших програмістів. Що сприяє збільшенню очевидності коду?
- Описові імена змінних. Погодьтеся, важко читати код, в якому більше сотні змінних, імена яких $a, $bc, $f32 і таке інше.
Лаконічні функції та методи класів. Якщо код функції / методу складається з великої кількості рядків, його стає складніше сприймати.
Відсутність мертвого та невикористовуваного коду. Чим менше непотрібного коду написано — тим краще.
Відсутність дублювання коду. Грамотно розподілена за класами та функціями логіка сприяє розумінню того, що робить і за що відповідає код.
Кажуть, що програмісти-початківці не стежать за чистотою коду, тому що тільки освоюють і без того складний матеріал; що програмісти середнього рівня не стежать за чистотою коду, тому що за ним стежить їхній ментор (досвідченіший програміст, Team Lead або ін); і, нарешті, просунуті програмісти не стежать за чистотою свого коду тому, що і так все зрозуміло, вони ж просунуті :)
Тим не менш, чистий код приємніше, легше та дешевше підтримувати. Тому, на якому рівні ви не знаходилися б, намагайтеся дотримуватися наступних порад для мови програмування PHP.
Використовуйте описові імена
Імена мають передавати наміри програміста. Щоб вибрати хороше ім'я, потрібно витратити трохи часу, але цей час окупиться вже при наступному прочитанні фрагмента коду. Ім'я змінної має відповідати такі питання:
- Чому ця сутність (змінна/функція/клас) існує?
- За що вона відповідає?
- Як він використовується?
Наприклад, є змінна $d, ініціалізована цілим значенням:
$d = 14;
За що відповідає ця змінна? Як потрібно інтерпретувати значення цієї змінної? Програміст, який уперше побачить цей фрагмент коду, витрачатиме час для того, щоб розібратися в цих питаннях.
Ім'я $d не передає ніякої інформації, тому це ім'я слід замінити більш докладним, наприклад:
$elapsedTimeInDays = 14;
Змістові імена значно спрощують розуміння і модифікацію коду. Давайте наведемо ще один приклад, на цей раз з використанням функції.
function data($key, $default = null);
Про які дані (data) йдеться і що відбувається з цими даними — запис чи читання? Допустимо, ми хочемо зчитувати дані з тимчасового сховища (cache). Тоді ім'я функції має стати таким:
function get_cache_value($key, $default = null);
Тепер ім'я функції відповідає на всі основні питання.
Вважайте за краще вертикальне масштабування коду горизонтальному
Простими словами: слід обмежити максимальну кількість символів у рядку. Це дозволить скролити код лише в одному напрямку. Як цього досягти?
- Не записуйте більше одного виразу у рядку. Наприклад:
// Погано: Ініціалізація двох змінних у рядку
$numberOfDays = 4; $dayOfWeek = 2;
// Добре: Кожна php змінна ініціалізується на своєму рядку
$numberOfDays = 4;
$dayOfWeek = 2;
- При використанні конструкцій if, for, do, while, foreach завжди використовуйте фігурні дужки, а тіло конструкція записуйте в окремих рядках:
// Погано: Тіло умови на одному рядку з самою умовою
if (is_auth()) update_user_history();
if (is_premium_user()) load_premium_content();
// Добре: Використовуються фігурні дужки та тіло умови відокремлені від умови
if (is_auth()) {
update_user_history();
}
if (is_premium_user()) {
load_premium_content();
}
- Якщо використовується довге строкове значення, його слід розділити за допомогою оператора конкатенації “.”:
// Погано: Довгий рядок сприяє додатковому горизонтальному прокручування
echo “Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.”;
// Добре: Рядок поділено на рядки приблизно однакової довжини
echo "Lorem ipsum dolor sit amet, consectetur adipisicing "
. "elit, sed do eiusmod tempor incididunt ut labore "
. "et dolore magna aliqua. Ut enim ad minim veniam, "
. "quis nostrud exercitation ullamco laboris nisi "
. "ut aliquip ex ea commodo consequat.";
Спрощуйте складні мовні конструкції
Логіка додатків має тенденцію до ускладнення, і це безпосередньо позначається як код.
Це може призводити до того, що умовні конструкції, які відповідають за логіку застосування, стають складними для розуміння.
Наприклад, є група вкладених умовних операторів, серед яких складно виділити нормальний перебіг виконання коду:
function getPayAmount() {
if (isHold()) {
$result = getHoldedAmount();
} else {
if (isSeparated()) {
$result = getSeparatedAmount();
} else {
if (isRetired()) {
$result = getRetiredAmount();
} else {
$result = getNormalPayAmount();
}
}
}
return $result;
}
Це приклад так званого «пекельного умовного оператора»: відступи кожного з рівнів вкладеності сприяють горизонтальному форматуванню коду, і код ставати схожим на цибулину.
Для того, щоб перетворити цей пекельний оператор на райський, необхідно виділити граничні умови та використовувати ранній вихід із функції. Наприклад:
function getPayAmount() {
if (isHold()) {
return getHoldedAmount();
}
if (isSeparated()) {
return getSeparatedAmount();
}
if (isRetired()) {
return getRetiredAmount();
}
return getNormalPayAmount();
}
Це далеко не всі прийоми, які можна використовувати для того, щоб зробити код чистішим і якіснішим, проте програміст будь-якого рівня може використовувати їх у своїй роботі.