Вот мои конспекты из онлайн-курса LinkedIn Clean Code.
Что такое чистый код
- Написано с мыслью о людях— люди как основная аудитория
- Имена легко понять
- Отформатировано последовательно — форматирование влияет на читабельность
- Четко сообщает о намерениях
Итак, код:
- Легко читать
- Легко улучшить
- Легко исправить
Чистые имена
Первое правило: избегайте однобуквенных имен!
- Предпочитайте ясность краткости
—Распространенные ошибки: слишком короткие имена переменных для циклов и массивов. - Акронимы и аббревиатуры
—HTTPAPIClient
иHttpApiClient
: небольшое изменение поможет избежать путаницы
— Избегайте аббревиатур, если они не очень распространены.
Имена классов и типов
- Предпочитайте существительные для имен классов (например,
Performer
лучше, чемPerformance
) - Используйте префиксы прилагательных для обозначения времени (например,
PastPerformer
) - Избегайте нечетких префиксов и однобуквенных префиксов (исключение: языки с шаблонами).
- Избегайте всех аббревиатур с заглавными буквами — легче увидеть границу между аббревиатурами.
- Избегайте множественного числа в обычном классе, за исключением классов коллекций.
Имена методов и функций
- Используйте настоящее время
- Избегайте герундия (например,
performing
,validating
), используйтеis_performing
,is_validating
и т. д. - Избегайте прошедшего времени: используйте настоящее совершенное
has_performed
,has_validated
и т. д. - Методы доступа начинаются с
get
Имена переменных
- Существительные в единственном числе: для примитивных типов и ссылок на объекты.
- Существительные во множественном числе: для массивов и других коллекций.
- Избегайте глаголов для переменных примитивного типа:преобразуйте их в форму существительного/глагола прошедшего времени. (например,
retry
->retryEnabled
) - Переменные Lambda: следуйте именам методов и функций
- Разделяйте акронимы и расшифровывайте аббревиатуры. Не путайте акронимы и аббревиатуры.
- Избегайте использования имени типа в качестве суффикса (например,
lastNameString
).
Имена параметров
- Аналогично именам переменных
Постоянные имена
- Правила для существительных в единственном числе и во множественном числе такие же, как и для переменных.
ENUM
имена должны быть в единственном числе- Точные правила форматирования соответствуют конкретному используемому языку. Что-то, что работает для C++, может не подойти для Kotlin.
Чистое форматирование
Основная аудитория нашего кода — люди, а не компиляторы или интерпретаторы. У компиляторов есть свои алгоритмы оптимизации кода, который мы пишем. Поэтому нам следует больше беспокоиться о том, насколько легко мы читаем наш код.
Если возможно, установите глобальный стиль кода и примените автоматическое форматирование кода, чтобы сделать код согласованным в рамках проекта. Это особенно важно, когда мы работаем в команде.
Отступ и размещение скобок
- Выберите табуляцию или пробелы, но не то и другое одновременно
- Последовательность является ключевым
Перенос строки
- Чрезвычайно длинные строки могут быть трудночитаемыми
пробел
- Добавьте пустую строку перед оператором
return
- Добавляйте пустую строку перед любым кодом, что делает логический фрагмент похожим на абзац.
- И пустая строка перед каждым куском кода с комментарием
Комментарии
- Лучшие комментарии отвечают на вопросы «почему».
- Худшие комментарии отвечают на вопросы «что». Мы должны применять методы рефакторинга, если код сложен для понимания.
// This comment is redundant. // Assigning phone number as the contact id val contactId: String = phoneNumber
Чистая логика
- Магические числа и константы: храните значения как константы с описательным именем.
Списки параметров
- Чем меньше параметров принимает метод, тем легче определить, для чего используется каждый параметр при вызове метода. (Kotlin: используйте именованные аргументы)
- Соберите аргументы, используя объекты, если это необходимо. (Kotlin: класс данных может быть полезен)
Предикативные методы
- Сложная логическая логика: оборачивает или инкапсулирует логическую логику в метод-предикат с понятным и описательным именем того, что проверяется.
Правильное использование петель
- Третье правило: не повторяйтесь более одного раза. «Три или больше? Используйте для!»
Чистые модульные тесты
Тесты по-прежнему являются кодом, поэтому мы по-прежнему должны следовать правилам чистого кода.
Держите тесты быстро
- Иначе люди не захотят их запускать!
Одно утверждение на тест
- Модульные тесты — это документация — создавайте их с учетом этого!
- Модульные тесты сфокусированы. У каждого модульного теста есть только одна причина неудачи, потому что он проверяет только одну конкретную деталь за раз.
- Когда отдельный тест содержит несколько утверждений, каждое из них является отдельной причиной, по которой тест может провалиться.
- Это экономит нам время, когда нам нужно обнаружить, где существует ошибка.
Держите тесты изолированными
- Каждый тест можно запускать независимо и в любом порядке
СУХИЕ и ВЛАЖНЫЕ тесты
- Чистые модульные тесты поддерживают баланс между понятностью и ясностью, не полагаясь на дублирование и скопированные фрагменты кода.
- Используйте общую инициализацию, например
@BeforeEach
- Если у нас есть длинный список модульных тестов, выполняющих одно и то же, но с разными значениями, попробуйте
@ParameterizedTest
сMethodSource
.