Menu
CoddyTech

依赖倒置

Coddy Clean Code:用 Python 写出更好的代码 课程的第 26 课,共 28 课。

“依赖抽象,[而不是]具体实现。”

来看一个违反这一原则的例子:

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 写出更好的代码中的所有课

自己练习: Python 在线编译器