Чем хороший код отличается от плохого? Хороший код читается легко, а плохой — плохо. На этом можно было и закончить статью, но давайте разберемся в том, какой код хороший и почему.
Хороший и чистый код — это, прежде всего, код очевидный для других программистов. Что способствует увеличению очевидности кода?
Описательные имена переменных. Согласитесь, трудно читать код, в котором более сотни переменных, имена которых $a, $bc, $f32 и так далее.
Лаконичные функции и методы классов. Если код функции / метода состоит из большого количества строк, то его становится сложнее воспринимать.
Отсутствие дублирования кода. Грамотно распределенная по классам и функциям логика способствует пониманию того, что делает и за что отвечает код.
Отсутствие мертвого и неиспользуемого кода. Чем меньше ненужного кода написано — тем лучше.
Говорят, что начинающие программисты не следят за чистотой кода, потому что только осваивают и без того сложный материал; что программисты среднего уровня не следят за чистотой кода, потому что за ним следит их ментор (более опытный программист, Team Lead или др); и, наконец, продвинутые программисты не следят за чистотой своего кода потому, что и так все понятно, они же продвинутые :)
Тем не менее, чистый код приятнее, легче и дешевле поддерживать.
Как писать сайты на PHP — искусство само по себе, а делать это красиво и чисто — его вершина.
Поэтому, на каком бы уровне вы не находились, старайтесь придерживаться следующих советов чистого кода PHP.
Используйте описательные имена
Имена должны передавать намерения программиста. Чтобы выбрать хорошее имя, потребуется потратить немного времени, но это время окупиться уже при следующем прочтении фрагмента кода. Имя переменной должна отвечать на следующие вопросы:
Почему эта сущность (переменная / функция / класс) существует?
За что она отвечает?
Как она используется?
Например, есть переменная $d, инициализированная целым значением:
$d = 14;
За что отвечает данная переменная? Как нужно интерпретировать значение этой переменной? Программист, который впервые увидит этот фрагмент кода, потратит время для того чтобы разобраться в этих вопросах.
Имя $d не передает ровно никакой информации, поэтому это имя следует заменить более подробным, например:
$elapsedTimeInDays = 14;
Содержательные имена существенно упрощают понимание и модификацию кода PHP. Пример кода, на этот раз с использованием функции:
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();
}
Это далеко не все приемы, которые можно использовать для того, чтобы сделать код чище и качественнее, однако программист любого уровня может использовать их в своей работе.