2020.04.15软件构造听课笔记

面向复用编程:开发出可以复用的软件
基于复用编程:利用已有的可复用软件搭建应用系统

复用的特点:
很大的适应性
降低成本和开发时间
充分的测试->高可靠
标准化、一致化
针对性不强->性能差

开发可复用软件的成本要高于一般软件的成本:要有组稿的适应性
性能差些:针对更普适的场景,缺少足够的针对性

使用已有软件进行开发:
可复用软件库,对其进行有效的管理
往往无法拿来就用,需要适配

设计复用软件之前要考虑:复用的频率,设计的代价

高复用性应该满足:
小、简单
与标准兼容
灵活可变
可扩展
泛型、参数化
模块化
变化的局部性
稳定
丰富的文档和帮助

最主要的复用是在代码层面
但软件构造过程中的任何实体都可能被复用,比如:需求、设计\规约spec、数据、测试用例、文档

白盒复用:源代码可见,可修改和扩展
复制已有代码到正在开发的系统,进行修改
可制定化程度高
对其修改增加了软件的复杂度,且需要对其内部充分的了解
黑盒复用:源代码不可见,不能修改
智只能通过API接口来使用,无法修改代码
简单、清晰
适应性差些

框架:一组具体类、抽象类、及其之间的连接关系

白盒框架:通过代码层面的继承进行框架扩展
黑盒框架:通过实现特定接口/delegation进行框架扩展

类型可变(泛型):适应不同的类型,且满足LSP
实现可变:ADT有多种不同的实现,提供不同的representation和abstract function,但具有同样的specification(pre-condition,post-condition),从而可以适应不同的应用场景
提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作(及其组合)
内部实现可能会经常变化,DNA客户端不应受到影响
表示独立性、信息隐藏
将共同的行为(共性)抽象出来,形成可复用实体:父类、抽象类
只要看到了自己写了重复或相似的代码,想办法抽取出来形成可复用方法/类

设计可复用的类:
继承与重写
重载
参数多态与泛型编程
行为子类型与Liskov替换原则
组合与委托
设计可复用库与框架

LSP:子类型可替换原则(里氏替换原则)

子类型多态:客户端可用统一的方式处理不同类型的对象

子类型可以增加方法,但不可删
子类型需要实现抽象类型(接口、抽象类)中所有未实现的方法
子类型中重写的方法必须有相同或子类型的返回值或者符合co-variant的参数
子类型中重写的方法必须使用同样类型的参数或者符合contra-variant的参数(此种情况Java目前按照重载overload处理)
子类型中重写的方法不能抛出额外异常

更强的不变量、更弱的前置条件、更强的后置条件

强行为子类型化:
前置条件不能强化
后置条件不能弱化
不变量要保持
子类型的方法参数:逆变
子类型方法返回值:协变
异常类型:协变

covariance(协变)
contravariance(反协变、逆变)

在java中逆变是按照重载进行处理的,而不是重写

Java中数组是协变的:对T[]数组,可以保存类型T及其子类型的数据
泛型类型是不变的,例如List<String>和String<Object>是没有任何关系的,原因是类型参数在编译后被丢弃,在运行时不可用(类型擦除)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值