TGViewer
Валерий | AQA Engineer | Автотестирование на Python | REST, gRPC, GraphQL Валерий | AQA Engineer | Автотестирование на Python | REST, gRPC, GraphQL @aqa_engineer · 1.52K subscribers
Post #399 888
#solid
📌 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-сообщество

📱 Обучение

📱 Отзывы
  • ✍ 2
  • 🔥 1
More from @aqa_engineer
  1. Sep 2, 2026💙💙💙💙💙 Маленькое напоминание о большой дате: где стоит провести День программиста⬆️ Ар…
  2. Sep 2, 2026Привет, давно меня не было пригар по работе, что совсем не успеваю ничего. За что прошу пр…
  3. Jul 16, 2026👩‍💻 В мае-июне я проходила курс «Автоматизация тестирования Rest API Advanced (Python)»…
  4. Jun 10, 2026Привет! Уже на следующей неделе у меня стартуют. Автоматизация тестирования брокеров сообщ…
  5. Jun 8, 2026Несколько месяцев назад я спросил, какой технический тренинг вам был бы действительно инте…
  6. Jun 6, 2026Материалы для тех, кто в теме. Одна из самых больших проблем при развитии в IT - это возмо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →