Почему интерфейсы не избыточны? В учебниках по ООП часто пишут, что программировать нужно не на уровне реализации, а на уровне интерфейсов. Я не понимаю причину этого, объясните пожалуйста. Для примера приведу классический паттерн 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
Использование интерфейсов позволяет достичь расширяемости и гибкости кода. В случае паттерна Observer, интерфейсы Observer и Observable предоставляют нам возможность определить общие методы для всех наблюдателей и наблюдаемых объектов. Это делает код более понятным, упрощает его расширение и обеспечивает возможность замены конкретных классов другими, не нарушая работу программы.
Таким образом, использование интерфейсов в данном случае не является избыточным, а, наоборот, помогает сделать код более структурированным.
Если отказаться от интерфейсов Observer и Observable, то заметно усложнится возможность добавления новых типов наблюдателей или наблюдаемых объектов, а также замены одних на другие без изменения существующего кода. Это может привести к ухудшению читаемости и поддерживаемости кода.
Возможные сценарии развития представленного кода без использования метаклассов Observer и Observable могут включать в себя возможные проблемы с добавлением нового функционала, изменением существующего кода или заменой компонентов. Может потребоваться вносить изменения во все классы, которые реализуют наблюдателей и наблюдаемые объекты, что сильно усложнит поддержку кода.
Использование интерфейсов позволяет достичь расширяемости и гибкости кода. В случае паттерна Observer, интерфейсы Observer и Observable предоставляют нам возможность определить общие методы для всех наблюдателей и наблюдаемых объектов. Это делает код более понятным, упрощает его расширение и обеспечивает возможность замены конкретных классов другими, не нарушая работу программы.
Таким образом, использование интерфейсов в данном случае не является избыточным, а, наоборот, помогает сделать код более структурированным.
Если отказаться от интерфейсов Observer и Observable, то заметно усложнится возможность добавления новых типов наблюдателей или наблюдаемых объектов, а также замены одних на другие без изменения существующего кода. Это может привести к ухудшению читаемости и поддерживаемости кода.
Возможные сценарии развития представленного кода без использования метаклассов Observer и Observable могут включать в себя возможные проблемы с добавлением нового функционала, изменением существующего кода или заменой компонентов. Может потребоваться вносить изменения во все классы, которые реализуют наблюдателей и наблюдаемые объекты, что сильно усложнит поддержку кода.