软件工程笔记5-面向对象设计
Published:
我觉得孩子都是不规则的图形,进入社会后,无数不规则的图形相互践踏,慢慢磨成了一个个圆。圆和圆的按触,只有一个点,这个点就是你最想展示的东西。大人们管这个点叫作优点,而你以为这就是成熟。
面向对象设计
面向对象设计过程和准则
面向对象设计过程
- 建立系统环境模型:展现软件与外部实体交互的方式
- 建立系统体系结构
- 对各个子系统进行设计
- 对象设计及优化
面向对象设计的准则:模块化,抽象,信息隐藏,弱耦合,强内聚,可复用
体系结构模块及依赖性
在面向对象软件中,常见软件模块有:类、接口、包、构件
类的依赖性
在面向对象的程序设计中,类和接口是程序的基本组成单元 在不同阶段或者从不同角度,类可以分为:设计类,实现类,系统类,应用类
继承依赖性:继承会带来类和方法的依赖性。
- 多态继承:编译时继承依赖性和运行时继承依赖性
- 无多态继承:子类不覆盖从父类继承来的方法
- 扩展继承和约束继承:
交互依赖性(方法依赖性),出现在如下情况:类A的方法fA调用了类B的方法fB,则fA依赖于fB
接口的依赖性
实现的依赖性:类和该类实现的接口之间的依赖性
使用的依赖性:类和它所需的接口之间的依赖性
包的依赖性
包是高度相关的类的聚合,这些类本身是内聚的,但相对于其他聚合来说又是松散耦合的
包依赖性:本质上,两个包之间的依赖性来自于两个包中类的依赖性,主要消除包之间的循环依赖
构件
构件:软件开发过程中可以重复使用的软件元素(是一个抽象的概念)
构建图表示构件之间的依赖关系,构件可以支持一些接口,并使用另一些接口
软件构件应该具有以下特性:
- 单独部署单元
- 作为第三方的组装单元
- 构件不能又任何可见的状态(构件不能与自己的拷贝又所区别)
构件与类是双重的:
- 构件是部署在某个计算机节点上的物理抽象
- 构件只显示它所包含的类的接口,很多其他接口都封装在构件中,它们智能被写作在类的内部使用,对于其他构件是不可见的
系统分解
- 子系统和类:首先根据需求的功能模型(用例模型),将系统分解为若干部分,每个部分又可以分为若干子系统或类,没饿过子系统还可以由更小的子系统或类构成
- 服务与子系统接口
- 服务:一组有公共目的的相关操作,子系统通过给其他子系统提供服务发挥自己的能力(子系统不需要其他子系统为他提供服务)
- 子系统接口:供其他子系统调用的某个子系统操作集合,包括子系统的接口包括操作名、操作参数类型及返回值
子系统被分层以建立系统的层次结构
封闭体系结构:系统每层只能访问其相邻的下一层
开放体系结构:层可以访问低于它的层次
问题域部分设计
数据库层,业务逻辑层,用户界面层 是典型的面向对象系统的组成
问题域部分(业务逻辑层)是 面向对象设计开始的地方
问题域部分设计的流程:
- 调整需求:用户需求或外部环境的变化;分析员对问题理解不透彻。
- 复用已有的类:从类库中选择已有类,在服用的类和问题域之间添加泛化关系,标出因服用类而多余的属性和服务;修改与问题相关的关联
- 把问题域类组合在一起
- 增添泛化关系以建立类之间的协议
- 调整继承的支持级别
- 改进性能
- 存储对象
人机交互部分的设计
界面设计的目标:简单性,一致性,确定性,健壮性,导航性,视觉吸引,兼容性
任务管理部分的设计
任务管理主要包括任务的选择和调整
常见的任务有:时间驱动型任务、时钟驱动型任务、优先任务、关键任务和协调任务
- 识别时间驱动任务:任务处于休眠状态并等待中断;一旦接到中断则唤醒该任务,接受数据;通知需要知道这件事的对象,执行任务后再回到睡眠模式
- 识别时钟型任务:以固定时间间隔激发事件
- 识别优先任务:根据处理的优先级安排各个任务
- 识别关键任务
- 识别协调任务
- 审查每个任务
- 定义每个任务:它是什么任务,如何协调任务,如何通信
数据管理部分的设计
继承关系的映射
策略1:将基类映射到一张子表,子类映射到另一张表,基类对应的表中定义主键,而在子类的定义的表中定义外键
策略2:将每个子类映射到一个表,没有基类表
对象设计
对象设计过程包括:使用模式设计对象,接口规格说明,对象模型重构,对象模型优化。
- 使用模式设计对象:选择合适的设计模式,复用已有的解决方案,以提高系统的灵活性
- 接口规格说明:子系统供功能需要在类中详细说明,包括操作,参数,类型规格说明和异常情况等
- 对象模型重构,改进对象设计模型,提高模型等可读性和拓展性
- 对象模型优化,改进对象设计模型,以实现模型中的性能要求
