软构——可复用性

  • 可复用性的概念

        何为可复用性?顾名思义,就是可以用来再次使用,而我们追求可复用性就是为了降低后续开发的时间成本,提高工作效率。

优点

  1. 降低成本和开发时间
  2. 经过充分的测试,可靠、稳定
  3. 标准化,在不同应用中保持一致

 

 

  • 复用的四个层面:
Source code level reuse 源代码级别的复用
Module-level reuse: class/interface 模块级别的复用:类 / 抽象类 / 接口
Library-level: API/package 库级别的复用: API/
System-level reuse: framework 系统级别的复用:框架
  •  LSP(Liskov Substitution Principle 里氏替换原则)

Java中的编译器强制执行的规则(静态类型检查):

  1. 子类型可以增加方法,但不可删除方法
  2. 子类型需要实现抽象类型中的所有未实现方法
  3. 协变:子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
  4. 逆变:子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
  5. 子类型中重写的方法不能抛出额外的异常

也适用于指定的行为(方法):

  1. Same or stronger invariants 更强的不变量
  2. Same or weaker preconditions 更弱的前置条件
  3. Same or stronger postconditions 更强的后置条件

上述例子是符合不变量、前置条件、后置条件的方法

 

而在这个例子中,不变量是不可以比较的,没有强弱之说,是不符合LSP的要求的,所以这个正方形不是矩形的行为子类型吗。

 

总结:对输入的要求降低,对输出的要求提高。输入的要求要变低,所以参数类型要更抽象,输出要求更高,所以返回值和异常要不变或更具体

  • 继承(Inherita)&委托(Delegation)

  • “委托”发生在object层面
  • “继承”发生在class层面

继承

子类继承父类,相当于继承父亲的内容,打上了父亲的烙印,始终有联系

委托

        理解:(依赖)相当于请别人帮忙,这个事情(方法)完成后这种关系也随之断开。(接口)
(如果写死在了构造方法或者rep中就是永久的delegation,如关联,组合,聚合)
        聚合,新类里用到了别的类的对象,用构造方法来传入参数绑定
        组合,写死在rep或构造函数中,即new了一个新的对象(别的类的)

  • 黑盒框架 & 白盒框架

黑盒框架

delegation,只调用框架给出的接口中的方法,方法的实现依据派生的子类型不同而不同。

  • 通过实现特定接口进行框架扩展,采用的是delegation机制达到这种目的,通常采用的设计模式是策略模式(Strategy)和观察者模式(Observer);
  • 黑盒所预留的是一个接口,在框架中只调用接口中的方法,而接口中方法的实现就依据派生出的子类型的不同而不同,它的客户端启动的就是框架本身。

白盒框架

继承和重写,依据已经写好的框架,想要新方法只能override

  • 通过继承和重写实现功能的扩展,通常的设计模式是模板模式(Template Method);
  • 白盒框架所执行的是框架所写好的代码,只有通过override其方法来实现新的功能,客户端启动的的是第三方开发者派生的子类型。

 

  • 面向复用的设计模式

adapter适配器模式:多增加一个接口来隐藏子类,以此适应已有的类和client需求不适配


Decorator装饰者模式:客户端需要多种特性的object,逐层装饰委派实现功能加到对象上


facade外观模式:用一个统一的简化的接口来替代一系列的小接口,以此实现对复杂系统的封装,而且有了这个接口也方便client学习使用。


strategy策略模式:实现不同的抽象接口(使用不同的算法)运行时根据client倾向传入对应的算法类,防止算法写死在程序里,增加灵活性。


Template Method模板方法模式:(白盒框架)共性的步骤就在抽象类里面统一实现,不同的步骤在不同的子类里单独实现,使用继承和重写。由于已知哪些是共性的哪些是差异性的,所以可知已知代码内容,所以是白盒(就如同不同的交通方式交通前往异地,统一的有:买票,等候,上车/机,行驶,到站下车/机,步骤相同,但具体实现方式不同)


iterator迭代器模式:目的就是不管对象在哪一个容器/集合里面,都可以遍历。在ADT内写一个iterator接口,就可以实现hasnext(),next(),remove()方法啦。

  • 小结

        可复用性是很具有经济价值的一种思想,但不是所有的可复用都省钱,利用已经完成的可复用方法、框架、软件是节省成本的,但是如果目的是开发一套可复用的框架,那成本反而会增加很多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyg809073256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值