Делим God object по ответственностям
Делим God object по ответственностям

Что такое антипаттерн

Антипаттерн — часто применяемое решение, которое со временем вредит. Распознают его по «запахам кода» (code smells): код работает, но его трудно менять. Ниже самые частые антипаттерны и рефакторинг для каждого. Рефакторинг — улучшение структуры без изменения поведения; страховка здесь — тесты. Связанные темы: связанность и сцепление, SRP.

God object (божественный объект)

Один класс знает и делает всё: считает, форматирует, сохраняет, шлёт письма. Признаки: сотни строк, десятки методов, имя вроде Manager/Helper/Utils. Итог: любая правка что-то ломает, тестировать трудно. Исправление: разделить по ответственностям (SRP).

python
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)
text
16 [16]

Разделённый вариант: Order только считает, receipt форматирует, OrderRepository сохраняет.

python
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)