Як написати чистий код? Уроки, отримані з “Чистого кодексу” - Роберт К. Мартін

Є дві речі - програмування та хороше програмування. Програмування - це те, чим ми всі займалися. Зараз саме час зробити хороше програмування. Ми всі знаємо, що навіть поганий код працює. Але потрібні час і ресурси, щоб зробити програму доброю. Більше того, інші розробники знущаються над вами, коли вони намагаються з’ясувати, що все відбувається у вашому коді. Але ніколи не пізно піклуватися про свої програми.

уроки

Ця книга дала мені багато знань про те, які найкращі практики та як насправді писати код. Зараз мені соромно за свої навички кодування. Хоча я завжди прагну до вдосконалення свого коду, ця книга навчила набагато більше.

Зараз ви читаєте цей блог з двох причин. По-перше, ви програміст. По-друге, ви хочете бути кращим програмістом. Добре. Нам потрібні кращі програмісти.

Характеристики чистого коду:

  1. Він повинен бути елегантним - Чистий код повинен бути приємним для читання. Читаючи його, ви повинні посміхнутися так, як добре продумана музична шкатулка або продуманий автомобіль.
  2. Чистий код орієнтований - кожна функція, кожен клас, кожен модуль виявляє єдинодушне ставлення, яке залишається повністю невідволіканим та незабрудненим оточуючими деталями.
  3. Про чистий код подбали. Хтось знайшов час, щоб зберегти це просто і впорядковано. Вони приділили належну увагу деталям. Вони дбали.

4. Запускає всі тести

5. Не містить копіювання

6. Мінімізуйте кількість сутностей, таких як класи, методи, функції тощо.

Використовуйте наміри, що розкривають імена. Вибір хороших імен вимагає часу, але економить більше, ніж потрібно. Ім'я змінної, функції або класу має відповісти на всі важливі запитання. Це повинно сказати вам, чому воно існує, що воно робить і як воно використовується. Якщо для імені потрібен коментар, то ім’я не розкриває його наміру.

Напр. D; // час, що минув у днях.

Ми повинні вибрати назву, яка вказує, що вимірюється, і одиницю виміру.

Кращою назвою буде: - int elapsedTime. (Незважаючи на те, що в книзі сказано elapsedTimeInDays, я все одно віддаю перевагу першому. Припустимо, що минулий час змінено на мілісекунди. Тоді нам доведеться довго змінювати int і elapsedTimeInMillis замість elapsedTimeInDays. І скільки часу ми будемо продовжувати змінювати обидва тип даних та ім'я.)

Назви класів - Класи та об’єкти повинні мати імена іменників або іменників, таких як Клієнт, Вікісторінка, Обліковий запис та Адресний парсер. Уникайте слів, таких як менеджер, процесор, дані чи інформація в назві класу. Назва класу не повинна бути дієсловом.

Назви методів -Методи повинні мати назви дієслів або дієслів, таких як postPayment, deletePage або save. Аксесоари, мутатори та предикати повинні бути названі за їх значенням і префіксом get, set.

Коли конструктори перевантажені, використовуйте статичні фабричні методи з іменами, що описують аргументи. Наприклад,

Складна точка опори = Комплекс.ФромРеальнийЧисло (23.0); як правило, кращий за Complex fulcrumPoint = new Complex (23.0);

Виберіть одне слово для концепції -Виберіть одне слово для одного абстрактного поняття і дотримуйтесь його. Наприклад, заплутано мати вибірку, отримання та отримання як еквівалентні методи різних класів. Як ви пам’ятаєте, яка назва методу поєднується з яким класом? Так само заплутано мати контролер, менеджер і драйвер в одній базі коду. У чому полягає суттєва різниця між DeviceManager та контролером протоколів?

Перше правило функцій полягає в тому, що вони повинні бути малими. Друге правило функцій полягає в тому, що вони повинні бути меншими за це. Це означає, що блоки, що містяться в операторах if, else, у той час як оператори тощо, повинні складати один рядок. Можливо, ця лінія повинна бути викликом функції. Це не тільки робить функцію, що обгороджує, невеликою, але й додає документальне значення, оскільки функція, що викликається в блоці, може мати приємне описове ім’я.

Аргументи функції

Функція не повинна мати більше 3 аргументів. Тримайте його якомога нижче. Коли функція, здається, потребує більше двох-трьох аргументів, цілком ймовірно, що деякі з цих аргументів повинні бути перенесені у власний клас. Зменшення кількості аргументів, створюючи з них об’єкти, може здатися обманом, але це не так.

Тепер, коли я кажу про зменшення розміру функції, ви точно задумаєтесь, як зменшити функцію try-catch, оскільки це вже робить ваш код набагато більшим. Моя відповідь - зробити функцію, що містить лише оператори try-catch-нарешті. І розділіть тіла try/catch/нарешті блоку в окремі функції. Напр-

Це робить логіку кристально зрозумілою. Назви функцій легко описують, чого ми намагаємось досягти. Обробку помилок можна проігнорувати. Це забезпечує приємне розділення, що полегшує розуміння та модифікацію коду.

Обробка помилок - це одне - Функція повинна робити одне. Обробка помилок - це одна інша річ. Якщо у функції є ключове слово try, то це має бути найперше ключове слово, і після блоків catch/нарешті не повинно бути нічого.

Коментарі

Якщо ви пишете коментарі, щоб довести свою думку, ви робите помилку. В ідеалі коментарі взагалі не потрібні. Якщо ваш код потребує коментарів, ви робите щось не так. Наш код повинен все пояснити. Сучасні мови програмування - це англійська мова, завдяки якій ми можемо легко пояснити свою думку. Правильне іменування може запобігти появі коментарів.

Юридичні коментарі тут не враховуються. Їх потрібно писати. Юридичні коментарі - це заяви про авторські права та ліцензії.

Об'єкти та структури даних

Це складна тема, тому приділіть їй пильну увагу. Спочатку нам потрібно з’ясувати різницю між об’єктом та структурами даних.

Об'єкти приховують свої дані за абстракціями та виставляють функції, які працюють з цими даними. Структура даних відкриває їх дані і не має жодних значущих функцій.

Ці 2 речі абсолютно різні. Одне стосується лише зберігання даних, а інше - як ними маніпулювати. Розглянемо, наприклад, приклад процедурної форми нижче. Клас геометрії працює на трьох класах фігур. Класи фігур - це прості структури даних без будь-якої поведінки. Вся поведінка відбувається в класі геометрії.

Поміркуйте, що сталося б, якби до Геометрії було додано функцію периметра (). Класи фігури це не вплине! Будь-які інші класи, які залежали від форм, також не зазнають змін! З іншого боку, якщо я додаю нову фігуру, я повинен змінити всі функції в геометрії, щоб мати справу з нею. Знову прочитайте це. Зверніть увагу, що ці дві умови діаметрально протилежні.

Тепер розглянемо інший підхід для вищезазначеного сценарію.

Тепер ми можемо легко додавати нові Фігури, тобто структури даних у порівнянні з попереднім випадком. І якщо нам потрібно додати функцію perimeter () лише в одній Shape, ми змушені реалізувати цю функцію у всіх Shapes, оскільки клас Shape є інтерфейсом, що містить функцію area () та perimeter (). Це означає:

Структури даних спрощують додавання нових функцій без зміни існуючих структур даних. OO-код (за допомогою об'єктів) полегшує додавання нових класів без зміни існуючих функцій.

Безкоштовне також відповідає дійсності:

Процедурний код (із використанням структур даних) ускладнює додавання нових структур даних, оскільки всі функції повинні змінюватися. Код OO ускладнює додавання нових функцій, оскільки всі класи повинні змінюватися.

Отже, речі, важкі для ОО, легкі для процедур, а важкі для процедур - легкі для ОО!

У будь-якій складній системі бувають випадки, коли ми хочемо додати нові типи даних, а не нові функції. У цих випадках найбільш доречні об'єкти та ОО. З іншого боку, іноді ми хочемо додати нові функції на відміну від типів даних. У цьому випадку процедурний код та структури даних будуть більш доречними.

Зрілі програмісти знають, що думка про те, що все є об’єктом - це міф. Іноді ви дійсно хочете отримати прості структури даних із процедурами, що діють на них. Тож ви повинні ретельно продумати, що реалізувати, також думаючи про майбутню перспективу, яку можна буде легко оновити. Що стосується цього прикладу, оскільки будь-яку нову фігуру можна буде додати в майбутньому, я оберу для неї підхід OO.

Я розумію, що важко писати хороші програми, враховуючи тимчасовий графік, за який ти повинен виконувати свої завдання. Але доки ви затримаєтесь? Почніть повільно і будьте послідовними. Ваш код може творити чудеса для вас самих і здебільшого для інших. Я розпочав і знайшов стільки помилок, які робив увесь час. Хоча це зайняло додаткові години мого щоденного ліміту, це заплатить мені в майбутньому.

Це ще не кінець цього блогу. Я продовжуватиму писати про нові способи очищення коду. Більше того, я також напишу про деякі основні шаблони дизайну, які повинен знати кожен розробник будь-якої технології.

Тим часом, якщо вам подобається мій блог і ви дізналися з нього, просимо оплески. Це дає мені мотивацію швидше створювати новий щоденник:) Коментарі/пропозиції вітаються як завжди. Продовжуйте вчитися і продовжуйте ділитися.