Что такое антипаттерн
Антипаттерн — часто применяемое решение, которое со временем вредит. Распознают его по «запахам кода» (code smells): код работает, но его трудно менять. Ниже самые частые антипаттерны и рефакторинг для каждого. Рефакторинг — улучшение структуры без изменения поведения; страховка здесь — тесты. Связанные темы: связанность и сцепление, SRP.
God object (божественный объект)
Один класс знает и делает всё: считает, форматирует, сохраняет, шлёт письма. Признаки: сотни строк, десятки методов, имя вроде Manager/Helper/Utils. Итог: любая правка что-то ломает, тестировать трудно. Исправление: разделить по ответственностям (SRP).
class Order:
def __init__(self, items):
self.items = items # [(name, price, qty), ...]
self.log = []
def total(self):
return sum(p * q for _, p, q in self.items)
def to_text(self):
return "\n".join(f"{n} x{q}" for n, _, q in self.items)
def save(self, db):
db.append(self.total())
def send_email(self):
self.log.append("email sent")
order = Order([("pen", 2, 3), ("book", 10, 1)])
db = []
order.save(db)
print(order.total(), db)16 [16]Разделённый вариант: Order только считает, receipt форматирует, OrderRepository сохраняет.
class Order:
def __init__(self, items):
self.items = items
def total(self):
return sum(p * q for _, p, q in self.items)
def receipt(order):
return "\n".join(f"{n} x{q}" for n, _, q in order.items)