课程简介
- 能带来什么:1. 掌握OOP基本原理;2. 了解OOP新兴技术;3. 满足OOP技术需求;
- 课程目标:1. OOPL写代码 → OOP → OOSC;2. 朴素OOP → 系统化OOP;3. 传统OO技术 → 现代化OO技术;
- 课程内容:
- OO的起源及动机;
- OO的设计:1. 契约式设计;2. 设计原则;3. 设计模式;4. 应用框架;
背景概述
软件 & 软件工程
软件:
- 概念:
- 一系列按照特定顺序组织的数据和指令的集合,是计算机中的非有形部分。
- 软件 = 程序 + 文档
- 特点:1. 本质上是逻辑产品;2. 现实中受多方制约;
- 基础:1. 图灵机;2. 冯·诺伊曼结构;
软件工程:
- 来源:软件作为一种“工程”(目的,平台,资源),存在“工程问题”(质量、生产率、根源是复杂性)。
- 概念:将系统化的、规范化的、可度量的方法应用到软件的开发、运行、维护过程中,即将工程化应用于软件中。
- 复杂性是软件开发过程中固有的特质。
- 软件工程发展的历史就是人们不断追求更高的抽象、封装和模块化的历史。
软件质量 & 评估因素
软件质量:
- 现状:
- 一般而言,“质量”与“生产率”是一对矛盾。
- 但在软件工程中,提升“质量”却能带来“生产率”的提升,说明软件工程远未成熟,二者的“共同底线”尚未达到。
- 软件质量考察:
- 外部质量因素:用户直接感受到的。
- 内部质量因素:用户无法直接感受到的,体现在源代码、设计报告、分析报告中。(常见指标:模块化/易读性/鲁棒性/可拓展性/注释规范性、详细)
软件质量评估因素:
-
可靠性(Reliability):
- 正确性(Correctness):依据规约,完成任务
- 鲁棒性(Robustness):异常情况,合理反应
- 完整性(Integrity):非法访问或修改合理反应
-
易复用性(Reusability):软件模块用于构建多种不同应用
-
易扩展性(Extendibility):规约改变,软件产品应易于改变
-
兼容性(Compatibility):软件模块相互组合的难易
-
易移植性(Portability):转换到不同的软硬件平台上
-
高效性(Efficiency):尽量少地使用硬件资源、处理器时间、内存、外存、网络带宽等
-
易用性(Ease of use):不同背景的用户学习使用软件产品解决问题的难易
-
按时交付(Timeliness)
-
可验证性(Verifiability),可修复性(Reparability),经济性(Economy)
Tradeoffs(权衡,折中):上述指标不可兼得。
软件模块化
- 背景:应对软件复杂性的基本途径/元方法:
- 分解(Decomposition):分而治之
- 抽象(Abstraction):抓本质、抓重点
- 层次化(Hierarchy):应对大系统,纲举目张
- 概念:
- 模块(module):"Self-Contained";well-defined interfaces;
- 根本特征:相对独立,功能单一。即一个好的模块必须具有高度独立性和相对较强的功能。
- 高内聚,低耦合。
- 耦合度:指模块间相互依赖性大小的度量,耦合度越小,模块的相对独立性越大。
- 内聚度:指模块内各成分之间相互依赖大小的度量,内聚度越大,模块各成分间联系越紧密,功能越强。
- 模块化(modular):软件构造为一组“模块”之有序组合,从而易于装配、易于修补替换模块。是上述“元方法”的推论。
- Extendibility 和 Reusability 的要求。
- 模块(module):"Self-Contained";well-defined interfaces;
- 五个标准(评判什么是“软件模块化”):
- 易分解性(Decomposability):复杂的问题分解为多个子问题。推论:分工。
- 易组合性(Composability):软件单元可以自由组合,进而生成新软件。
- 易理解性(Understandability):模块应能单独理解,不可牵涉太广,自解释。
- 连续性(Continuity):规约中的小变化也只能引起结构中的小变化。
- 保护性(Protection):异常不扩散,扩散范围有限。
- 五个规则(后四个用于降低耦合度):
- 直接映射(Direct Mapping)
- 接口要少(Few Interfaces):模块间通信应尽可能少。
- 接口要小(Small Interfaces):两模块间通信,应交换尽可能少的信息。
- 接口要明确(Explicit Interfaces)
- 信息隐蔽(Information Hiding):模块应通过public接口与外界交互,其余信息/属性私有,对外隐蔽。
软件复用性
- 为什么要复用:1. “懒惰”;2. 提高生产效率;3. 改善质量;
- 复用什么:人;设计/规约;设计模式/体系结构/应用框架;源码级复用;封装模块(抽象描述);
- 障碍:
- 非技术问题:心理;短期利益;构件检索;构件发布与商业模型;
- 技术问题:通常不能一成不变进行复用;软件开放性要求和封闭性要求间的冲突;
- 传统复用技术:
- 过程Routine(eg.函数库):抽象不足,可拓展性、可复用性差;
- 包Package:类型、模块分离,复用性不足;
面向对象方法
在软件模块化和复用性方面:
- 传统技术存在不足。
- 面向对象模型提供了较好的解决方案。
- 基本思想:
- 任何事物都是对象,对象有属性和方法。复杂对象可由相对简单的对象以某种方式构成。
- 通过类比发现对象间的相似性,即对象间的共同属性,是构成对象类的依据。
- 对象间的相互联系是通过传递“消息”来完成的。通过对象之间的消息通信驱动对象执行一系列的操作从而完成某一任务。
- 基本概念:
- 对象:对象是运行期的基本实体。
- 类:类是具有相同类型的对象的抽象。
- 动态绑定;消息传递;
- 特性:
- 封装性:将数据和方法捆绑到一起;
- 继承性:让某个类型的对象获得另一个类型的对象的特征;
- 多态性:不同内部结构的对象可以共享相同的外部接口;
- 优势:模块化,信息隐藏与抽象;自然性;并发性;重用性;