Python编程应用设计原则的示例分析

  介绍

这篇文章主要介绍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编程应用设计原则的示例分析