软件构造笔记——5.1各层次的复用与外部表现

根据复用的层次不同,有多种类型的划分。
Design patterns基于设计模式的复用:体现在抽象和具体对象的交互上;
Component-based development:基于组件层面的复用
Application frameworks:提供一些可进行调整、拓展的抽象或具体类
Legacy system wrapping:只留下接口提供服务

Source code层面:方法、声明
实现:代码的复制粘贴(弊端:好多代码?)

模块层面:类和接口(平时实验中用得较多的)
继承、组合/聚合委托/关联
复用形式:类文件、.zip/.jar包(类是最小单位)
(处于方便考虑,相关的类还是放在一个包里,还要记得为使用者提供文档说明哦)
使用方法:添加一下build path,之后在代码中import一下即可。

委托机制:调用A对象的某功能,而A对象将该功能的实现委托给B对象完成。这个过程可以是显式的,也可以是隐式的。
显式:将被委托对象显式传递给任务接收者。
隐式:这种委托通过语言的查询机制实现。
软件构造笔记——5.1各层次的复用与外部表现_第1张图片
如在调用某个List对象的sort()方法时,传入一个new Comparator()对象(当然这个对象的public int compare(Object o1, Object o2)方法要自己重写),将排序的比较规则交由这个new Comparator()对象的int compare(Object o1, Object o2)方法完成。
类似地,使用 Collection.sort(),这里需要传入需要排序的list,它会将排序的比较过程交给list中对象的public int compareTo(Object o) 方法(注意:这里list中的对象所属的类型必须已经实现了 Comparable接口中的 public int compareTo(Object o) 方法)。

依赖(Dependency) 关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为 局域变量方法的形参,或者对静态方法的调用。
软件构造笔记——5.1各层次的复用与外部表现_第2张图片
关联(Association 关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。
软件构造笔记——5.1各层次的复用与外部表现_第3张图片
聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。

组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中 代表整体的对象负责代表部分对象的生命周期,组合关系是 不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。(类似于一种A owns B的关系)
软件构造笔记——5.1各层次的复用与外部表现_第4张图片

类库层面:API类库、Maven等
(要易于使用、易于理解,即使在没有文档的情况下)

系统层面:框架
框架需要满足各种不同需求的可拓展性,所以它相对于一般应用程序而言,更抽象。通常框架的使用方式有:
1.通过继承抽象类,来调用相关的方法(实现hook method)
2.为能被框架识别的事件,添加相应响应方法(或者被相应方法调用的方法也行)

分类:
黑盒框架:用户只要负责写好传入框架的被委托者即可,例如上面的Comparator与sort()方法
白盒框架:用户需要通过继承实现hook method。

相对于类库
1.框架的自主空间范围更大,
2.会影响控制流,甚至于整个程序的控制流是由框架决定滴!(而类库不会。。)
(这就是框架对用户端代码所说的:“Don’t call us. We’ll call you.”)
调用关系
软件构造笔记——5.1各层次的复用与外部表现_第5张图片
3.框架的可拓展性(注意:是可拓展性,不是可修改的!)
4.框架常常调用类库中的方法,以化简开发。

可复用的外在特性表现
1.对可复用的类型组建参数化
2.对不同功能进行模块细化分工实现,并构成一个模块组
3.对于自满足复用 的模块,要自己实现各种模块 的复用
4.变量不变性:即便内部的实现方式发生变化,但是仍然满足spec
5.要求开发者提取出常复用的功能模块

你可能感兴趣的:(软件构造)