系统的可复用性

摘自《JAVA与模式》阎宏著

"复用"有时译作“重用”,是重复使用的意思。自20世纪60年代末以来,软件的复用便是重要的研究课题,但是一般软件的复用率尚不高,在国内的软件界尤其需要改善。

复用的重要性

软件的复用的好处有:第一,较高的生产效率;第二,较高的软件质量;第三,恰当使用复用可以改善系统的可维护性。

一个可以重复使用的软件成人可以为将来的使用节省费用。一个构件被复用的频率越高,构件的初始开发投资就相对越少。

一个可复用的软件成分总是比不能复用的软件成人有更多的质量保证。如果一个复用率高的软件构件有程序缺陷的话,这种缺陷可以更快地、更彻底地被排除。这样的软件成分必定是有利于系统的可维护性的。

更为重要的是,复用与系统的可维护性有直接关系,这主要是由于 在面向对象的系统设计中复用的概念与传统的概念有很大的不同。这一点会在下面具体讲述。

传统的复用

利用不仅仅是代码的利用,虽然代码复用确实是复用的一个初等形式。

代码的剪贴复用

利用现代的代码编辑器、集成开发环境(IDE)等,可以很容易地做到减少抄写代码的人力成本。这虽然比完全没有复用好一些,但是靠剪贴源代码达到复用,仅仅是复用的最初步做法。

源代码的剪贴往往作为程序员自发的代码复用形式出现。在具体实施时,仍然冒着产生错误的风险。管理人员不可能跟踪大块代码的变异和使用。

由于同样或类似的源代码同时被复制到多个软件成分中,当这块软件代码发生程序错误需要修改时,程序员需要独立地修改每一块拷贝。由于同样的原因,多个软件成分需要独立地检测。利用所能节省的初期投资十分有限。

算法的复用

各种算法比如排序算法得到了大量的研究。现在几乎不会有人在应用程序编程时试图建立自己的排序算法,通常的做法是在得到了很好的研究的各种算法中选择一个。这就是算法的复用。

数据结构的复用

与算法的复用相对的,是数据结构的复用。如队、栈、队列、列表等数据结构得到的十分透彻的研究,所有的计算机教学都要详细描述这些数据结构。这就是数据结构的复用。

这些都是传统的复用各类,它们都各有优点,也各有缺陷。

可维护性与复用的关系

传统的复用方案的一个致使缺陷就是复用常常是以破坏可维护性为代价的。比如两个模块A和B同时使用另一个模块C的功能。那么当A需要C增加一个新的行为的时候,B有可能不需要,甚至不允许C增加这个新行为。如果坚持使用复用,就不得不以系统的可维护性为代价;而如果从保持系统的可维护性出发,就只好放弃复用。可 维护性与可复用性是有共同性的两个独立 特性,它们就像是两只同时在奔跑的兔子。


因此,一个重要的概念就是支持可维护性的复用,也就是在保持甚至提高系统的可维护性的同时,实现系统的复用。那么怎样才能设计一个系统,以达到提高可维护性的复用目的呢?换言之,怎样才能抓住这两只同时在奔跑的兔子呢?


面向对象设计的复用

在一个像Java这样的面向对象的放言中,抽象化、继承、封闭和多态性是几项最重要的语言特性,这些特性使得一个系统可以在更高的层次上提供可复用性。数据的抽象化和继承关系使得概念和定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和促进系统的可维护性。这样一来,利用的焦点不再集中在函数和算法等具体实现细节上,而是集中在最重要的含有宏观商业逻辑的抽象层次上。换言之,利用的焦点发生了“倒转”。

发生复用焦点的倒转并不是因为实现细节的复用不再重要,而是因为这些细节上的利用往往已经做得很好,而且抽象层次是比这些细节更值得强调的复用焦点,因为它们是在提高利用性的同时保持和提高可维护性的关键。

既然抽象层次是一个应用系统做战略性判断的决定的地方,那么抽象层次就应当是较为稳定的,应当是利用的重点。如果抽象层次的模块相对独立于具体层次的模块的话,那么具体层次内容的变化就不会影响到抽象层次的结构,所以抽象层次的模块的复用就会较为容易。

在面向对象的设计里面,可维护性利用是以设计原则和设计模式为基础的。


对可维护性的支持

首先,恰当地提高 系统的可复用性,可以提高系统的可扩展性。允许 一个具有同样接口的新的类代替旧的类,是对抽象接口的复用。客户端依赖于一个抽象的接口,而不是一个具体的实现类,使得这个具体类可以被另一个具体类所取代,而不影响到客户端。

系统的可扩展性是由“开-闭”原则,里氏代换原则、依赖倒转原则和组合/聚合复用原则所保证的。

其次,恰当地提高系统的可复用性,可以提高系统的灵活性。在一个设计得当的系统中,每一个模块都相对于其他模块独立存在,并只保持与其他模块的尽可能少的通信。这样一来,在其中某一个模块发生代码修改的时候,这个修改的压力不会传递到其他的模块。

系统的灵活性是由“开-闭”原则、迪米特法则、接口隔离原则所保证的。

最后,恰当地提高系统的可利用性,可以提高系统的可插入性。在一个符合“开-闭”原则的系统中,抽象层封装了与商业逻辑有关的重要行为,这些行为的具体实现由实现层给出。当一个实现类不再满足需要,需要以另一个实现类取代的时候,系统的设计可以保证旧的类可以被“拔出”,新的类可以被“插入”。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值