Menu
Coddy logo textTech

Инверсия зависимостей

Урок 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

И затем использовать экземпляр интерфейса вместо конкретной реализации. 

challenge icon

Задание

Легко

Вам дан код, который почти готов, добавьте абстрактный класс 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