📌 S – Single Responsibility Principle (SRP)
Принцип единственной ответственности
"Один класс — одна ответственность."
Нарушение этого принципа — одна из самых распространённых проблем в коде. Рассмотрим пример, который прислал мне мой друг.
Самое забавное, что этот код ему помог написать ChatGPT.
На самом деле он пришел с другой проблемой, но я сразу заметил тут несколько проблем и первая, что данный класс SupplyMessageBuilder берет на себя слишком много:
class SupplyMessage:
def __init__(self):
self.site_id = None
self.ml_supplies = []
def __str__(self):
return json.dumps({"SITEID": self.site_id, "MLSUPPLIES": self.ml_supplies}, indent=4)
class SupplyMessageBuilder:
def __init__(self):
self.message = SupplyMessage()
def set_site_id(self, site_id):
self.message.site_id = site_id
return self
def add_ml_supply(self, ml_supply_id, ml_supply_ship_dt):
supply = {
"MLSUPPLYID": ml_supply_id,
"MLSUPPLYSHIPDT": ml_supply_ship_dt,
"ORDERS": [],
}
self.message.ml_supplies.append(supply)
return self
...
@staticmethod
def create_producer():
return KafkaProducer() # Нарушение SRP!
В чём проблема?
Класс `SupplyMessageBuilder` выполняет две задачи:
1. Формирует сообщение (строит JSON).
2. Создаёт Kafka Producer.
Это нарушает SRP, потому что:
- У каждого билдера свой продюссер, и если нужно будет изменить логику Kafka, придется перелопачивать все билдеры.
- Много дублирования, в исходном коде конструктор KafkaProducer заполнялся в каждом билдере.
- Увеличивает риск ошибок при модификации.
- Размазана зона ответственности.
✅ Как исправить?
Разделить ответственности:
1. `SupplyMessageBuilder` – только формирует сообщение.
2. `KafkaProducerManager` – отвечает за работу с Kafka.
Исправленный код:
class SupplyMessageBuilder:
... # Только методы для построения сообщения
def build(self) -> SupplyMessage:
return SupplyMessage.model_validate_json(self.message)
class KafkaProducerManager:
def __init__(self, producer: KafkaProducer)
self.producer = producer
def send_message(self, message: type[BaseModel]):
msg = message.model_dump_json()
return self.producer.send(msg)
Теперь каждый класс отвечает только за свою зону ответственности.
1. SupplyMessageBuilder только билдит и валидирует сообщения (для сообщения добавлен Pydantic, но это сюда не стал писать)
2. KafkaProducerManager занимается только отправкой сообщений
3. KafkaProduccer передается как зависимость
Вывод
Соблюдение SRP делает код:
🔹 Чище – проще читать и понимать.
🔹 Гибче – легче вносить изменения.
🔹 Надёжнее – меньше неожиданных багов.
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
