Одне з популярних запитань на співбесідах – що таке “чистий код”? Розуміння цього терміну дуже важливе для кожного програміста. Ось і для себе я вирішив сформувати це визначення.
За основу я взяв книгу Роберта Мартіна “Чистий код”, в якій неймовірно якісно і з пристрастю описано наскільки важливо писати чистий код і намагатися підтримувати його якість. Всім рекомендую прочитати її.
Уміння писати чистий код – це важка робота. Вона не обмежується знаннями патернів і принципів. Над кодом потрібно попотіти, потрібно старатися і зазнавати невдач. Потрібно спостерігати як інші пробують і зазнають невдач. Потрібно побачити з якими муками приймаються рішення і яку ціну потрібно заплатити за невірний вибір.
Якщо ви займаєтесь програмуванням 2-3 роки або більше, то, скоріш за все, приходилось працювати з чужим кодом, або навіть зі своїм, який був написаний колись давно і перетворився на повний безпорядок. Така робота дуже сповільнює процеси розробки. Кожна нова зміна порушує роботу коду в двох-трьох інших місцях. Жодна зміна не може пройти тривіально, для кожної зміни або модифікації коду потрібно розуміти всю структуру системи. Замість того щоб відрефакторити код або змінити архітектуру, ми переносимо це на потім, в надії що колись це перепишемо. Нажаль ми не знаємо, що за законом Леблана: потім рівносильне ніколи.
Виходом з цього замкнутого кола є лише написання чистого і якісного коду. Нажаль, написання чистого коду має багато спільного з живописом. Ми здатні відрізнити хорошу картину від поганої, але це ще не значить, що ми вміємо малювати. Уміння відрізняти чистий код від грязного ще не означає що ми уміємо писати чистий код!
Що ж таке цей чистий код? В кожного своє представлення про це визначення, але зі свого досвіду можу сказати що він повинен відповідати наступним критеріям:
- Чистий код читається як чудово написана проза. Він ніколи не містить прихованих намірів розробника і містить чіткі абстракції і прості лінії передачі управління. Читається як твір – рядок за рядком. Всі змінні і назви функцій (класів, методів) мають чіткі назви, які точно описують що вони роблять і за що відповідають.
- З попереднього випливає що код повинен бути самодокументованим. З назви методу повинно бути зрозуміло що він робить. Потрібно уникати будь-який розумових перетворень.
- Чистий код обов’язково повинен містити Unit тести. Адже код який добре читається і код який легко модифікується – це не одне і те ж. Більше про важливість тестів можна прочитати в статті Unit tests – початок. Частина 1. Код без тестів не може бути названим чистим, яким би елегантним він не був би і як добре б не читався.
- Чистий код повинен виконувати одну задачу. Кожна функція повинна виконувати лише одне завдання, яке чітко формується в її назві. Клас повинен містит лише ті поля і методи які потрібні лише для нього. Все лишнє потрібно виносити в окремі сутності.
- Код повинен містити повну обробку помилок. Це одна з прояв уваги до дрібниць.
- Чистий код виглядає так, наче автор над ним завзято потрудився. В ньому неможливо знайти ніяких очевидних можливостей для покращення. Вони усі уже були продумані автором.
- Код не повинен містити дублікати. Якщо частина коду повторюється знову і знову – це свідчить що якась мислена концепція не знайшла вираження в коді.
- Код повинен бути написаний в одному стилі. Потрібно створити Code Convention і притримуватись його. Це особливо важливо, якщо над ним працює команда. Потрібно налаштувати статичний аналіз коду. Ця тема уже була описана раніше в статті Статичний аналіз JavaScript коду.
- Мінімум коментарів в коді. Він повинен бути сомодокументованим, адже коментарі не компенсують поганий код. Коментарі мають властивість брехати, особливо це видно коли код було переписано, а коментарі ні.
Сюди можна додати ще безліч інших важливих пунктів, але ці формують основні вимоги, яким повинен відповідати код.
За кодом потрібно слідкувати, адже він може дуже багато розказати про його автора.