减少代码模块之间的纠葛——解耦
来源:互联网 发布:修容产品推荐 知乎 编辑:程序博客网 时间:2024/06/05 19:38
辛苦堆砌,转载请注明出处,谢谢!
这篇文章是本人公众号中的文章,《程序员修炼之道》个人感悟,感觉写的还不错XD,所以也发到CSDN,希望能够帮助大家。博主最近比较忙,不过没有白忙,工作中好好用了一把Android的测试框架espresso,有机会给大家详细说说,感觉espresso还是挺好用的,尤其是坐着看自动填表单,感觉有点高科技,程序员就要“懒一些”。下面是正文。
代码从产生之日起,就需要我们为之努力工作。软件开发阶段,我们需要编码,发布后的软件之后,为了迎合变更的需求,纠正各类问题,我们不断地修改代码,所做的一切,就是希望我们的软件可以更好地工作。可以说,程序员的工作就是编写代码和修改代码——单调但不乏味,我们总是遇到各种让我们难缠的问题,我们又一次次将其解决。
但是,我们可曾想过,如何让自己的工作更加简单轻松?我们的工作主要依靠头脑和快速敲击键盘的手指,当我们需要修改代码时,尽可能少的活动我们的手指和头脑,就是减少我们工作量最好的方式。这里,我们要说到一个老生常谈的问题——代码的解耦。
耦合度低的代码,不会造成牵一发而动全身的结果,我们不必为了修改一处代码,过多考虑别处的代码;我们需要添加功能,也不必将新的代码插入到已有代码的各个角落。打个形象的比方,高耦合的代码就好比散乱的各色毛线,错综复杂,越理越乱,而耦合小的代码就是整齐摆放的各色毛线球。
那么如何降低代码的耦合性呢?今天就向大家介绍一下。
概念分离
第一个方法,我们要保证代码中的概念分离,所谓概念,就是我们设计时的一个个类。首先,每一个类要概念独立;其次,我们要保证代码在完成一项功能时,一个类尽可能少的与其他类发生关系。
每一个类概念独立,很好理解,打个比方,书柜和书柜里的书,我们就不要设计一个类是书柜和书,而是要定义两个独立的类,书柜类和书类,之后通过关联将两个类联系起来,它们之间的关系就是书柜中可以放书。
那么,如何理解一个类尽可能少的与其他类发生关系呢?这就好比我们现实生活中有些事情不一定人多就好办事,办一件事,人太多了,反而可能不利于把事情办好。我们现在取快递,是快递员告诉我们有快递,我们直接找他去拿就好了。我们假设有另一种模式,快递员只是通知我们有快递了,让咱们过去和他要地址,我们找到了快递员,他告我们去XX街XX路口拿,我们去了另一个地方,结果发现这里的人走了,留下了一个字条,说他去了另一个地方,你想要知道我去哪里了,可以问XX快递员。不往下写了,估计快递很难取到了。在这里,我们相当于和三名快递员存在耦合,才会导致我们出现意外情况,难以弥补。
所以,概念解耦,是我们代码解耦的第一步。
代码灵活
我们要保证我们的代码足够灵活。什么样的代码叫灵活的代码呢?这里牵扯到面向对象的开闭原则,不详细说明了,简单来说就是我们修改功能或逻辑,最好可以不动代码,即使动代码,变动的代码也要尽可能的集中。
怎么做到呢?方法是使用配置文件,比如我们可以为我们的项目设计一个XML文件,其中有项目的各个模块的装配信息,我们可以在程序启动时动态解析XML文件,然后动态装配我们的各个模块,这样,当我们有一些需要改变功能的工作,可能只需要修改装配信息,就可以完成了。Spring框架是利用这个思路的典范。
说的严重一些,想让代码灵活,这种装配文件是必不可少的,是我们应该多多采用的方式。
破除时间耦合
大家或许会有疑问,时间怎么会有耦合?时间耦合是指一些事情我们本可以并行处理,但是,由于人比较善于线性思考,所以将其线性化了。写代码时,如果没有严格的先后顺序,可以使用并行处理,这样,一方面,破除了本不该存在的耦合,另一方面,对程序性能也有重大的改善。举个生活中的例子,我们做开水的时候没有必要非要等待水开了才去做另一件事,这就是典型的并行处理。
善于使用MVC
MVC可以说是最经典的架构模型,相信程序员都应该了解,这里不再赘述。
公共数据交换场所
如果模块之间需要交换数据,而且各个模块还是并行的,那么,一个好的方法是我们可以提供一块供他们交换数据的公共场所,这样,可以极大限度的减少各个模块之间的耦合。打个形象的比方——超市购物,我们现在的超市,工作人员将商品摆放在货架上,他要做的工作的,就是保证自己的货架有足够的商品,他不用关心什么样的人买了商品,而我们购物,只需要看货架上的产品,没必要去和工作人员直接沟通。这样,加快了我们购物的速度,也加快了工作人员的工作速度,互不影响。
尝试在开发时使用上面的方法,我们就能够写出低耦合的代码,这样,我们就能够极大地减少我们的工作量,提高我们工作的实效性。
- 减少代码模块之间的纠葛——解耦
- Android——Activity和Fragment的爱恨纠葛
- 全程记录—与ReactNative的爱恨纠葛
- ViewState、UpdatePanel及控件OnPre之间的纠葛
- try catch finally 和 return 之间的顺序纠葛
- 减少重复的代码
- 形、音、义的纠葛——《语文常谈》读书笔记(3)
- float: left; margin: 0 auto; display:inline-block;三者的之间的纠葛
- 未来的工作:人类与AI技术之间的「爱恨纠葛」
- 你了解封装类和类的继承以及枚举类之间的恩怨纠葛吗?
- KEIL、uVision、RealView、MDK、KEIL C51之间的关系纠葛(比较区别)
- 屏幕适配,彻底理解dp,dpi,屏幕密度,分辨率之间的爱恨纠葛
- 编写高质量的C++代码--01 减少文件之间的编译依赖
- 使用Mapstruct来进行domain实体与Entity模型之间的映射操作,减少类之间代码转化
- 如何减少可执行文件的代码
- 如何才能减少代码的错误
- 如何减少代码的量
- 减少代码嵌套的方法
- 标准二维表问题,catalan数的应用
- PCA,SVD
- 纯CSS3实现不错的表单验证效果
- Linux新手生存笔记[1]——Linux目录结构及说明
- Android 多个Fragment切换动画
- 减少代码模块之间的纠葛——解耦
- Java Map的遍历
- 24点游戏
- 链表中倒数第k个结点
- 前缀、中缀、后缀表达式
- 剑指offer---二维数组中的查找
- ArcGIS API For Javascript之离线部署
- 读书笔记:《HTML5开发手册》Web表单
- 汇编调用c函数为什么要设置栈