11.2.1 复用性
软件复用是提高软件生产力、提高软件质量和缩短软件开发周期的一种有效的手段。据分析统计,开发一个新的应用系统,40%~60%的代码是重复以前的成分,有的甚至高达85%。
传统语言也可以具备复用性,但面向对象设计语言的语法机制大大增加了复用的可能,使复用更加方便灵活,如鱼得水。
软件复用(reuse,又称软件重用)是20世纪80年代以来国际上非常重视的一项新技术,被认为是最有希望成数量级地提高软件人员劳动生产率的技术,软件复用性被认为与可靠性、正确性和可维护性居于同等重要地位。
(1)代码复用的种类。存在两种代码复用类型:一种是本项目之内的代码复用,另一种是新项目对旧项目的代码复用(包括本项目复用以前项目的类部件及本项目为其他新项目复用本项目的部件做准备)。内部复用只是找出设计中的冗余代码序列(包括数据和操作),然后把它们组成各种各样的类部件,供系统本身复用。外部共享需要从长远目标考虑。设计者很可能仔细考虑一些子系统的复用,如抽象出数据类型,报表生成软件工具类库等。
(2)复用的设计准则。
①保持方法的耦合性(单纯化):一种方法只能完成单个的功能或一组紧密相关的功能。如果某方法涉及两个或多个不相关的功能,就把它分解成更小的方法。
②尽量设计小方法:如果方法太大,应把它分解成更小的方法。一般一个方法不要占用超过一页纸。
③方法的一致性:相似的方法应该有一致的名称、条件、参数次序、数据类型、返回值及出错条件等。只要有可能就应该维持平行结构。(https://www.daowen.com)
④分离的策略和实现:策略方法制定决策,变换参数,并且收集全局资源。策略方法常常是高度依赖应用的,但很容易编写和理解。策略方法可喻为是建筑工程中的“水泥”。
实现方法执行具体的详细操作,而不决定是否或为什么执行。如果实现方法通到错误,则它们应该只返回状态,并不采取行动。实现方法是对具体的变量执行具体的计算,其中常常包含复杂的算法。实现方法并不访问全局资源,不制定决策,不包括缺省或协调控制流等。由于实现方法是自含式算法,它们有可能在其他上下文中也有意义且可复用,实现方法可喻为建筑工程中的“砖头”。
只有把“砖头”和“水泥”科学的结合,才能建起华丽、坚固的大厦。不要将策略和实现放入同一方法中。应把算法的核心部分放入一个可区分的,完全具体的实现方法中。这需要从策略方法中抽象出具体的参数作为调用实现方法的变量。
⑤统一的覆盖面:如果输入条件在各种组合中出现,则应该针对所有组合卸除方法,而不能仅仅针对当前用到的组合情况些方法。
⑥应该让方法尽可能广泛些,尽量归纳出参数类型、前提及约束。归纳出方法是如何执行的假设及方法操作的内容范畴等。来对空值、极限值及边界值以外做出有意义的响应。
例如,产生用于检索记录的条件表达式的方法,这个方法应该是对任一个数据库文件都适用,即库文件名参数化。只要传递一个实在的库文件名,该方法便可动态的返回一个可用的条件表达式。
⑦避免全局信息:尽量少涉及外部事物。
⑧利用继承机制:在面向对象程序中,使用继承机制是实现共享和提高重用程度的主要途径。