code-patterns
Паттерны и качество кода
Код читают намного чаще, чем пишут. Освой ремесло, которое держит код изменяемым — именование, SOLID, запахи кода и безопасный рефакторинг — и научись понимать, когда абстракция оправдывает себя.
Начать трек → 00
Что такое хороший код
Код читают и меняют намного чаще, чем пишут, поэтому главная стоимость ПО — стоимость изменения. «Хороший код» — не эстетика, а код, чьё следующее изменение дёшево. Этот юнит ставит эту призму. 01
Имена и намерение
Имя сжимает намерение. Хорошие имена раскрывают что и зачем, а не как — а трудность с именованием служит сигналом дизайна о том, делает ли сущность одно дело. 02
Функции и связность
Функция должна делать одно дело на одном уровне абстракции, разделять команды и запросы и держать аргументы и побочные эффекты немногочисленными и явными. Цель — связность; малый размер — следствие. 03
Комментарии и контракты
Комментарии гниют, потому что не исполняются; предпочитай самодокументируемый код и выноси инварианты в типы и тесты, которые не врут. Немногие стоящие комментарии объясняют зачем, а не что. 04
SRP: единая ответственность
У модуля должна быть одна причина для изменения — он отвечает одному актору, — а не буквально делать одно дело. Группируй код по тому, кто требует изменений; и божественный класс, и взрыв классов — провалы SRP. 05
Открытость/закрытость и Лисков
Добавляй поведение, добавляя код, а не правя протестированный (OCP) — но лишь вдоль предсказуемой оси изменений. Подтипы обязаны соблюдать контракт супертипа, чтобы подстановка не удивляла вызывающего (LSP). 06
ISP и инверсия зависимостей
Держи интерфейсы узкими, чтобы клиент не зависел от ненужных методов (ISP), и пусть высокоуровневая политика зависит от абстракций, которыми владеет, а не от низкоуровневых деталей (DIP). Порты, адаптеры и DI — механика. 07
Связанность и связность вглубь
У связанности есть измеримая таксономия (connascence): рефактори в сторону более слабой и локальной связи. Закон Деметры и границы модулей по фичам запирают радиус поражения изменений. 08
Запахи: раздуватели
Запахи-раздуватели — длинные методы, большие классы, одержимость примитивами, группы данных — это распад связности, лечимый извлечением и объектами-значениями. Расходящееся изменение и разрозненная правка — запахи SRP, читаемые по истории git. 09
Запахи: связки и лишнее
Запахи связок и лишнего — зависть к функциям, цепочки сообщений, посредники, мёртвый код, спекулятивная общность, переключатели по типу — связывают или раздувают код. Перемещай поведение к его данным, удаляй неиспользуемое и заменяй растущие switch полиморфизмом. 10
Рефакторинг: страховочная сеть
Без страховочной сети рефакторить нельзя. Характеризующие тесты фиксируют текущее поведение, швы подводят упрямый код под тесты, а каталог мелких ходов применяется крошечными шагами под зелёными тестами. 11
Рефакторинг: крупные ходы
Крупные рефакторинги — извлечь класс, заменить условие полиморфизмом, ввести объект-параметр — перестраивают дизайн под зелёными тестами; паттерны — это пункты назначения, к которым рефакторят по требованию кода, а не шаблоны, навязанные заранее. 12
Эвристики и компромиссы
DRY, KISS и YAGNI — конфликтующие эвристики, и суждение состоит в выборе, какая важнее. Правило трёх сопротивляется преждевременной абстракции, ведь дублирование намного дешевле неправильной абстракции. 13
Антипаттерны и технический долг
Божественные объекты и анемичные модели — структурные антипаттерны, которые нужно балансировать; технический долг реален, но управляем — делай его видимым, бери осознанно и гаси правилом бойскаута в коде, который и так трогаешь. 14
Капстоун: рефакторинг запутанного модуля
Собери всё на реалистичном запутанном модуле: инвентаризируй запахи, рефактори пошагово под характеризующими тестами и измерь, что следующее изменение подешевело — замыкая круг к призме стоимости изменения.Паттерны React
Ты уже умеешь писать на React — теперь освой паттерны уровня senior: композицию, архитектуру состояния, границу сервер/клиент, Suspense и антипаттерны, от которых нужно избавляться, чтобы компоненты оставались простыми по мере роста.