软件构造第九章总结——面向复用的软件构造技术

复用的层级划分

  1. 代码层面:方法,语句
  2. 模块层面:类,接口
  3. 库层面:API
  4. 架构层面:框架

复用的分类

  1. 白盒复用:源代码可见,进而可以修改。
  2. 黑盒复用:不可以修改,只能通过API来调用。常见的是委托形式,委托用户写的实现抽象类的具体类。

框架的分类

  1. 白盒框架:代码层面的继承,重写完成框架的拓展。
  2. 黑盒框架:实现接口,通过delegation完成框架拓展。

LSP

  1. 子类型多态:客户端用同一方式处理不同对象。比如所,我的客户端用的都是Animal,我用的都是Animal规定的API进行操作。当我传进来一个Dog,此时仍是Animal的遥控器,使用的只能是Animal(即接口定义的方法)。但是,这有很大的意义:首先,我们可以只写一个Animal,完成多种子类型的处理,而不必改变我们的代码。其次,我们可以使用子类重写后的方法。那么,正因为声明Animal的位置上,我们可以传进去Dog,因此Dog要作为Animal的子类,需要满足以下一些条件。
  2. ①子类实现父类抽象,不能覆盖非抽象方法。(一种规约)。②子类可以增加自己特有方法。③子类重写的方法返回值必须协变(更具体)④子类抛出的异常必须更具体,或者说,不能抛出额外的异常。⑤子类型重写的方法的SPEC必须更强或不变(假如你变弱了,那么我客户端本来满足调用要求,结果你前置条件加强了,导致我没法使用你子类这个方法,这就导致Dog无法作为Animal的子类)⑥理论上,子类重写的方法的参数列表必须逆协变(但是在Java不允许,Java重写必须保证参数一致)
  3. 泛型是不可协变的。A与B有关系(父子关系),但是Box(A)与Box(B)无关系。那这是不是代表我们的Box没有办法优雅地多态了不是,使用通配符即可。比如

这里的代表任何Number的子类的都可以传进来,这也达到了我们统一处理的目的。记住,我们之所以搞这么多子类多态,是因为世界就是多态的,我们为了最少的代码处理最多的情况,就得以父作为参数,让client使用父(通常接口)的操作。

继承的坏处

  1. 但是,继承破坏了类的封装性,也就是父的实现完整暴露给子类,又为白盒复用。父子耦合度十分高(函数都一样了,rep都继承了,能不高吗!),耦合度高,不利于维护。最后,子类从父类继承的实现都是静态的,在编译时已经定义好了,运行时难以变化,且会出现组合爆炸的情况。

委派

  1. 一个对象请求另一个对象的功能,这也是复用的一种常见形式。委派在运行时才动态绑定(通过构造器),进而实现代码复用。总结一下,委派就是动态绑定+功能委派。下面是委派以及继承的对比。
    软件构造第九章总结——面向复用的软件构造技术
    从上面就可以看出,委派不需要我们实现所有方法,需要什么方法,委派一下就行了,避免我的子类实现大量无用的代码。

CRP:复合重用原则

  1. 定义:类通过组合实现多态和复用,即引入其他类的实例,而不是通过基类和父类实现。
  2. 委托发生在Object层面,继承发生在class层面。可以这么认为,继承,就代表二者有很大的关系,比如父子关系,因此父的函数对子并不冗余。但是如果二者没什么关系,一个类就是想用一下别的类的代码,它并不想去当儿子,因此没有必要变成儿子,去继承所有的类,只需要花钱去买个人帮他做事就行了。
  3. 注意,ADT编程需要面向接口编程,因此我们需要抽象出接口。
  4. 委托也可以委托一个接口,具体由子类实现。
  5. 一般形式:把某个行为从类中提取出来,比如flyable以及quackable。接下来,通过一系列接口去实现它。再然后,当我们要创建具体的有这个行为的对象时,首先先创建一个行为组合接口,实现flyable以及quackable,这样新对象就具有这俩行为了。然后,它还需要委托这两个行为的实现类,去帮他做事。
  6. 接口的组合定义了行为的组合,子类实现它就有了这些行为。而子类如何实现这些行为, 它可以自己做,直接写函数,但显然这样效率太低,复用性差,需要deletion一个对象帮他做事,这个对象还之后能被其他对象使用。

delegation的分类

  1. 临时性:dependency,use 使用。我仅仅使用委托人给我的功能,但并不把他作为我的一部分。它在clent中生成,用后即弃。

    软件构造第九章总结——面向复用的软件构造技术
  2. 最强形式:composition,is part of 你就是我的一部分,从出生开始就是我的了。(rep中有你),完全不可分割了。

    软件构造第九章总结——面向复用的软件构造技术

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92102 人正在系统学习中

来源:HIT-1190201210-陈则睿

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月5日
下一篇 2021年6月5日

相关推荐