[开发回忆录]第三方模块的松耦合
近来在维护并重构一个原来离职的同事的代码,在将一部分代码从原有逻辑剥离开来的时候遇到了很多的麻烦,希望自己以后不要留下类似的坑,所以在这里做一个总结
代码是Python写的,工程很浩大,其中代码运行在一个虚拟化集群中,我的目的是将一部分原有代码逻辑差不多,但是实体(机器)要分开的代码重构
其中涉及到主要的有几点约束:
1.新分离的代码逻辑和原有的代码逻辑要一样
2.其中涉及到一个任务系统,集群中的机器取任务和返回任务都是向一台核心Server获取,新分离的代码中任务申请和返回接口发生改变
3.暂时没想到...
从原有代码中分离出新代码,且代码逻辑要一样,那么很多人都会偷懒直接Copy一份代码,然后把其中一些部分稍微做修改
用脚趾头想想都知道这样以后的维护工作有多麻烦:
1.修改代码逻辑需要修改两份,原有的发生改变后你的也必须改
2.谁知道你和原有代码有哪些地方不一样,不要指望文档
最好的办法就是继承,继承原有代码的基础上重载你要修改的东西。
可是以前那位兄弟从来没考虑过他的代码是会被继承的,也就是说,他用了很多不适合被重载的方法在里面,例如直接暴露第三方库,全局变量等等...
这里就说道了这次开发回忆录的主题 第三方模块的松耦合
在这次的工程中,第三方模块依赖不多,主要是JsonRPC暴露的几个接口
原有的代码中大多数都是在类中直接import JsonRPC的Client然后引用一个配置文件对Client 做初始化
这样做的坏处显而易见,代码与第三方模块的紧耦合,在我的需求中,代码中申请任务和返回任务等一系列接口都是通过JsonRPC来做的,一旦我需要改变这些接口的功能或者指向的时候
在耦合很严重的情况下我不得不重写代码,那样在逻辑上代码就可能发生改变了,维护工作也很麻烦
在这样的设计中最好的方式就是遵循设计的一个很重要的原则,动静分离
说到动静分离,这里的动和静就分别指的是:
1.静:代码逻辑是不会变的,即使变那修改本身的需求,也就是平常写程序的那些if else的逻辑什么的...
2.动:
a.不属于你的类的函数调用(姑且看做是第三方模块),当然要排除一些常用的函数比如说字符串处理云云..
也就是说依赖别人的都是不可靠的,没有人会真正和你在一起约定一辈子,那么这部分东西就有可能是变化的
b.配置依赖,当我需要使用原有类的一些函数功能的时候,但是发现其中的配置和功能紧紧的耦合在一块儿,比如说初始化JsonRPC的客户端中服务器的地址
我在新的逻辑中需要改变这个服务器地址,没办法,只有重载初始化JsonRPC Client的函数,但是又发现一个问题就是初始化函数发生在构造函数中,于是子类
在调用父类的构造函数的时候JsonRPC就初始化,轮不到子类来初始化,所以这里JsonRPC的客户端都指向了原有的服务端地址
换句话说,这里的配置也是不可靠的,随时都可能会变化
做到动静分离很简单,避免直接调用,增加一个接口层(如果你是一个强类型的语言的OOP开发者),或者你就封装一个调用的类
第三方模块的调用都抽象为统一的几个操作并封装为另一个类,比如说我这里的:
1.申请任务操作
2.返回任务结果
动的代码依赖->我只需要在原有的代码逻辑中将这个类作为参数,以后在调用的时候用这个类直接调用(Python的鸭子类型)(其他的语言开发者就是利用多态的特性或者接口云云..来调用实际的第三方接口)
动的配置依赖->同样的将配置封装为统一的一个结构,初始化或者其他时候再动态绑定这个结构中的配置信息而不是直接引用配置文件中的参数
再补充一点:
工程中最好不要出现一个独立的没有归属的函数,即使有,这个函数也应该是可以配置的,大学课程时候一个讲程序设计艺术的老师说过,没有返回值的函数应该叫做过程。
这里我觉得一个功能函数不可配置(除非是真的不需要配置)不然都应该有一个归属
转载于:https://www.cnblogs.com/Bozh/p/3248312.html
[开发回忆录]第三方模块的松耦合相关推荐
- python如何离线安装第三方模块_扣丁学堂python开发之第三方模块pip离线安装
扣丁学堂python开发之第三方模块pip离线安装 2018-08-14 14:02:22 747浏览 最近很多参加Python培训的同学说在学习过程中需要安装一些第三方的模块,今天小编就来给大家讲一 ...
- 专访关东升:松耦合分层架构设计
关东升,国内知名iOS技术作家,iOS技术顾问,高级培训讲师,移动开发专家.拥有16年软件开发经验.8年培训行业经验.精通iOS.Android和 Windows Phone 7及Html5等移动开发 ...
- 与应用程序松耦合的报表开发组织
在软件项目中,报表模块经历了一个和其他模块从紧耦合到松耦合的发展过程. 早期的报表,和软件项目的其他功能模块一样,都是由同样的开发工具和语言编写的.从PB.Delphi到asp.php,再到目前的C# ...
- 第三方模块——nodemon是一个命令行工具,用以辅助项目开发、nrm ( npm registry manager ):npm下载地址切换工具
什么是第三方模块 别人写好的.具有特定功能的.我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包. 第三方模块 nodemon nodemon是 ...
- 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session
1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...
- PythonD12——常用第三方模块(图像、url、检测、检测系统)、图形界面、网络编程、电子邮件和web开发
文章目录 常用第三方模块 pillow 图像处理标准库 requests 更方便地处理url chardet 检测编码方式 psutil 获取系统信息 virtualenv 隔离运行环境 图形界面(较 ...
- 松耦合式的权限控制设计,自定义权限表达式
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- 不属于python开发用户界面第三方库的是-模拟试卷C【单项选择题】
原标题:模拟试卷C[单项选择题] 1. 按照"后进先出"原则组织数据的数据结构是____ 队列 栈 双向链表 二叉树 2. 以下选项的叙述中,正确的是 循环队列有队头和队尾两个指针 ...
- 微服务 松耦合_超值干货:微服务架构下如何解耦,对于已经紧耦合下如何重构?...
今天准备谈下微服务架构下各个微服务间如何解耦,以及对于已经紧耦合的微服务如何进行重构.要明白实际上微服务后续出现的诸多问题往往都是一开始微服务模块划分就不合理导致,对于具体的模块划分方法和原则,我总结 ...
- Spring(5)---松耦合实例
Spring松耦合实例 面向对象的概念,是一个很好的设计来打破系统进入一个组可重用的对象.然而,当系统变大,尤其是在Java项目,庞大的对象依赖关系将一直紧密耦合引起对象难以管理或修改.在这种情况下, ...
最新文章
- MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
- C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
- 基于Arduino ATmega328人脸识别IOT演示门锁
- WPFWCFWF打造HelloWorld程序
- 1月28日昆山杜克,西交利物浦大学太仓校区参观计划
- 工作流表单自定义功能的误区
- vue --- 全局注册子组件,并导入全局的子组件
- java将ascii数组转成unicode字串
- bootstrap3 徽章_尔冬升送张大大金像奖女神徽章,全国仅14枚,网友吐槽:他不值得...
- ArcEngine中shp中先加入要素然后删除一部分要素后,放大图形后不显示的问题解决方法...
- mesh threejs 属性_ThreeJS拖动案例解析
- Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别
- 鸿蒙系统30个G,鸿蒙系统升级,为何固定大小有5.9G,也有3点几G呢?
- Eclipse主题插件之DevStyle
- win10设置HTML桌面背景,Win10系统直接将视频设置为桌面背景的方法
- Pentaho BIServer 5.0.1 CE 免登录设置
- [转]挑礼物指南:价格不高却有格调的礼物,送给挑礼物困难症的你(多图预警)...
- 日本财险前瞻2012年IT发展 CDP技术助力异地灾备
- 【转载】《武学求真录》和《逝去的武林》及《老拳师的故事》 -3
- r52500u学计算机,r52500u相当于i几
热门文章
- WinForm设置窗体默认控件焦点
- 前端干货:教你轻松去除inline-block元素空隙
- 33. 对包含指针的容器使用remove这一类算法时要特别小心
- 15c语言语句_如何学好C语言判断语句?攻略if语句是第一步
- 象棋软件最强手机版_我说它是地表手机最强清理软件,没意见吧
- (day 48 - 双端队列的使用 ) 剑指 Offer 59 - II. 队列的最大值
- Asp.net导出Excel/Csv文本格式数据
- CVPR2017-图像特征匹配-GMS:基于网格的运动统计的快速且极度鲁棒的图像特征匹配算法
- anaconda3+pytorch踩坑
- Python Bug: TypeError: a bytes-like object is required, not ‘str