image Неуместная близость»? «Оргия объектов»? «Принцип KISS»? А мы точно о программировании?

Привет, Хаброжители! Если ваша первая и единственная реакция на эти словосочетания — смех, то вполне вероятно, что от вашего кода «пахнет». Запах кода (code smell) — термин, который был введен разработчиком Кентом Беком и популяризирован Мартином Фаулером. По сути, запах кода — это симптом, признак проблемы; он указывает на такой фрагмент кода, который можно (и нужно) улучшить.

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

Проверенные рецепты на JavaScript, PHP, Python, Java и других языках программирования помогут масштабировать и поддерживать большие системы. В каждом разделе рассматриваются такие фундаментальные понятия, как читаемость кода, связанность, тестируемость, безопасность и расширяемость, а также запахи кода и соответствующие рецепты их устранения.

Принцип YAGNI


Эйнштейн неоднократно утверждал, что природа должна иметь простые объяснения, поскольку Богу не свойственны капризность и произвол. Никакая такая вера не утешает инженера программного обеспечения.

Фредерик Брукс «Мифический человеко-месяц, или Как создаются программные системы»

Введение

Принцип YAGNI, что расшифровывается как «Вам это не понадобится» (You Ain’t Gonna Need It), советует разработчикам реализовывать только те функции или функциональность, которые действительно необходимы в данный момент, а не добавлять ненужные функции или функционал, который может никогда не пригодиться в будущем. Идея YAGNI заключается в том, чтобы свести к минимуму ненужную сложность и сосредоточиться на наиболее важных задачах.

Принцип YAGNI можно рассматривать как противовес общей тенденции разработки ПО к чрезмерному усложнению решений или добавлению лишних функций с учетом будущих потребностей или требований. Это может привести к ненужной сложности, напрасной трате времени и сил, а также к завышенным затратам на обслуживание.

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

Удаление мертвого кода


Проблема
Наличие кода, который больше не используется или не нужен.

Решение
Не храните код «на всякий случай». Удаляйте его.

Обсуждение
Мертвый код ухудшает обслуживаемость и нарушает принцип KISS (см. рецепт 6.2 «Удаление пустых строк»), поскольку, если код не работает, никто его не поддерживает. Рассмотрим следующий пример с так называемым «золочением» кода:

class Robot {
  walk(){
    //...
  }
  serialize(){
    //...
  }
  persistOnDatabase(database){
    //...
  }
}

«Золочение» (gold plating)
«Золочение», или украшательство, — практика добавления в продукт или проект ненужных функций либо возможностей, выходящих за рамки минимальных требований или спецификаций. Это может происходить по разным причинам, например из желания произвести впечатление на клиента или чтобы выделить продукт на рынке. Однако «золочение» может нанести вред проекту, поскольку приводит к перерасходу средств и превышению сроков, и при этом обычно не создает реальной ценности для конечного пользователя.

Вот более простой объект с правильно определенными ответственностями:

class Robot {
  walk(){
   // ...
   }
}

Тесты могут находить мертвый (неохваченный) код при обеспечении должного покрытия. Но учтите, что его сложно обеспечить при метапрограммировании (см. главу 23 «Метапрограммирование»). При метапрограммировании очень трудно найти ссылки на код. Для простоты удалите мертвый код. Если вы не уверены в коде, временно отключите его с помощью переключателей функций. Удаление кода всегда предпочтительнее, чем добавление, и его всегда можно найти в истории Git (см. рецепт 8.1 «Удаление закомментированного кода»).

Использование кода вместо диаграмм


Проблема
Для документирования работы продукта используются диаграммы.

Решение
Используйте код и тесты в качестве самостоятельной документации.

Обсуждение
Большинство диаграмм фокусируются на структуре (что несущественно), а не на поведении (что существенно). Их следует использовать только для передачи идей. Доверяйте тестам. Они живут и должным образом обслуживаются.
На рис. 12.1 представлен пример диаграммы на унифицированном языке моделирования (Unified Modeling Language, UML). Хотя диаграмма и полезна, но важнее понимать код и тесты, так как диаграмма может устареть в процессе разработки; а тесты не могут лгать, если вы постоянно их выполняете.

image

Рис. 12.1. Простейшая UML-диаграмма, представляющая библиотеку (LoanTracker — Трекер выдачи книг; BookEdition — Книжное издание; Loan — Выдача; BookItem — Единица хранения; LibraryUser — Пользователь библиотеки; Language — Язык)

Вот упрощенный исполняемый код из диаграммы, моделирующий часть предметной области Library (Библиотека):

final class BookItem {
  function numberOfPages() { }
  function language(): Language { }
  function book(): Book { }
  function edition(): BookEdition { }
  // Выдача книг и просрочка не являются ответственностью единицы хранения
  // BookItem
}

final class LoanTracker {
  function loan(
    BookItem $bookCopy,
    LibraryUser $reader,
    DatePeriod $loanDates) {
    // DatePeriod лучше, чем анемичные $fromDate и $toDate
  }
}

final class LoanTrackerTests extends TestCase {
  // <i>Множество поддерживаемых тестов, показывающих, как на самом деле
  // <i>работает система.
}

Удалите все аннотации к коду и запретите их в соответствии с общеизвестной политикой. Проектирование программ — контактный вид спорта, в котором нужно создавать прототипы и учиться на рабочих моделях. Таблицы и файлы JPEG статичны и не запускаются; они живут в утопическом мире, где все работает гладко. Некоторые диаграммы высокоуровневой архитектуры полезны для понимания общей картины и обсуждения конкретных концепций с другими членами команды.

UML-диаграммы
UML-диаграммы (Unified Modeling Language, унифицированный язык моделирования) — стандартные визуальные представления, описывающие структуру и поведение программной системы или приложения с помощью общего набора символов и обозначений. Они были популярны в 80-х и 90-х годах и тесно связаны с каскадной моделью разработки, при которой проектирование завершается до фактического написания кода, в отличие от Agile-методологий. Многие организации и сегодня используют UML.
Как устроена книга
Книга включает 25 глав. Каждая глава начинается с описания принципов и основ, демонстрирующих преимущества чистого кода, результаты его работы и последствия его неверного применения. В первой главе рассказывается о едином руководящем правиле чистого кода: сопоставлять реальные сущности с проектом в масштабе один к одному. Это правило служит основой, из которой выводятся все остальные принципы.

В каждой главе вы найдете несколько рецептов на определенную тему, содержащих описание инструментов и советы по изменению кода. Цель каждого рецепта — помочь вам сделать свой код лучше. Кроме рецептов и примеров, вы познакомитесь с принципами, эвристиками и правилами проектирования программ. Рецепты содержат примеры кода на нескольких языках программирования, поскольку чистый код не является свойством только одного определенного языка. Многие книги по рефакторингу опираются на один язык, и авторы обновляют их издания, используя язык, который на данный момент находится в тренде. Эта книга не зависит от языка программирования, и большинство рецептов применимы ко многим языкам (за исключением особых указаний).

Код следует читать как псевдокод, хотя большая его часть выполняется как есть. Когда нужно сделать выбор между читаемостью и производительностью, я всегда выбираю читаемость. На протяжении всей книги я даю определения общих терминов, но вы можете найти их и в глоссарии в конце книги.
Об авторе и научном редакторе русского издания
image
Максимилиано Контьери (Maximiliano Contieri) имеет 25-летний стаж работы в сфере разработки ПО и преподавания в университете. Многие годы он активно сотрудничает с известными блог-платформами, каждую неделю публикуя множество статей на разнообразные темы, такие, например, как чистый код, рефакторинг, проектирование ПО, разработка через тестирование и запахи кода. Контьери придерживается декларативной и поведенческой парадигм программирования, делая акцент на использовании основ разработки ПО для создания элегантных, масштабируемых и надежных решений.

Мамиева Махфузахон — Java-разработчик в компании КРОК. Реализует проекты управления контентом и документооборота.

С книгой «Рецепты чистого кода» можно ознакомиться на сайте издательства:

» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Рецепты

Комментарии (2)


  1. Metotron0
    24.12.2024 14:24

    https://static.insales-cdn.com/images/products/1/8188/934191100/01084575.jpg
    А что ж какого низкого качества обложку выбрали? Да ещё в блок 250x351 запихали картинку 248x349

    Я бы ещё посоветовал для body задать белый фон, а то не у всех в браузерах фон по умолчанию белый:

    А ещё в шапке разъехались два подчёркивания:

    Что у вас все иконки и картинки размыты в 4k, вы, думаю, и так знаете.


    1. MuKPo6
      24.12.2024 14:24

      Вы приняты.