Глава 1: Чистий код
-
Загальна кількість безладу з часом зростає.
-
Відновити застарілу систему дуже складно. Рефакторинг та поступові поліпшення стануть найкращим для цього варіантом.
-
У заплутаній кодовій базі виконання завдань, які мають займати лише кілька годин, можуть піти дні чи тижня.
-
Знайдіть час, щоб швидко діяти.
-
Чистий код добре справляється з одним завданням. Поганий код намагається зробити надто багато.
-
Чистий код добре протестовано.
-
При читанні добре написаного коду, кожна функція робить приблизно те, що ви очікували.
-
Якщо ви не погоджуєтесь з принципом, який викладає хтось із багаторічним досвідом, вам слід хоча б розглянути його точку зору, перш ніж ігнорувати її.
-
Код читають набагато частіше, аніж пишуть.
-
Код, що легше читати, легше змінити.
-
Залиште кодову базу у кращому вигляді, ніж коли ви її знайшли (Правило бойскауту).
Розділ 2: Значення імен
-
Ретельно вибирайте імена змінних.
-
Вибирати добрі імена складно.
-
Ім'я змінної або функції має вказувати на те, що таке і як використовується.
-
Уникайте використання односимвольних імен змінних, за винятком імен, що часто використовуються, наприклад, i для змінної лічильника в циклі.
-
Уникайте скорочення в іменах змінних.
-
Імена змінних повинні бути вимовними, щоб ви могли говорити про них і вимовляти їх уголос.
-
Використовуйте імена змінних, які можна знайти.
-
Класи та об'єкти повинні мати іменники у вигляді іменників.
-
Імена методів і функцій повинні бути дієсловами або парами дієслово-іменник.
Розділ 3: Функції
-
Функції мають бути невеликими.
-
Функція має виконувати одну дію.
-
Функції повинні мати описові імена.
-
Вийміть код у тілі if/else або переключіть оператори в чітко названі функції.
-
Обмежте кількість аргументів, які приймає функція.
-
Якщо функції потрібно багато аргументів конфігурації, розгляньте можливість об'єднання в одну змінну параметрів конфігурації.
-
Функції мають бути чистими, що означає, що вони не мають побічних ефектів та не змінюють своїх вхідних аргументів.
-
Функція повинна бути командою або запитом, але не тим і іншим одразу (Command Query Separation - Поділ запитів команд).
-
Краще видалити з коду помилки та винятки, ніж залишити помилки в коді.
-
Вийміть дубльований код у чітко названі функції (Don't Repeat Yourself).
-
Модульні тести спрощують рефакторинг.
Розділ 4: Коментарі
-
Коментарі можуть бути невірними. Вони можуть бути неправильними з самого початку або можуть бути точними, а потім з часом застаріти в міру зміни коду.
-
Використовуйте коментарі, щоб описати, чому написано так, як воно є, а не пояснювати, що відбувається.
-
Коментарів часто можна уникнути, використовуючи чітко названі змінні та витягуючи розділи коду чітко названі функції.
-
Додайте до коментарів TODO однакові префікси, щоб спростити їх пошук. Періодично переглядайте та очищуйте свої TODO-коментарі.
-
Не використовуйте Javadocs тільки для їх використання. Коментарі, що описують, що робить метод, які аргументи він приймає і що повертає, у кращому разі надмірні, а в гіршому — вводять в оману.
-
Коментарі повинні включати всю відповідну інформацію та контекст, який знадобиться читачеві. Не лінуйтеся, коли пишете коментар.
-
Коментарі журналу та коментарі автора файлу не потрібні через контроль версій та git blame.
-
Не коментуйте мертвий код. Просто видаліть його. Якщо ви думаєте, що код вам знадобиться в майбутньому, то для цього потрібний контроль версій.
Розділ 5: Форматування
-
У команді виберіть набір правил форматування коду, а потім послідовно використовуйте ці правила. Неважливо, з якими правилами ви погоджуєтесь, вам потрібно дійти згоди.
-
Використовуйте автоматичне форматування коду та аналізатор коду. Не покладайтеся на те, що люди знайдуть вручну і виправлять кожну помилку форматування. Це неефективно, непродуктивно і марнування часу під час перевірки коду.
-
Додайте вертикальні пробіли між рядками коду, щоб візуально поділити зв'язані блоки коду. Все, що вам потрібно, це зробити один новий рядок між групами.
-
Невеликі файли легше читати, розуміти та переміщати, ніж великі файли.
-
Змінні слід оголошувати поруч із тим, де вони використовуються. Для невеликих функцій це зазвичай вгорі функції.
-
Навіть для коротких функцій або операторів if все одно форматуйте їх правильно, а не записуйте в одному рядку.
Глава 6: Об'єкти та структури даних
-
Деталі реалізації в об'єкті мають бути приховані за інтерфейсом об'єкта. Надаючи інтерфейс для використання споживачами об'єкта, ви полегшує подальший рефакторинг деталей реалізації, не викликаючи критичних змін. Абстракції полегшують рефакторинг.
-
Будь-який фрагмент коду не повинен знати про внутрішній пристрій об'єкта, з яким він працює.
-
При роботі з об'єктом ви повинні вимагати від нього виконання команди або запиту, а не запитувати його про його внутрішній пристрій.
Глава 7: Виправлення помилок
-
Обробка помилок не повинна заважати решті коду в модулі.
-
Краще видалити з коду помилки та винятки, ніж залишити помилки в коді.
-
Напишіть тести з помилками, щоб переконатися, що ваш код ідентифікує їх, а чи не пропускає.
-
Повідомлення про помилки повинні бути інформативними, з усім необхідним контекстом, який може знадобитися комусь для ефективного усунення несправностей.
-
Обгортання сторонніх інтерфейсів API тонким шаром абстракції спрощує заміну однієї бібліотеки на іншу в майбутньому.
-
Обгортання сторонніх інтерфейсів API тонким шаром абстракції спрощує імітацію бібліотеки під час тестування.
-
Використовуйте шаблон Special Case або Null Object для обробки виняткової поведінки, наприклад, коли певні дані не існують.
Глава 8: Межі
-
Сторонні бібліотеки допомагають прискорити доставку продукту, дозволяючи передати різні завдання на аутсорсинг.
-
Напишіть тести, щоб переконатися, що ви правильно використовуєте сторонню бібліотеку.
-
Використовуйте шаблон адаптера, щоб подолати розрив між сторонньою бібліотекою API і API, який ви хотіли б мати.
-
Обгортання сторонніх інтерфейсів API тонким шаром абстракції спрощує заміну однієї бібліотеки на іншу в майбутньому. (Повторюється з глави 7)
-
Обгортання сторонніх інтерфейсів API тонким шаром абстракції спрощує імітацію бібліотеки під час тестування. (Повторюється з глави 7)
-
Намагайтеся не повідомляти вашому додатку занадто багато інформації про деталі будь-якої сторонньої бібліотеки.
-
Краще залежати від того, що ви контролюєте, ніж від того, що ви не контролюєте.
Розділ 9: Модульні тести
-
Тестовий код повинен бути таким самим чистим, як і виробничий код (за деякими винятками, зазвичай пов'язаними з пам'яттю або ефективністю).
-
У міру зміни коду виробництва змінюється і тестовий код.
-
Тести допомагають зберегти ваш виробничий код гнучким та підтримуваним.
-
Тести дозволяють вносити зміни, дозволяючи вам впевнено виконувати рефакторинг, не побоюючись, що ви цього не помітите.
-
Структуруйте свої тести за допомогою шаблону Arrange-Act-Assert (також відомого як Build-Operate-Check, Setup-Exercise-Verify або Given-When-Then).
-
Використовуйте функції, що залежать від предметної області, щоб спростити написання та читання тестів.
-
Оцініть одну концепцію тесту.
-
Тести мають бути швидкими.
-
Тести мають бути незалежними.
-
Тести мають бути повторюваними.
-
Тести не мають вимагати підтверджень.
-
Тести мають бути написані вчасно, незадовго до чи після написання виробничого коду, а чи не за кілька місяців.
-
Якщо ваші тести будуть неправильними, очікуйте, що у вашому коді будуть помилки.
Розділ 10: Класи
-
Класи мають бути невеликими.
-
Класи повинні відповідати лише за одну річ і повинні мати лише одну причину зміни (принцип єдиної відповідальності).
-
Якщо ви не можете вигадати чітку назву для класу, ймовірно, він занадто великий.
-
Ваша робота не закінчується на тому, що ви змусите частину коду працювати. Наступним кроком стане рефакторинг та очищення коду.
-
Використання безлічі невеликих класів замість кількох великих класів у вашому додатку скорочує обсяг інформації, яку розробник повинен розуміти під час роботи над заданим завданням.
-
Наявність гарного набору тестів дозволяє з упевненістю виконувати рефакторинг, коли ви розбиваєте великі класи на дрібніші.
-
Класи мають бути відкриті для розширення, але закриті для модифікації (принцип відкритості-закритості).
-
Інтерфейси та абстрактні класи створюють стики (seams), які спрощують тестування.
Глава 11: Системи
-
Використовуйте впровадження залежностей, щоб розробникам надати гнучкість для передачі будь-якого об'єкта з відповідним інтерфейсом в інший клас.
-
Використовуйте впровадження залежностей для створення стиків об'єктів у програмі, щоб спростити тестування.
-
Програмні системи не схожі на будівлю, яку потрібно заздалегідь проектувати. Вони більше схожі на міста, які з часом зростають та розширюються, адаптуючись до поточних потреб.
-
Відкладіть ухвалення рішення до останнього відповідального моменту.
-
Використовуйте предметно-орієнтовану мову, щоб експерти та розробники в предметній галузі використовували ту саму термінологію.
-
Не ускладнюйте свою систему надто сильно. Використовуйте найпростіше, що працює.
Розділ 12: Розгортання
-
Системи, які не можна тестувати, не можна перевірити, а системи, які не можна перевірити, ніколи не слід розгортати.
-
Написання тестів призводить до кращого дизайну, тому що код, який легко тестувати, часто використовує впровадження залежностей, інтерфейсів та абстракцій.
-
Хороший набір тестів позбавить вас від страху зламати програму під час рефакторингу.
-
Дублювання коду створює більший ризик, оскільки код має більше місць, які можна змінити, і ще більше місць, де помилки можуть бути приховані.
-
Код, який ви пишете зараз, легше зрозуміти, тому що ви глибоко залучені до його розуміння. Іншим непросто швидко досягти такого рівня розуміння.
-
Більшість вартості програмного проекту пов'язані з довгостроковим обслуговуванням.
-
Тести служать живою документацією того, як ваш додаток повинен (і поводиться) поводитися.
-
Не рухайтеся далі, коли ваш код запрацює. Знайдіть час, щоб зробити його більш зрозумілим та зрозумілим.
-
Наступним, хто прочитає ваш код у найближчому майбутньому, швидше за все, ви будете. Будьте ласкаві до себе в майбутньому, написавши простий для розуміння код.
-
Опирайтеся догмам. Прийміть прагматизм.
-
Щоб стати справді добрим фахівцем у галузі розробки програмного забезпечення, потрібні десятиліття. Ви можете прискорити процес навчання, вивчаючи досвід навколишніх експертів і вивчаючи шаблони проектування, що часто використовуються.
Глава 13: Паралелізм
-
Писати паралельний код складно.
-
Випадкові помилки та проблеми, які важко відтворити, часто є проблемами паралелізму.
-
Тестування не гарантує відсутність помилок у вашій програмі, але мінімізує ризик.
-
Дізнайтеся про загальні проблеми паралелізму та їх можливі рішення.
Глава 14: Послідовне уточнення
-
Чистий код зазвичай не починається з чистого аркуша. Спочатку ви пишете чорнове рішення, а потім реорганізуєте його, щоб зробити його чистішим.
-
Помилково припиняти роботу над кодом, коли він “заробив”. Знайдіть час, щоб зробити його ще краще після того, як він працює.
-
Заворушення наростають поступово.
-
Якщо ви опинабося у скрутному становищі, коли додавання функцій надто складне або займає занадто багато часу, припиніть писати функції та почніть рефакторинг.
-
Поступові зміни часто кращі, ніж відновлення з нуля.
-
Використовуйте розробку через тестування (Test-Driven Development — TDD), щоб зробити велику кількість дуже дрібних змін.
-
Хороший дизайн програмного забезпечення передбачає поділ проблем у вашому коді та поділ коду на дрібніші модулі, класи та файли.
-
Легше прибрати безлад відразу після того, як ви його створабо, ніж прибирати пізніше.
Розділ 15: Внутрішній пристрій JUnit
-
Негативні імена змінних чи умовні висловлювання трохи важче зрозуміти, ніж позитивні.
-
Рефакторинг - це ітеративний процес, повний спроб і помилок.
-
Залиште кодову базу у кращому вигляді, ніж коли ви її знайшли (Правило бойскауту). (Повторюється з глави 1)
Глава 16: Рефакторинг SerialDate
-
Перевірки коду та критика нашого коду роблять нас кращими, і ми повинні вітати це.
-
Спершу змусіть код працювати, потім виправте.
-
Не кожен рядок коду потрібне тестування.
Глава 17: Запахи та евристика
-
Чистий код – це не набір правил, а скоріше система цінностей, що визначають якість вашої роботи.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ