Наследники не реализуют общий send(message), а базовый метод молча ничего не делает. Нужен единый интерфейс отправителя, реальные реализации send и передача экземпляра, а не класса.
Система уведомлений в Django
Наследники не реализуют общий send(message), а базовый метод молча ничего не делает. Нужен единый интерфейс отправителя, реальные реализации send и передача экземпляра, а не класса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проведите ревью кода: оцените архитектурные решения, соблюдение принципов ООП, выявите возможные ошибки и предложите пути улучшения.
from enum import Enum
class NotificationTypes(Enum):
EMAIL = 'email'
SMS = 'sms'
TELEGRAM = 'telegram'
class NotificationAbstract:
def send(self, message):
...
class SendEmailNotification(NotificationAbstract):
def send_email_notification(self):
pass
class SendSMSNotification(NotificationAbstract):
def send_sms_notification(self):
pass
class SendTelegramNotification(NotificationAbstract):
def send_telegram_notification(self):
pass
class Newsletter:
def create(self, message, notify_class):
notify_class.send(message)
if __name__ == '__main__':
...
Ответ
Наследники не реализуют общий send(message), а базовый метод молча ничего не делает. Нужен единый интерфейс отправителя, реальные реализации send и передача экземпляра, а не класса.
Пример контракта:
from abc import ABC, abstractmethod
class NotificationSender(ABC):
@abstractmethod
def send(self, message):
raise NotImplementedError
class Newsletter:
def __init__(self, sender: NotificationSender):
self.sender = sender
def create(self, message):
return self.sender.send(message)
Email/SMS/Telegram-адаптеры реализуют именно send. При передаче класса текущий вызов теряет self; при передаче экземпляра унаследованный метод просто вернёт None. Enum можно использовать в фабрике выбора адаптера. Повторы, таймауты и статус доставки относятся к отдельной инфраструктурной логике, а не к названиям методов.