JavaRush /Java блог /Random /Кофе-брейк #103. В защиту “Чистого кода”: 100 вечных сове...

Кофе-брейк #103. В защиту “Чистого кода”: 100 вечных советов

Статья из группы Random
Источник: Hackernoon “Чистый код” Роберта К. Мартина — самая рекомендуемая книга по программированию всех времен. Поищите книги по запросу “лучшие книги для разработчиков программного обеспечения” и почти гарантированно найдете эту книгу в поисковой выдаче. И хотя некоторые люди считают, что на книгу “Чистый код” не стоит обращать внимание, я бы сказал, что подобные настроения глубоко ошибочны. Да, некоторые советы в книге сомнительны. Да, часть контента кажется устаревшей. Да, некоторые примеры сбивают с толку. Все это правда. Но давайте не будем так быстро сбрасывать со счетов множество полезных советов, которые предлагает эта книга! Полное игнорирование “Чистого кода” просто из-за нескольких плохих идей — не самое лучшее решение. Кофе-брейк #103. В защиту “Чистого кода”: 100 вечных советов - 1Итак, давайте без лишних слов рассмотрим лучшие советы, которые предлагает нам книга Clean Code! Мы пройдемся по каждой главе, суммируя идеи, которые предлагает дядя Боб и его соавторы.

Глава 1: Чистый код

  1. Общее количество беспорядка со временем увеличивается.

  2. Восстановить устаревшую систему с нуля очень сложно. Рефакторинг и постепенные улучшения станут лучшим для этого вариантом.

  3. В запутанной кодовой базе на выполнение задач, которые должны занимать всего несколько часов, могут уйти дни или недели.

  4. Найдите время, чтобы действовать быстро.

  5. Чистый код хорошо справляется с одной задачей. Плохой код пытается сделать слишком много.

  6. Чистый код хорошо протестирован.

  7. При чтении хорошо написанного кода каждая функция делает примерно то, что вы ожидали.

  8. Если вы не согласны с принципом, который преподает кто-то с многолетним опытом, вам следует хотя бы рассмотреть его точку зрения, прежде чем игнорировать ее.

  9. Код читают гораздо чаще, чем пишут.

  10. Код, который легче читать, легче изменить.

  11. Оставьте кодовую базу в лучшем виде, чем когда вы ее нашли (Правило бойскаута).

Глава 2: Значение имен

  1. Тщательно выбирайте имена переменных.

  2. Выбирать хорошие имена сложно.

  3. Имя переменной или функции должно указывать на то, что это такое и как используется.

  4. Избегайте использования односимвольных имен переменных, за исключением часто используемых имен, например, i для переменной счетчика в цикле.

  5. Избегайте использовать сокращение в именах переменных.

  6. Имена переменных должны быть произносимыми, чтобы вы могли говорить о них и произносить их вслух.

  7. Используйте имена переменных, которые легко найти.

  8. Классы и объекты должны иметь имена в виде существительных.

  9. Имена методов и функций должны быть глаголами или парами глагол-существительное.

Глава 3: Функции

  1. Функции должны быть небольшими.

  2. Функция должна выполнять одно действие.

  3. Функции должны иметь описательные имена.

  4. Извлеките код в теле if / else или переключите операторы в четко названные функции.

  5. Ограничьте количество аргументов, которые принимает функция.

  6. Если функции требуется много аргументов конфигурации, рассмотрите возможность объединения их в одну переменную параметров конфигурации.

  7. Функции должны быть чистыми, что означает, что они не имеют побочных эффектов и не изменяют свои входные аргументы.

  8. Функция должна быть командой или запросом, но не тем и другим сразу (Command Query Separation — Разделение запросов команд).

  9. Лучше удалить из кода ошибки и исключения, чем оставить ошибки в коде.

  10. Извлеките дублированный код в четко названные функции (Don't Repeat Yourself).

  11. Модульные тесты упрощают рефакторинг.

Глава 4: Комментарии

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

  2. Используйте комментарии, чтобы описать, почему это написано так, как оно есть, а не объяснять, что происходит.

  3. Комментариев часто можно избежать, используя четко названные переменные и извлекая разделы кода в четко названные функции.

  4. Добавляйте к комментариям TODO единообразные префиксы, чтобы упростить их поиск. Периодически просматривайте и очищайте свои TODO-комментарии.

  5. Не используйте Javadocs только ради их использования. Комментарии, описывающие, что делает метод, какие аргументы он принимает и что возвращает, в лучшем случае избыточны, а в худшем — вводят в заблуждение.

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

  7. Комментарии журнала и комментарии автора файла не нужны из-за контроля версий и git blame.

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

Глава 5: Форматирование

  1. В команде выберите набор правил для форматирования кода, а затем последовательно применяйте эти правила. Неважно, с какими правилами вы согласны, вам нужно прийти к соглашению.

  2. Используйте автоматическое форматирование кода и анализатор кода. Не полагайтесь на то, что люди вручную найдут и исправят каждую ошибку форматирования. Это неэффективно, непродуктивно и пустая трата времени при проверке кода.

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

  4. Небольшие файлы легче читать, понимать и перемещать, чем крупные файлы.

  5. Переменные следует объявлять рядом с тем, где они используются. Для небольших функций это обычно вверху функции.

  6. Даже для коротких функций или операторов if все равно форматируйте их правильно, а не записывайте в одной строке.

Глава 6: Объекты и структуры данных

  1. Детали реализации в объекте должны быть скрыты за интерфейсом объекта. Предоставляя интерфейс для использования потребителями объекта, вы упрощаете последующий рефакторинг деталей реализации, не вызывая критических изменений. Абстракции упрощают рефакторинг.

  2. Любой данный фрагмент кода не должен знать о внутреннем устройстве объекта, с которым он работает.

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

Глава 7: Исправление ошибок

  1. Обработка ошибок не должна мешать остальному коду в модуле.

  2. Лучше удалить из кода ошибки и исключения, чем оставить ошибки в коде.

  3. Напишите тесты с ошибками, чтобы убедиться, что ваш код идентифицирует их, а не пропускает.

  4. Сообщения об ошибках должны быть информативными, со всем необходимым контекстом, который может понадобиться кому-то для эффективного устранения неполадок.

  5. Обертывание сторонних API-интерфейсов тонким слоем абстракции упрощает замену одной библиотеки на другую в будущем.

  6. Обертывание сторонних API-интерфейсов тонким слоем абстракции упрощает имитацию библиотеки во время тестирования.

  7. Используйте шаблон Special Case или шаблон Null Object для обработки исключительного поведения, например, когда определенные данные не существуют.

Глава 8: Границы

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

  2. Напишите тесты, чтобы убедиться, что вы правильно используете стороннюю библиотеку.

  3. Используйте шаблон адаптера, чтобы преодолеть разрыв между API сторонней библиотеки и API, который вы хотели бы иметь.

  4. Обертывание сторонних API-интерфейсов тонким слоем абстракции упрощает замену одной библиотеки на другую в будущем. (Повторяется из главы 7)

  5. Обертывание сторонних API-интерфейсов тонким слоем абстракции упрощает имитацию библиотеки во время тестирования. (Повторяется из главы 7)

  6. Старайтесь не сообщать вашему приложению слишком много информации о деталях какой-либо сторонней библиотеки.

  7. Лучше зависеть от того, что вы контролируете, чем от того, что вы не контролируете.

Глава 9: Модульные тесты

  1. Тестовый код должен быть таким же чистым, как и производственный код (за некоторыми исключениями, обычно связанными с памятью или эффективностью).

  2. По мере изменения производственного кода изменяется и тестовый код.

  3. Тесты помогают сохранить ваш производственный код гибким и поддерживаемым.

  4. Тесты позволяют вносить изменения, позволяя вам уверенно выполнять рефакторинг, не опасаясь, что вы сами этого не заметите.

  5. Структурируйте свои тесты с помощью шаблона Arrange-Act-Assert (также известного как Build-Operate-Check, Setup-Exercise-Verify или Given-When-Then).

  6. Используйте зависящие от предметной области функции, чтобы упростить написание и чтение тестов.

  7. Оцените одну концепцию за тест.

  8. Тесты должны быть быстрыми.

  9. Тесты должны быть независимыми.

  10. Тесты должны быть повторяемыми.

  11. Тесты не должны требовать подтверждений.

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

  13. Если ваши тесты будут неправильными, ожидайте, что в вашем коде будут ошибки.

Глава 10: Классы

  1. Классы должны быть небольшими.

  2. Классы должны отвечать только за одну вещь и должны иметь только одну причину для изменения (принцип единой ответственности).

  3. Если вы не можете придумать четкое название для класса, вероятно, он слишком велик.

  4. Ваша работа не заканчивается на том, что вы заставите часть кода работать. Следующим шагом станет рефакторинг и очистка кода.

  5. Использование множества небольших классов вместо нескольких больших классов в вашем приложении сокращает объем информации, которую разработчик должен понимать при работе над любой заданной задачей.

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

  7. Классы должны быть открыты для расширения, но закрыты для модификации (принцип открытости-закрытости).

  8. Интерфейсы и абстрактные классы создают стыки (seams), которые упрощают тестирование.

Глава 11: Системы

  1. Используйте внедрение зависимостей, чтобы дать разработчикам гибкость для передачи любого объекта с соответствующим интерфейсом в другой класс.

  2. Используйте внедрение зависимостей для создания стыков объектов в приложении, чтобы упростить тестирование.

  3. Программные системы не похожи на здание, которое нужно проектировать заранее. Они больше похожи на города, которые со временем растут и расширяются, адаптируясь к текущим потребностям.

  4. Отложите принятие решения до последнего ответственного момента.

  5. Используйте предметно-ориентированный язык, чтобы эксперты и разработчики в предметной области использовали одну и ту же терминологию.

  6. Не усложняйте свою систему слишком сильно. Используйте самое простое, что работает.

Глава 12: Развертывание

  1. Системы, которые нельзя тестировать, нельзя проверить, а системы, которые нельзя проверить, никогда не следует развертывать.

  2. Написание тестов приводит к лучшему дизайну, потому что код, который легко тестировать, часто использует внедрение зависимостей, интерфейсы и абстракцию.

  3. Хороший набор тестов избавит вас от страха сломать приложение во время рефакторинга.

  4. Дублирование кода создает больший риск, поскольку в коде есть больше мест, которые можно изменить, и еще больше мест, где ошибки могут быть скрыты.

  5. Код, который вы пишете сейчас, легче понять, потому что вы глубоко вовлечены в его понимание. Другим непросто быстро достичь такого же уровня понимания.

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

  7. Тесты служат живой документацией того, как ваше приложение должно (и ведет себя) вести себя.

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

  9. Следующим, кто прочитает ваш код в ближайшем будущем, скорее всего, будете вы. Будьте добры к себе в будущем, написав простой для понимания код.

  10. Сопротивляйтесь догмам. Примите прагматизм.

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

Глава 13: Параллелизм

  1. Писать параллельный код сложно.

  2. Случайные ошибки и проблемы, которые трудно воспроизвести, часто являются проблемами параллелизма.

  3. Тестирование не гарантирует отсутствие ошибок в вашем приложении, но минимизирует риск.

  4. Узнайте об общих проблемах параллелизма и их возможных решениях.

Глава 14: Последовательное уточнение

  1. Чистый код обычно не начинается с чистого листа. Сначала вы пишете черновое решение, а затем реорганизуете его, чтобы сделать его более чистым.

  2. Ошибочно прекращать работу над кодом, когда он “заработал”. Найдите время, чтобы сделать его еще лучше после того, как он уже работает.

  3. Беспорядки нарастают постепенно.

  4. Если вы оказались в затруднительном положении, когда добавление функций слишком сложно или занимает слишком много времени, прекратите писать функции и начните рефакторинг.

  5. Постепенные изменения часто лучше, чем восстановление с нуля.

  6. Используйте разработку через тестирование (Test-Driven Development — TDD), чтобы внести большое количество очень мелких изменений.

  7. Хороший дизайн программного обеспечения предполагает разделение проблем в вашем коде и разделение кода на более мелкие модули, классы и файлы.

  8. Легче убрать беспорядок сразу после того, как вы его создали, чем убирать позже.

Глава 15: Внутреннее устройство JUnit

  1. Отрицательные имена переменных или условные выражения немного труднее понять, чем положительные.

  2. Рефакторинг — это итеративный процесс, полный проб и ошибок.

  3. Оставьте кодовую базу в лучшем виде, чем когда вы ее нашли (Правило бойскаута). (Повторяется из главы 1)

Глава 16: Рефакторинг SerialDate

  1. Проверки кода и критика нашего кода делают нас лучше, и мы должны приветствовать это.

  2. Сначала заставьте код работать, затем исправьте.

  3. Не каждую строчку кода требуется тестирование.

Глава 17: Запахи и эвристика

  1. Чистый код — это не набор правил, а скорее система ценностей, определяющих качество вашей работы.

[В этой главе дядя Боб перечисляет еще 66 вариантов своего кода и эвристик, многие из которых были рассмотрены в оставшейся части книги. Воспроизведение их здесь, по сути, было бы копированием и вставкой названия каждого элемента, поэтому я воздержался от этого. Вместо этого я бы посоветовал вам прочитать книгу!]

Заключение

Давайте закончим с того, с чего начали: “Чистый код” Роберта К. Мартина — самая рекомендуемая книга по программированию всех времен. На то есть веская причина.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
gjkjntyxbr Уровень 35
2 декабря 2021
Чур я следующий пост выкатываю с содержанием какой-то книги с отрывом от контекста.