这篇文章主要介绍Python编程应用设计原则的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1,单一职责原则SRP
单一职责原则(单一责任原则)这个原则的英文描述是这样的:一个类或模块应该有一个单一的责任。如果我们把它翻译成中文,那就是:一个类或者模块只负责完成一个职责(或者功能)。
让我们举一个更简单的例子,我们有一个数字L=(n1、n2…, nx)的列的表,我们计算一些数学函数。例如,计算最大值,平均值等。
一个不好的方法是让一个函数来完成所有的工作:
import numpy as np , def math_operations (list_): ,,,# Compute 平均 ,,,print (f"从而mean is {np.mean (list_)}“) ,,,#,Compute ,马克斯 ,,,print (f"从而max is {np.max (list_)}“), , math_operations (list_ =, (1、2、3、4、5)) #,从而mean is 3.0 #,从而max is 5
实际开发中,你可以认为math_operations很庞大,揉杂了各种功能代码。
为了使这个更符合单一职责原则,我们应该做的第一件事是将函数math_operations拆分为更细粒度的函数,一个函数只干一件事:
def get_mean (list_): ,,,& # 39;& # 39;& # 39;Compute 马克斯# 39;& # 39;& # 39; ,,,print (f"从而mean is {np.mean (list_)}“), def get_max (list_): ,,,& # 39;& # 39;& # 39;Compute 马克斯# 39;& # 39;& # 39; ,,,print (f"从而max is {np.max (list_)}“), def 主要(list_):, ,,,# Compute 平均 ,,,get_mean (list_) ,,,#,Compute ,马克斯 ,,,get_max (list_) 主要([1、2、3、4、5)) #,从而mean is 3.0 #,从而max is 5
这样做的好处就是:
- <李>
易读易调试,更容易定位错误。
李> <李>可复用,代码的任何部分都可以在代码的其他部分中重用。
李> <李>可测试,为代码的每个功能创建测试更容易。
李>但是要增加新功能,比如计算中位数,主要函数还是很难维护,因此还需要第二个原则:(OCP。
2,开闭原则(OCP
开闭原则(开闭原则)就是对扩展开放,对修改关闭,这可以大大提升代码的可维护性,也就是说要增加新功能时只需要添加新的代码,不修改原有的代码,这样做即简单,也不会影响之前的单元测试,不容易出错,即使出错也只需要检查新添加的代码。
上述代码,可以通过将我们编写的所有函数变成一个类的子类来解决这个问题。代码如下:
import numpy as np 得到abc import  ABC, abstractmethod class 操作(ABC): ,,,& # 39;& # 39;& # 39;操作# 39;& # 39;& # 39; ,,@abstractmethod ,,,def 操作(): ,,,,,,, class 意味着(操作): ,,,& # 39;& # 39;& # 39;Compute 马克斯# 39;& # 39;& # 39; ,,,def 操作(list_): ,,,,,,,印刷(f"从而mean is {np.mean (list_)}“), class 马克斯(操作): ,,,& # 39;& # 39;& # 39;Compute 马克斯# 39;& # 39;& # 39; ,,,def 操作(list_): ,,,,,,,印刷(f"从而max is {np.max (list_)}“), class 主要: ,,,& # 39;& # 39;& # 39;主要# 39;& # 39;& # 39; ,,,def get_operations (list_): ,,,,,,,#,__subclasses__ will found all classes inheriting 得到操作 ,,,,,,,for operation 拷贝Operations.__subclasses__ (): ,,,,,,,,,,,operation.operation (list_) if __name__ ==,“__main__": ,,,Main.get_operations ([1、2、3、4、5)) #,从而mean is 3.0 #,从而max is 5
如果现在我们想添加一个新的操作,例如:值,我们只需要添加一个继承自操作类的类。新形成的子类将立即被<代码> __subclasses__() 代码>接收,无需对代码的任何其他部分进行修改。
3里氏替换原则(LSP)
里式替换原则的英文是Liskov替换原则,缩写为LSP。这个原则最早是在1986年由芭芭拉Liskov提出,他是这么描述这条原则的:
如果是T的亚型,那么T类型的对象可能被替换为对象类型的年代,在不破坏程序。
引用>也就是说子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。
实际上,里式替换原则还有另外一个更加能落地,更有指导意义的描述,那就是按照协议来设计,子类在设计的时候,要遵守父类的行为约定(或者叫协议)。父类定义了函数的行为约定,那子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为约定。这里的行为约定包括:函数声明要实现的功能,对输入,输出,异常的约定,甚至包括注释中所罗列的任何特殊说明。
Python编程应用设计原则的示例分析