open atlas

code-patterns

Паттерны и качество кода

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

15 юнитов·50 уроков·~16 ч

Начать трек
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 и антипаттерны, от которых нужно избавляться, чтобы компоненты оставались простыми по мере роста.