深入浅析python3 依赖倒置原则(示例代码)

作者:蝉时雨 时间:2021-07-30 02:27:33 

场景

针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台

数据的录入无外乎就是对数据的增删改查

下面上一个常规的写法(未符合依赖倒置),整合来自 长安和丰田 的停车数据


class Changan(object):
   def __init__(self):
       self.type = 'changan'

def ca_add(self):
       print('%s 新增' % self.type)

def ca_del(self):
       print('%s 删除' % self.type)

def ca_modify(self):
       print('%s 修改' % self.type)

def ca_get(self):
       print('%s 查询' % self.type)

class Toyota(object):
   def __init__(self):
       self.type = 'fengtian'

def tyt_add(self):
       print('%s 新增' % self.type)

def tyt_del(self):
       print('%s 删除' % self.type)

def tyt_modify(self):
       print('%s 修改' % self.type)

def tyt_get(self):
       print('%s 查询' % self.type)

class Data(object):

def __init__(self, car):
       self.car = car

def data_add(self):
       if self.car.type == 'changan':
           self.car.ca_add()
       else:
           self.car.tyt_add()

def data_del(self):
       if self.car.type == 'changan':
           self.car.ca_del()
       else:
           self.car.tyt_del()

def data_mofify(self):
       if self.car.type == 'changan':
           self.car.ca_modify()
       else:
           self.car.tyt_modify()

def data_get(self):
       if self.car.type == 'changan':
           self.car.ca_get()
       else:
           self.car.tyt_get()

if __name__ == '__main__':
   ca = Changan()
   tyt = Toyota()
   autosystem = Data(ca)
   autosystem.data_add()
   autosystem.data_del()
   autosystem.data_modify()
   autosystem.data_get()
   autosystem.car = tyt
   print('*' * 50)
   autosystem.data_add()
   autosystem.data_del()
   autosystem.data_modify()
   autosystem.data_get()

运行的结果如下

changan 新增
changan 删除
changan 修改
changan 查询
**************************************************
fengtian 新增
fengtian 删除
fengtian 修改
fengtian 查询

可以看到最后的Data类是一个简单工厂,通过面向流程的方式对数据进行增删改查,上层的Data类永远都要依赖下层的Changan类和Toyota类,假设未来Changan类和Toyota类因为需求变更导致实现方式变了,那么Data类也会跟着改,或者未来又来一家新的厂商铃木Suzuki,那么在Data又要多写很多if else。这样的改动对于程序员来说是致命的,每一次变动需要改动的地方都很多,问题油然而生。

如何解决

遵循依赖倒置原则,根据

"程序要依赖于抽象接口,不要依赖于具体实现。"

通过changan、toyota这些类的公共性,把处理数据的方法通过接口抽象出来


import abc

class DataProcessing(metaclass=abc.ABCMeta):
   """
   抽象类
   抽象新增改查
   """
   @abc.abstractmethod
   def data_add(self, *args, **kwargs):
       pass

@abc.abstractmethod
   def data_del(self, *args, **kwargs):
       pass

@abc.abstractmethod
   def data_modify(self, *args, **kwargs):
       pass

@abc.abstractmethod
   def data_get(self, *args, **kwargs):
       pass

class Changan(DataProcessing):
   def __init__(self):
       self.type = 'changan'

def data_add(self):
       print('%s 新增' % self.type)

def data_del(self):
       print('%s 删除' % self.type)

def data_modify(self):
       print('%s 修改' % self.type)

def data_get(self):
       print('%s 查询' % self.type)

class Toyota(DataProcessing):
   def __init__(self):
       self.type = 'fengtian'

def data_add(self):
       print('%s 新增' % self.type)

def data_del(self):
       print('%s 删除' % self.type)

def data_modify(self):
       print('%s 修改' % self.type)

def data_get(self):
       print('%s 查询' % self.type)

class Data(object):

def __init__(self, car):
       self.car = car

def data_add(self):
       self.car.data_add()

def data_del(self):
       self.car.data_del()

def data_modify(self):
       self.car.data_modify()

def data_get(self):
       self.car.data_get()

if __name__ == '__main__':
   ca = Changan()
   tyt = Toyota()
   autosystem = Data(ca)
   autosystem.data_add()
   autosystem.data_del()
   autosystem.data_modify()
   autosystem.data_get()
   autosystem.car = tyt
   print('*' * 50)
   autosystem.data_add()
   autosystem.data_del()
   autosystem.data_modify()
   autosystem.data_get()

运行后结果依然为

changan 新增
changan 删除
changan 修改
changan 查询
**************************************************
fengtian 新增
fengtian 删除
fengtian 修改
fengtian 查询

以上可看出,增删改查已经抽象成DataProcessing里面的方法,以后不管Changan类和Toyota类怎么变动,或者需要新增一个Suzuki类什么的,上层的Data类都不用改变,if name == 'main' 后客户端的调用也不需要怎么改动,代码层次也更清晰,便于后续的扩展。

来源:https://www.cnblogs.com/semishigure/p/14989089.html

标签:python,依赖倒置
0
投稿

猜你喜欢

  • PyCharm如何设置Console控制台输出自动换行

    2022-05-22 03:42:18
  • 有效地使用 SQL事件探查器的提示和技巧

    2009-01-15 13:39:00
  • python 使用paramiko模块进行封装,远程操作linux主机的示例代码

    2023-03-08 19:38:19
  • 使用Python脚本在Linux下实现部分Bash Shell的教程

    2023-10-02 06:55:28
  • ASP真正随机不重复查询代码

    2010-01-02 20:40:00
  • ASP获取网页内容(解决乱码问题)

    2009-07-26 10:44:00
  • Js实现简单的小球运动特效

    2023-07-08 23:40:40
  • RSS2.0规范中文版

    2008-06-25 13:53:00
  • 使用wxpy实现自动发送微信消息功能

    2022-04-01 21:16:06
  • Python中threading库实现线程锁与释放锁

    2021-11-13 10:26:49
  • python版学生管理系统

    2023-07-27 07:21:46
  • css基础教程属性篇之二

    2008-07-25 19:23:00
  • Python读写JSON文件的操作详解

    2021-03-22 11:46:35
  • asp删除mssql数据库中没有记录的图片代码

    2011-03-11 11:22:00
  • 通过FSO进行页面计数

    2008-11-27 16:02:00
  • Python 用户输入和while循环的操作

    2023-07-22 22:17:33
  • Python入门Anaconda和Pycharm的安装和配置详解

    2022-12-21 20:25:07
  • python 爬虫基本使用——统计杭电oj题目正确率并排序

    2021-11-25 17:16:35
  • numpy中轴处理的实现

    2021-08-14 12:06:16
  • python过滤中英文标点符号的实例代码

    2022-11-09 13:43:09
  • asp之家 网络编程 m.aspxhome.com