软件构造笔记(二)
程序员文章站
2022-03-01 15:48:44
...
面向复用的软件构造技术
一.复用基本概念
(一)复用编程:
1.programming for reuse 面向复用编程:开发出可复用的软件
2.programming with reuse 基于复用编程:利用已有的可复用软件搭建应用系统
(二)四类复用级别:
1.源代码级别的复用
2.模块级别的复用:类、抽象类、接口
3.库级别的复用:API、包
4.系统级别的复用:框架
二.LSP–Liskov Substitution Principle
(一)内容:
1.前置条件不能强化
2.后置条件不能弱化
3.不变量要保持
4.子类型方法参数:逆变
5.子类型方法返回值:协变
(二)协变:
1.返回值类型:不变或变得更具体
2.异常类型:不变或变得更具体
3.举例:
(1)返回值类型
class T{ //父类
Object a(){...}
}
class S extends T{ //子类
@Override
String a(){...}
}
(2)异常值类型
class T{ //父类
void b throws Throwable{...}
}
class S extends T{ //子类
@Override
void b throws IOException{...}
}
(三)逆变:
1.参数类型:要相反的变化,要不变或越来越抽象
2.举例:(会报错,目前Java把这种形式看作overload)
class T{ //父类
void c(String s) {...}
}
class S extends T{ //子类
@Override
void c(Object s) {...}
}
三.Delegation
1.委派:一个对象请求另一个对象的功能
2.定义类时不用extends
比如:private Graph graph = Graph.empty()
3.使用条件:
子类只需要复用父类中的一小部分方法
4.建立delegation步骤:
(1)永久保存delegation关系:List< Student > ls;
(2)建立delegation关系:this.ls.add(s);
(3)逐个delegate:通过for循环实现
5.举例来讲:
class Professor{
List<Student> ls;
void enroll(Student s) {
this.ls.add(s);
}
void evalute(){
double score = 0;
for(Student s: ls)
score += s.evaluate(this);
}
}