Menu
Coddy logo textTech

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

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Python