Антипаттерны и code smells

↑ 8.1 Принципы и паттерны проектирования в C♯ · ← Предыдущая

Обязательно~3 мин чтенияУровень: senior

Зачем это на собесе

«Что вам не нравится в этом коде?» — типичное ревью на собеседовании.

Объяснение

Запах / антипаттернПризнакЛечение
God Objectкласс делает всёразделение по ответственностям
Long Method / Long Parameter Listметод на сотни строк, 8 параметровExtract Method, Parameter Object
Anemic Domain Modelсущности — только данные, логика в сервисахпереносить поведение в домен
Feature Envyметод чаще использует чужие данныепереместить метод
Shotgun Surgeryодно изменение → правки в десяти местахсобрать ответственность
Primitive Obsessionstring email, decimal money вездеvalue objects
Magic numbers/strings«42», «“paid”»константы, enum
Copy-Pasteдублирование логикивынести знание
Speculative Generalityабстракции «на будущее»YAGNI
Service Locatorprovider.GetService в кодевнедрение через конструктор
Singleton-абьюз, статические синглтоныглобальное состояниеDI
Golden Hammerодин инструмент для всеговыбор по задаче
Leaky Abstractionдетали реализации в интерфейсепересмотр границ
Lava Flowмёртвый код, «трогать страшно»тесты и удаление
Async: async void, .Resultсм. Антипаттерны: async void, .Result, sync over asyncawait по цепочке
Catch-all: catch (Exception) {}проглоченные ошибкиобработка/логирование/проброс
Chatty API / N+1множество мелких запросовбатчинг, проекции
Distributed Monolithсервисы связаны и деплоятся вместепересмотр границ
Big Ball of Mudнет структурымодульность, ADR, границы

Рефакторинг: небольшими безопасными шагами, под защитой тестов (Extract Method, Introduce Parameter Object, Replace Conditional with Polymorphism, Move Method).

Нюансы и подводные камни

  • Запах — это подсказка, а не приговор: оценивайте контекст и стоимость исправления.
  • Рефакторинг без тестов — риск; начните с тестов на текущее поведение (characterization tests).
  • «Переписать с нуля» редко оправдано: улучшайте постепенно (strangler fig).
  • Не оптимизируйте эстетику вместо ценности для продукта.

Практика

  1. Проведите ревью модуля и составьте список запахов по приоритету.
  2. Выделите value object для email/денег.
  3. Уберите анемичность: перенесите правило из сервиса в сущность.

Вопросы с ответами

Связанные темы