Ключевые моменты из книги, которую необходимо прочитать для программистов

Недавно я написал о 5 книгах, которые изменили мой кодекс. В комментариях несколько читателей рекомендовали Чистый код Роберта К. Мартина. В результате я прочитал книгу и нашел ее достойной подробного обзора.

О книге

Чистый код был опубликован в 2008 году, и в последние годы он неизменно входит в пятерку самых продаваемых книг на А мазоне. Автор, ласково известный как Дядя Боб, был одним из первых авторов Agile Manifesto и имеет серьезные заслуги. Книга получила средний рейтинг 4,4 на Goodreads из более чем 13 000 оценок. Достаточно сказать, что это одна из тех книг, которые должен прочитать каждый программист.

В этом обзоре я собираюсь свести книгу к пяти важным выводам.

1. Программирование - это ремесло

Я часто думал, что архитектура и строительство - плохие метафоры для программирования. Мы не создаем полный проект, а затем строим фундамент с нуля, постепенно продвигаясь к законченному зданию.

Скорее, мы начинаем с наброска, итеративно добавляя детали. Мы пересматриваем, уточняем и расширяем - работая на разных уровнях абстракции, пока программное обеспечение не сделает то, что нам нужно. Программное обеспечение никогда не бывает по-настоящему законченным.

В этом суть «чистого кода». На протяжении всей книги автор выражает идею о том, что программное обеспечение - это искусство, «во многом напоминающее рисование картины». По сути, он считает, что программирование - это ремесло.

Но как перейти от простого написания кода к созданию кода?

По словам Мартина, основные инструменты, которыми мы располагаем, - это непрерывный рефакторинг и разработка через тестирование (TDD). Они работают вместе, как две стороны медали. Вот несколько определений:

Рефакторинг - это процесс реструктуризации существующего компьютерного кода без изменения его внешнего поведения.

Разработка через тестирование - это процесс, в котором требования превращаются в конкретные тестовые примеры, а затем добавляется код для прохождения тестов.

Итак, процесс создания программного обеспечения может выглядеть примерно так:

  1. Напишите неудачные тесты, которые проверяют требуемое, но нереализованное поведение.
  2. Напишите некоторый (потенциально плохой) код, который работает и обеспечивает прохождение этих тестов.
  3. Постепенно реорганизуйте код, продолжая прохождение тестов, делая его более чистым с каждой итерацией разработки.

«Это миф, что мы можем получить системы« правильно с первого раза ». Вместо этого мы должны внедрять только сегодняшние истории, а затем проводить рефакторинг и расширять систему для внедрения новых историй завтра. В этом суть итеративной и возрастающей гибкости ».

- Роберт С. Мартин

Таким образом, центральная идея, представленная Мартином, заключается в том, что чистый код - это то, что возникает в процессе и практике разработки, а не просто создается за один проход.

2. Будьте краткими!

«Первое правило функций - они должны быть небольшими. Второе правило функций - они должны быть меньше этого ». - Роберт С. Мартин

По словам Мартина, это означает две вещи:

  • Тела функций должны быть короткими - не более 20 строк и обычно менее 10 строк.
  • Функции должны принимать как можно меньше аргументов, желательно ни одного.

Краткость функций облегчает чтение кода. Это также подталкивает нас к ситуации, когда функции делают одно - и делают это хорошо.

Он делает то же самое в отношении классов. В случае классов он предлагает использовать обязанности как меру размера, а не строки кода. Идея в том, что класс должен отвечать только за одну вещь. Это известно как принцип единой ответственности (SRP).

Сокращение сущностей - это стратегия «разделяй и властвуй», позволяющая сделать код более чистым. Если у нас есть большой файл с большим количеством длинного и сложного кода, мы можем разделить этот файл на модули, разделить модули на функции и разделить функции на подфункции, пока логика и цель не станут ясны.

3. Сделайте код самодокументирующимся

«Четкий и выразительный код с небольшим количеством комментариев намного превосходит загроможденный и сложный код с большим количеством комментариев». - Роберт С. Мартин

В разделах о комментариях, значимых именах и форматировании Мартин приводит веские доводы в пользу того, что код самодокументируется. Пример этого дается следующим образом:

// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
    (employee.age > 65))

Это будет преобразовано в:

if (employee.isEligibleForFullBenefits())

Примечание.

  • Комментарий удален
  • Условная логика инкапсулирована в метод
  • Поскольку используется метод, а не отдельная функция, можно использовать переменные экземпляра, создавая вызов метода без аргументов.
  • Этому методу дано описательное имя, что делает его ответственность предельно ясной.

Чистый код включает в себя полную главу, посвященную именованию, которая, по сути, является развитием правил Тима Оттингера. Это включает:

  • Используйте имена, раскрывающие намерение - например, int elapsedTimeInDays, а не int days
  • Используйте произносимые имена - например, Customer, а не DtaRcrd102
  • Избегайте кодировок - не используйте префикс m_ для членов и не используйте венгерскую нотацию
  • Выберите одно слово для каждого понятия - не fetch, retrieve, get для одного и того же понятия.

4. Уважайте абстракцию.

Согласно «Чистому коду», если мы хотим убедиться, что наши функции выполняют только одно действие, нам нужно убедиться, что все операторы внутри каждой функции находятся на одном уровне абстракции.

Мартин иллюстрирует это следующим примером из FitNesse:

Это смешивает как минимум два уровня абстракции. Первый - это высокоуровневая концепция рендеринга тега hr заданного размера, а вторая касается низкоуровневых деталей синтаксиса фактического создания тега. Чтобы проиллюстрировать это, код реорганизован более чисто, а именно:

Примечания:

  • Функция render() теперь отвечает только за создание тега hr.
  • Низкоуровневые детали построения тега теперь делегированы модулю HtmlTag.
  • Форматирование размера выделено в отдельную функцию

По словам Мартина:

«Разделение уровней абстракции - одна из самых важных функций рефакторинга, и одна из самых сложных для ее выполнения».

Это определенно то, о чем я буду думать гораздо больше в моем собственном коде в будущем.

5. Чистый код - это принципы и упорный труд

Я не хотел, чтобы этот обзор был просто списком пунктов и афоризмов, которые формируют правила, которые мы можем просто применить, чтобы получить чистый код. Сделать это было бы медвежьей услугой по отношению к книге, поскольку она далека от такого догматического подхода.

Скорее, у меня сложилось впечатление, что Мартин уговаривает нас развить твердое чувство личных принципов и постоянно демонстрирует усилия и добросовестность, необходимые для того, чтобы код стал чистым. В книге это называется чувством кода, что требует «дисциплинированного использования множества небольших приемов, применяемых через кропотливо приобретенное чувство чистоты».

«Чистый код не пишется по набору правил. Вы не станете мастером программного обеспечения, изучив список эвристик. Профессионализм и мастерство проистекают из ценностей, которые определяют дисциплину ». - Роберт С. Мартин

Лично я, как человек, страдающий неуверенностью, очень приветствовал этот акцент. Приятно знать, что даже дядя Боб твердо уверен, что программирование - это сложно и требует серьезной работы и дисциплины. Чтобы по-настоящему научиться писать чистый код, нам нужно постоянно совершенствовать свое личное развитие как программистов, а также развивать наш код.

Выводы

Не все идеи в «Чистом коде» были созданы дядей Бобом, и он открыто признает это в различных местах книги. Во всяком случае, это одна из вещей, которая делает книгу такой успешной - это квинтэссенция мудрости различных частей сообщества программистов, дополненная практическими примерами.

Если у меня есть одно незначительное замечание, так это то, что баланс между главами о деталях немного нарушен по сравнению с главами о концепциях более высокого уровня. В главе о системах всего 13 страниц, почти половина места отведена под комментарии. Однако я подозреваю, что меньше внимания системам уделялось тому, чтобы сохранить это обсуждение для его более поздней книги Чистая архитектура, которая будет в моем списке для чтения в 2021 году. Помимо этого, это одна из лучших книг по программированию. там.