Menu
CoddyTech

开闭原则

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

“软件实体应该对扩展开放,对修改关闭。”

这条原则指出,任何函数、模块或类都应该允许扩展其行为,而无需修改代码本身。 

假设我们有一个类 TxtConvertor,它可以将 txt 文件转换为 json 或 xml,

class TxtConvertor:
	def convert_to_json(self, file):
		print("converts file to json")
	
	def convert_to_xml(self, file):
		print("converts file to xml")

这种结构违反了开闭原则。

为什么?

例如,如果我们想添加将 txt 文件转换为 html 的支持,就必须修改现有的类(违反了对修改关闭的原则)。

那么我们应该怎么做?

在这个例子中,一种解决方案是创建一个抽象类来包含主要函数,

from abc import ABC, abstractmethod

class TxtConvertor(ABC):
	@abstractmethod
	def convert(self, file):
		pass

class TxtConvertorToJson(TxtConvertor):
	...

.
.
.

abc 库支持 Python 抽象基类,你可以在这里阅读更多内容。

challenge icon

挑战

中等

你的任务是修改给定的示例,以应用开闭原则,并添加转换器以支持将 txt 转换为 html。

  1. 创建抽象类 TxtConvertor
  2. 创建类 TxtConvertorToJson、TxtConvertorToXML、TxtConvertorToHTML,让它们继承自 TxtConvertor 并实现转换器(如上面的示例所示)

亲手试试

class TxtConvertor:
	def convert_to_json(self, file):
		print("converts file to json")
	
	def convert_to_xml(self, file):
		print("converts file to xml")

Clean Code:用 Python 写出更好的代码中的所有课

自己练习: Python 在线编译器