Инверсия зависимостей
Урок 26 из 28 курса Clean Code — пишите код лучше на Python на Coddy.
«Зависите от абстракций, [а не] от конкретных реализаций».
Рассмотрим пример, нарушающий этот принцип:
class LocalStorage:
def save(self, key, value):
print("Saved, " + key + ":" + value)LocalStorage class сохраняет пару, состоящую из ключа и значения.
Теперь у нас есть другой основной class, который использует LocalStorage:
class App:
def start(self, key, value):
storage = LocalStorage()
storage.save(key, value)LocalStorage — это конкретная реализация, и App зависит от неё!
Лучше было бы создать интерфейс (абстрактный class):
from abc import ABC, abstractmethod
class Storage(ABC):
@abstractmethod
def save(self):
passА затем использовать экземпляр интерфейса вместо конкретной реализации.
Задание
ЛегкоВам дан почти готовый код, добавьте абстрактный класс Storage.
Обратите внимание, что после реализации легко перейти к другому конкретному классу, например CloudStorage...
Попробуйте сами
from abc import ABC, abstractmethod
# your code here
class LocalStorage(Storage):
def save(self, key, value):
print("Saved, " + key + ":" + value)
class App:
def __init__(self, storage):
self.storage = storage
def start(self, key, value):
storage.save(key, value)
if __name__ == "__main__":
storage = LocalStorage()
app = App(storage)
key = input()
value = input()
app.start(key, value)
Все уроки раздела Clean Code — пишите код лучше на Python
Потренируйтесь самостоятельно: Онлайн-компилятор Python