软件构造知识点复习:复用及面向复用的软件构造(上)

复用度的度量、形态与外部表现

{ProgrammingForReuseProgrammingWithReuse\left\{ \begin{array}{c} Programming For Reuse:面向复用的编程 \\ Programming With Reuse:基于复用的编程\end{array}\right.
复用:
{API()()\left\{ \begin{array}{c} 源代码级别:方法、语句\\ 模块级别:类、接口 \\ 库级别:API(用来调用) \\ 构架级别:框架(自己填写内容)\end{array}\right.
软件构造知识点复习:复用及面向复用的软件构造(上)
{西西()\left\{ \begin{array}{c} 白盒复用:直到复用的东西的实现 \\ 黑盒复用:不知道复用的东西的内部实现(尽量用黑盒)\end{array}\right.
{\left\{ \begin{array}{c} 白盒框架:通过继承扩展 \\ 黑盒框架:通过委派扩展\end{array}\right.
模块复用:
{(inheritance)(delegation)\left\{ \begin{array}{c} 继承(inheritance) \\ 委派(delegation)\end{array}\right.

面向复用的软件构造技术

LSP原则

LSP原则:子类型多态:用父类是可以用子类无条件的替换
为了实现LSP,我们要做到:

  1. 子类型的方法只增不减
  2. 子类型实现了抽象的父类中没有实现的方法
  3. 重写的方法,参数与返回值与父类的相同,不能抛出更多的异常
  4. 子类的spec:RI更强,前置条件pre相同或更弱,后置条件post相同或更强
    软件构造知识点复习:复用及面向复用的软件构造(上)
    {(JAVA)/\left\{ \begin{array}{c} 子类型参数:逆变(JAVA会当作重载) \\ 子类型返回值/异常:协变\end{array}\right.
    {\left\{ \begin{array}{c} 逆变:具体→抽象 \\ 协变:抽象→具体\end{array}\right.
    注:
  5. 泛型不能改变:类型擦除→用通配符解决<? extends 父类/接口>/<? super 子类>
  6. 数组可以:但敲定后就不可变了
    软件构造知识点复习:复用及面向复用的软件构造(上)

委派(Comparator)

用另一个对象
继承与委派:
{(inheritance)(class)(delegation)(object)\left\{ \begin{array}{c} 继承(inheritance):要大部分的功能,类(class)层面的 \\ 委派(delegation):要小部分的功能,对象(object)层面的\end{array}\right.
软件构造知识点复习:复用及面向复用的软件构造(上)
CRP原则:一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
{DependencyAssociationrep()CompositionAssociationAggregationAssociation\left\{ \begin{array}{c} Dependency:临时性的委派,在用的时候以参数方式传入,依赖关系\\ Association:永久性的委派,rep里保存,关联关系(在创建的时候传入)\\ Composition:更强的Association,在创建时自动生成\\ Aggregation:更弱的Association,在创建时传入,可以通过函数更改\end{array}\right.