- Предисловие
- На кого это рассчитано
- Чем этот текст не является
- Ограничения и применимость
- Что хорошо знать перед прочтением
- Зачем нужна ещё одна книга
- Введение
- Польза для разработчиков
- Польза для бизнеса
- «Плохой» и «хороший» код
- Тяжело читать
- Тяжело менять
- Тяжело тестировать
- «Не помещается в голову»
- Запахи кода
- Прежде, чем начать
- Определить границы
- Покрыть тестами
- Выявить больше крайних случаев
- Определить явные и неявные входные данные
- Конкретизировать желаемый результат
- Настроить автотесты
- Ужесточить настройки линтеров и компилятора
- Перевести «предупреждения» в разряд «ошибок»
- Настроить больше автоматизированных правил
- Во время рефакторинга
- Двигаться маленькими шагами
- Создавать маленькие, но подробные пул-реквесты
- Проверять каждое изменение
- Применять по одной технике за раз
- Не добавлять фич, не чинить багов
- Соблюдать приоритет преобразований
- Не смешивать рефакторинг тестов и кода приложения
- Низко-висящие фрукты
- Форматирование кода
- Линтинг кода
- Возможности языка
- Возможности встроенных API
- Возможности среды разработки
- Имена
- Общие рекомендации
- Слишком короткие имена
- Слишком длинные имена
- Вариант именования функций
- Одинаковые имена у разных сущностей
- Повсеместный язык
- Врущие имена
- Типы для описания домена
- Дублирование кода
- Не любое дублирование — зло
- Переменные для данных
- Функции для действий
- Абстракция
- Намерение и реализация
- Фрактальная архитектура
- Разделение ответственности
- Декомпозиция задач
- Принцип единственной ответственности
- Инкапсуляция
- Функциональный пайплайн
- Преобразования данных
- Состояния данных
- Невыразимость неправильного
- Валидация данных
- Пропущенные состояния
- DTO и десериализация
- Селекторы и маппинг данных
- Условия и сложность кода
- Цикломатическая и когнитивная сложность
- Плоское лучше вложенного
- Ранний возврат
- Рендер компонентов
- Переменные, предикаты и булева алгебра
- Законы де Моргана
- Предикаты
- Примитивный паттерн-матчинг
- Стратегия
- Null-объект
- Сайд-эффекты
- Чистые функции
- Ссылочная прозрачность
- Неизменяемость по умолчанию
- Функциональное ядро в императивной оболочке
- Адаптеры для эффектов
- Команды и запросы
- CQS и сгенерированные ID
- CQRS
- Чистые функции
- Обработка ошибок
- Виды ошибок
- Техники обработки
- Выбрасывание паник
- Неожиданные ошибки и потеря контекста
- Разные типы ошибок
- Fail Fast
- Rethrow
- Преимущества
- Проблемы
- Result-контейнеры
- Сигнатура точнее отражает процесс
- Явная обработка
- Централизованная обработка
- Паники отдельно
- Множественные ошибки
- Распаковка
- Связывание результатов
- Проблемы
- Когда предпочесть паники
- Cross-Cutting Concerns
- Зоопарк обработчиков
- Иерархия отлова ошибок
- Обёртки над «низкоуровневым» кодом
- Обработчики пользовательских сценариев
- Обработчики последней надежды
- Предвалидация данных
- Интеграция модулей
- Зацепление и связность
- Разделение ответственности
- Правило интеграции модулей
- Разделение задач
- Как определить связность
- Контракты
- События и сообщения
- Зависимости
- Объектная композиция
- Разделение данных и поведения
- Принцип разделения интерфейса
- Функциональная композиция
- Отказ от зависимостей
- Другие способы управления зависимостями
- Объектная композиция
- Целостность и согласованность
- Агрегаты
- Предвалидация на входе в контекст
- Зацепление и связность
- Обобщения и иерархии
- Обобщённые алгоритмы
- Обобщённые типы
- Наследование и композиция
- Наследование
- Принцип подстановки Лисков
- Архитектура
- Не про «папочки»
- Моделирование бизнес-процессов
- Повсеместный язык
- Доменная модель
- Направление зависимостей
- Связь с внешним миром
- Порты и адаптеры
- 100500 видов архитектур
- UI-логика
- Реактивность
- Тестирование
- Декларативность
- Читаемость
- Надёжность
- Расширяемость
- Конфигурируемость
- Автоматное программирование
- Налог на декларативность
- Сложность поддержки
- Производительность
- Статическая типизация
- Повсеместный язык
- Моделирование домена
- Типизация в TypeScript
- Сверка модели с реальностью
- Нарушения договорённостей
- Дизайн API
- Рефакторинг тестового кода
- «Тесты» для тестов
- «Хрупкие» тесты
- Тесты-дубликаты
- Тесты, которые никогда не ломаются
- Тесты простых функций
- Регрессии
- Рядом с кодом
- Источники правды
- Комментарии
- Лживые комментарии исправить или удалить
- Расплывчатые комментарии уточнить
- Мелкие уточняющие комментарии перенести в код
- «Пересказам названий» добавить контекста
- TODO и FIXME превратить в задачи
- Документация
- Доступность знаний
- Рефакторинг как процесс
- Рефакторить или переписывать
- Ресурсы
- Время
- Накопленные знания
- Опыт
- Выгоды и риски
- Мета-информация о проекте
- Эстимейты
- Рефакторинг больших кусков кода
- Частота и гигиена
- Метрики
- Заключение
- Ошибки, фидбек и история изменений
- Издателям
- Переводчикам
- Благодарности
- Дополнительные материалы
- Шпаргалка по техникам рефакторинга
- Список литературы