Почему интерфейсы не избыточны? В учебниках по ООП часто пишут, что программировать нужно не на уровне реализации, а на уровне интерфейсов. Я не понимаю причину этого, объясните пожалуйста.
Для примера приведу классический паттерн Observer. Он имеет абстрактные классы Observer и Observable с интерфейсами, которые обязаны реализовать наследники:#!/usr/bin/env python3
from abc import ABCMeta, abstractmethod
class Observer(metaclass=ABCMeta):
@abstractmethod
def update(self, message):
pass
class Observable(metaclass=ABCMeta):
@abstractmethod
def register(self, observer):
pass
@abstractmethod
def notify_observers(self, message):
pass
class Newspaper(Observable):
def __init__(self):
self.observers = []
def register(self, observer):
self.observers.append(observer)
def notify_observers(self, message):
for observer in self.observers:
observer.update(message)
def add_news(self, news):
self.notify_observers(news)
class Citizen(Observer):
def __init__(self, name):
self.name = name
def update(self, message):
print('{} получил: {}'.format(self.name, message))
newspaper = Newspaper()
newspaper.register(Citizen('Иван'))
newspaper.register(Citizen('Василий'))
newspaper.add_news('Сообщение')
Однако, код станет заметно проще, если отказаться от использования абстрактных классов(а значит и интерфейсов). Подскажите пожалуйста возможные сценарии развития представленного кода, в которых будет ощущаться неудобство от отсутствия метаклассов Observer и Observable

21 Авг 2019 в 06:58
242 +1
0
Ответы
1

Использование интерфейсов позволяет достичь расширяемости и гибкости кода. В случае паттерна Observer, интерфейсы Observer и Observable предоставляют нам возможность определить общие методы для всех наблюдателей и наблюдаемых объектов. Это делает код более понятным, упрощает его расширение и обеспечивает возможность замены конкретных классов другими, не нарушая работу программы.

Таким образом, использование интерфейсов в данном случае не является избыточным, а, наоборот, помогает сделать код более структурированным.

Если отказаться от интерфейсов Observer и Observable, то заметно усложнится возможность добавления новых типов наблюдателей или наблюдаемых объектов, а также замены одних на другие без изменения существующего кода. Это может привести к ухудшению читаемости и поддерживаемости кода.

Возможные сценарии развития представленного кода без использования метаклассов Observer и Observable могут включать в себя возможные проблемы с добавлением нового функционала, изменением существующего кода или заменой компонентов. Может потребоваться вносить изменения во все классы, которые реализуют наблюдателей и наблюдаемые объекты, что сильно усложнит поддержку кода.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир