TangTag的博客

学习经验

软件构造之软件复用

软件复用是使用现有软件组件实现或更新软件系统的过程。


软件重用的两个视角:

面向复用编程:开发出可复用的软件

基于复用编程:利用已有的可复用软件搭建应用系统

为什么需要复用

降低成本和开发时间
产生可靠的软件
实现标准化,在不同应用中保持一致
可重用组件的级别和形态
代码级别复用

两种类型

白盒复用:源代码可见,可修改和扩展,复制已有代码当正在开发的系统,进行修改
优点:可定制化程度高
缺点: 对其修改增加了软件的复杂度,且需要对其内部充分的了解

黑盒复用:源代码不可见,不能修改,只能通过API接口来使用,无法修改代码
优点:简单清晰
缺点:适应性差
具有的缺点

维护问题
很容易出现错误
需要使用的软件是如何工作的知识
需要访问源代码

模块级重用:类/接口

类的重用:继承和委托
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承的特性

子类拥有父类非private的属性,方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。子类可以用自己的方式实现父类的方法。Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
继承可以使用 extends 和implements 这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

extends关键字
在 Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

implements关键字

使用 implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。

final关键字

final关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

委派

委派模式(Delegate)是面向对象设计模式中常用的一种模式。这种模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性;并且调用B中的方法,属性就是调用A中同名的方法和属性。B好像就是一个受A授权委托的中介。第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种功能,又能够很好的将A保护起来了。


库级别重用:API /包

一个好的API的特点
易于学习
易于使用,即使没有文档
很难滥用
易于阅读和维护使用它的代码
足够强大以满足要求
易于发展
适合受众

 

系统级重用:框架

框架:一组具体类、抽象类、及其之间的连接关系
开发者根据 framework的规约,填充自己的代码进去,形成完整系统。通常通过选择性覆盖来扩展框架;或者程序员可以添加专门的用户代码来提供特定的功能---即定义继承了抽象类祖先操作的具体类 Hook方法,它被应用程序覆盖以扩展框架。Hook方法系统地将应用程序域的接口和行为与应用程序在特定上下文中所需的变体解耦。 控制反转:与库或标准用户应用程序不同,控制流不是由调用者决定的,而是由框架决定的。不可修改的框架代码:在接受用户实现的扩展时,框架代码不应该被修改。换句话说,用户可以扩展框架,但不应修改其代码

可复用性的外部指标:

类型可变 ,适应不同的类型,且满足LSP

功能分组,提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的 操作(及其组合)

实现可变,ADT有多种不同的实现,提供不同的representations和abstract funtion,但具有同样的specification(pre-condition, postcondition, invariants),从而可以适应不同的应用场景

表示独立,表示独立性是信息隐藏规则的延伸,对于大型系统的顺利开发至关重要:内部实现往往会改变,但客服端不应受到影响。

共性抽取,将共同的行为(共性)抽象出来,形成可复用实体

阅读更多
个人分类: Learning
上一篇软件构造之等价性
下一篇软件构造之设计可重用的类
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭