O – Open/Closed Principle (OCP)
Код должен быть открыт для расширения, но закрыт для модификации.
Рассмотрим пример из предыдущего поста, где
KafkaProducerManager принимает продюсер в конструкторе. Это один из примеров OCP в действии.🔍 Как это работает?
Допустим, нам нужно:
- Добавить логирование отправляемых сообщений
- Реализовать авторизацию при отправке в топик
- Ввести валидацию сообщений
Старая реализация (без OCP) потребовала бы изменений в
KafkaProducerManager что добавляет риск сломать существующую логику. Новая реализация (с OCP) позволяет расширить функционал без модификации основного класса.
Реализация:
1. Определяем базовый интерфейс:
from abc import ABC, abstractmethod
class BaseProducer(ABC):
@abstractmethod
def send(self, message: type[BaseModel]) -> None:
pass
2. Реализуем конкретный продюсер:
class LoggedProducer(BaseProducer):
def __init__(self, producer: KafkaProducer):
self.producer = producer
def send(self, message: str) -> None:
print(f"Отправка сообщения: {message}")
return self.producer.send(message)
3. Модифицируем менеджер:
Изменяем аннотацию указывая, что теперь принимаем любой совместимый продюсер
class KafkaProducerManager:
def __init__(self, producer: BaseProducer)
self.producer = producer
def send_message(self, message: type[BaseModel]):
msg = message.model_dump_json()
return self.producer.send(msg)
4. 💻 Пример использования:
# Базовый продюсер
producer = KafkaProducer()
# Расширенный функционал (логирование)
logged_producer = LoggedProducer(producer)
# Менеджер работает с любым продюсером
producer_manager = KafkaProducerManager(logged_producer)
message = Message(body='some value', key='some_key')
producer_manager.send(message) # Логируется и отправляется сообщение
Преимущества:
1. Безопасность - Не трогаем рабочий код
2. Гибкость - Легко добавляем новые фичи
3. Масштабируемость - Можно создать ValidatedProducer, AuthProducer и т.д.
👉 Главное: Мы расширили функционал, не изменяя существующий, код закрыт для модификации.
Именно в этом суть OCP.
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
