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

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

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

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

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

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

最主要的复用是在代码层面
但软件构造过程中的任何实体都可能被复用,比如:需求、设计\规约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>是没有任何关系的,原因是类型参数在编译后被丢弃,在运行时不可用(类型擦除)

2020.04.15软件构造听课笔记相关推荐

  1. 2020.03.11软件构造听课笔记

    这节课讲的主要是软件生命周期与配置管理 软件生命周期与配置管理: 软件从无到有的过程:计划.分析.设计.写代码.测试.实际运行(调试等) 传统的软件过程模型有两种:线性过程,迭代过程 其他模型有:瀑布 ...

  2. 2020.05.20软件构造听课笔记

    断言和异常处理都可以处理同样的错误 开发阶段用断言尽可能消除bugs 在发行版本里用异常处理机制处理漏掉的错误 对于来自外部的数据源要仔细检查,例如:文件.网络数据.用户输入等 Barricade: ...

  3. 2020.03.04软件构造听课笔记

    以下为2020年3月4日的软件构造听课中记录的知识点: 测试是负能量的表现:破坏.证错 再好的此时也无法证明系统里不存在错误 一个好的测试的特征: 1.能发现错误: 2.不冗余: 3.最佳特性最佳方案 ...

  4. 软件构造学习笔记-第九周、第十周

    因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...

  5. 软件构造学习笔记-第八周

    本周重点是Liskov可替换原则.它要求父类和子类的行为一致性,子类要有更强的不变量.更弱的前置条件.更强的后置条件.在该原则的要求下,每个子类都可以对父类进行替换.这在开发过程中会带来极大的便利,在 ...

  6. 软件构造学习笔记(九)面向复用的软件构造技术

    目录链接 Part I What is Software Reuse? Part II How to measure "reusability"? Part III Levels ...

  7. 哈工大软件构造2022笔记(持续更新----1)

    Class 1 第0节的主要内容是讲课程要求: 实验占35分,个人博客占5分,期末考试占60分(闭卷) 在cms中加入课程:链接在老师发的ppt里面有,这里就不展示了. 实验要求: 在Java+Ecl ...

  8. 软件构造学习笔记ATD

    在面向对象的编程中,ADT的编写十分重要,与传统的c语言不同,面向对象的编程更加商业化一点,所以保密需要做好,有点商业机密的感觉.如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示,避 ...

  9. 哈工大软件构造学习笔记1 Views and Quality Objectives of Software Construction

    先要搞清楚软件构造的对象是什么,如何刻画,在关注如何构造. 1,Five key quality objectives of software construction 软件构造的五个关键质量目标 容 ...

最新文章

  1. TensorFlow入门(三)多层 CNNs 实现 mnist分类
  2. 职场不需要中年,但中年需要职场
  3. Android5.1修改以太网MAC地址(SElinux)
  4. 数据中心暖通相关知识与空调规划设计知识
  5. [jstips]向数组中插入一个元素
  6. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...
  7. python学习-知识点进阶使用(end、while else、range、iter、list的多种遍历方式)
  8. SAS学习︱逻辑库、数据集创建与查看、数据库链接(SAS与R的code对照)
  9. oracle导出表中某天数据命令,Oracle数据库使用命令行导入导出数据表及数据内容(本地、远程)...
  10. flink离线mysql_Flink 流模式跑离线任务
  11. cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方式
  12. python 线程锁_Python多线程-线程锁
  13. 必应拼音输入法与搜狗拼音输入法体验性分析检测
  14. 软件开发的心得体会(一)
  15. 网关末尾要么是1要么是254
  16. 3D 中的方位与角位移(旋转矩阵、欧拉角、四元数)
  17. BroadcastReceiver(接收广播)
  18. 2020 中国企业 500 强:华为投入研发 1317 亿、阿里 431 亿、中国移动 235 亿、百度 183 亿
  19. 高并发、高可用、高负载、分布式架构
  20. 最新小程序转app的神方案

热门文章

  1. 淘宝 TOP 平台Open API入门篇
  2. 这样的老板,真想把他拖进WC爆zou一顿.....
  3. 5.5寸android智能手机,5.5英寸1080P 小辣椒3智能手机正式发布
  4. python+django基于大数据的餐饮美食食物推荐系统
  5. 中兴如何远程服务器时间同步,IPRAN时钟同步方案分析
  6. 基于C++的opencv中Mat矩阵运算方法总结
  7. java生成pdf表格示例代码
  8. Project Caliper:目标是打造最佳VR手柄
  9. MATLAB三维绘图(一)三维基础绘图
  10. JStorm-介绍-阿云栖社区