Инверсия зависимостей
Урок 26 из 28 курса Clean Code — пишите код лучше на Python на Coddy.
«Зависьте от абстракций, [а не] от конкреций».
Давайте рассмотрим пример, который нарушает этот принцип:
class LocalStorage:
def save(self, key, value):
print("Saved, " + key + ":" + value)Класс LocalStorage сохраняет пару ключ-значение.
Теперь у нас есть другой основной класс, который использует LocalStorage:
class App:
def start(self, key, value):
storage = LocalStorage()
storage.save(key, value)LocalStorage — это конкретная реализация, и App зависит от неё!
Лучшим способом было бы создать интерфейс (абстрактный класс):
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)