9到12章章节总结
面向对象方法学引论
1.面向对象方法学概述
-
1.OOM的要点
- 1.用对象分解取代了功能分解
- 2.把所有对象都划分成类,并未每个类定义了一组数据和一组方法
- 3.按照子类与父类的关系把若干个对象组成一个层次结构的系统,又称继承
- 4.对象彼此之间仅能通过传递消息互相联系
- 5.00 = object + classes + inheritance + communication with messages
-
2.OOM的优点
- 1.与人类习惯的思维方法一致
- 2.稳定性好
- 3.可重用性好
- 4.较易开发大型软件产品
- 5.可维护性好
2.面向对象打概念
-
1.对象
-
1.对象的形象表示
-
2.对象的定义
- 1.对象是具有相同状态的一组操作的集合
- 2.对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力,即:对象是属性值和操作的封装
- 3.对象 = ID + MS +DS + MI
-
3.对象的特点
- 1.以数据为中心
- 2.对象是主动的
- 3.实现了数据封装
- 4.本质上具有并行性
- 5.模块独立性好
-
-
2.其他概念
-
1.类是对具有相同属性和行为的一个或多个对象的描述
-
2.实例是由某个特定的类所描述的一个具体的对象
-
3.消息就是要求某个对象执行在定义他的那个类中所定义的某个规格说明
-
4.方法就是对象所能执行的操作
-
5.属性类中定义的数据,是对客观上界实体所具有的性质的抽象
-
6.封装就是信息隐藏,对外界隐藏了对象的实现细节
-
7.继承是指能够直接获得已有的性质和特征而不必重复定义它们
-
8.多态性指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象
-
9.重载
- 1.函数重载:是指在同一个作用域内的若干个参数特征不同的函数可以使用相同的函数名字
- 2.运算符重载:是指同一个运算符可以施加与不同类型的操作数上面
-
3.面向对象建模
- 0.所谓模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述
- 1.面向的对象分析中,构造出完全独立于实现的应用域模型
- 2.面向对象设计中,把求解域的结构逐渐加入到模型中
- 3.在实现阶段,把应用域和求解域的结构都编程抽象代码并进行严格的测试验证
4.对象模型
-
0.对象模型表示静态,结构化的系统的“数据”性质,它是模拟客观世界的对象以及对象彼此间的关系的映射,描绘了系统 的静态结构。通常使用UML的类图来建立对象模型
-
1.类图的基本符号
-
1.定义类 长方形 :名字,属性和服务
-
2.定义属性
-
1.可见性
- public(+)
- private(-)
- protected(#)
-
2.属性名和类型名之间用冒号(:)分隔
-
3.类型名与初值用户等号(=)分隔
-
-
定义服务
-
-
2.表示关系符号 page218
-
1.关联 直线连接
- 1.普通关联
- 2.关联的角色
- 3.限定关联
- 4.关联类
-
2.聚类 整体与部分的关系
- 1.共享聚集:处于部分方的对象可以同时参与多个整体方对象的构造,直线加空心菱形,菱形靠近整体类
- 2.组合聚类(又称组合):部分完全隶属于整体类,部分与整体不存在了部分也会随着消失,直线加实心菱形,菱形靠近整体类
-
3.泛化(继承)直线加空心三角,三角靠近父类
- 1.普通泛化
- 2.受限泛化
-
4.依赖和细化
- 1.依赖关系:描述两个模型元素之间的语意连接关系,其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素,带箭头的虚线,箭头指向独立的类
- 2.细化关系:当对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系。符号为虚线加空心三角,三角指向被细化类
-
5.动态模型 由一组状态图组成
6.功能模型 由一组数据流图组成
-
1.用例图
-
1.系统
-
2.用例
-
3.行为者
-
4.用例之间的关系
- 扩展关系
- 使用关系
-
-
2.用例建模
- 1.寻找行为者
- 2.寻找用例
7.三种模型之间的关系
- 1.针对每个建立的动态模型,描述了类实例的生命周期和运行周期
- 2.状态转换驱使行为发生,这些行为在数据流图中被映射成处理,在用例图中被映射成用例,它们同时与类图中的服务相对应
- 3.功能模型中的处理(或用例)对应于对象模型中的类所提供的服务
- 4.数据流图的数据存储,以及数据的源点/终点,通常是对象模型中的对象
- 5.数据流图中的数据流,往往是对象模型中对象的属性值,也可能是整个对象
- 6.用例图中的行为者,可能是对象模型中的对象
- 7.功能模型中的处理(或用例)可能产生动态模型中的事件
- 8.对象模型描述了数据流图中的数据流,数据存储以及数据源点/终点的结构
分支主题 8
面向对象分析
0。概述
- 1.得出的最重要的文档资料是软件需求规格说明(在OOA中,主要由对象模型,动态模型,功能模型组成
- 2.关键是识别出问题域内的类和对象,并分析它们相互的关系,最终建立起问题的简洁,精确,可理解的正确模型
- 3.对象模型是最基本、最重要、最核心的
1.OOA的基本过程
-
1.概述
-
2.3个子模型与5个层次
-
3个子模型
- 静态结构(对象模型)
- 交互次序(动态模型)
- 数据变换(功能模型)
-
5个层次
- 主层次
- 类与对象层
- 结构层
- 属性层
- 服务层
-
2.需求陈述
- 1.书写要点:应该阐明“做什么”而不是“怎么做”
- 例子在page234
3.建立对象模型
-
0.典型步骤
- 1.确定对象类和关联,对于大型复杂问题还要进一步划分出若干个主题
- 2.给类和关联添加属性,以进一步描述它们
- 3.接下来利用适当的继承关系,进一步合并和组织类
-
1.确定类与对象
-
1.找出候选的类和对象
- 1.可感知的物理实体
- 2.人或组织的角色
- 3.应该记忆的事件
- 4.两个或多个对象的相互作用
- 5.需要说明的概念
-
2.筛选出正确的类与对象
- 1.冗余
- 2.无关
- 3.笼统
- 4.属性
- 5.操作
- 6.实现
-
-
2.确定关联
-
1.初步确定关联:在需求陈述中使用的描述动作或动词词组,通常表述关联关系
-
2.筛选
- 1.已删去的类之间的关联
- 2.与问题无关的或应在实现阶段考虑的关联
- 3.限时事件
- 4.三元关联
- 5.派生关联
-
3.进一步完善
- 1.正名
- 2.分解
- 3.补充
- 4.表明重数
-
-
3.划分主题:应该用问题域而不是功能分解方法来确定主题
-
4.确定属性
-
1.分析
-
2.选择删去不正确的或不必要的属性
- 1.误把对象当作属性
- 2.误把关联类的属性当作一般对象的属性
- 3.误把限定当成属性
- 4.误把内部状态当成属性
- 5.过于细化
- 6.存在不一致的属性
-
-
5.识别继承关系
- 1.自底向上:抽象出现有类的同性质泛化出父类,实际上模拟了人类归纳思维过程
- 2.自顶向上:把现有类细化成更绨的子类,这模拟了人类的演绎思维过程
-
6.反复修改
4.建立动态模型
-
0.建立共同模型的步骤
- 1.编写典型交互行为的脚本
- 2.从脚本中提取事件,确定出发每个事件的动作对象以及接受事件的目标对象
- 3.排列事件发生的次序,确定每个对象可能有的状态以及状态间的转换关系,并用状态图描绘它们
-
1.编写脚本
- 1.脚本是指在某一执行期间内出现的一系列事件
- 2.目的是保证不遗漏重要的交互步骤,有助于确保整个交互过程的正确性和清晰性
-
2.设想用户界面
-
3.画事件跟踪图
- 1.确定事件
- 2.画出事件跟踪图,类似于UML顺序图
-
4.画状态图:状态图描绘事件与对象状态的关系
-
5.审查动态模型
5.建立功能模型
- 1.画出基本系统模型图:由若干个数据源点/终点及一个处理框组成
- 2.画出功能级数据流图:将基本系统模型中的处理框分解成若干个处理框,以描绘加工,变换数据的基本功能
6.定义服务
- 1.常规行为
- 2.从事件导出的操作
- 3.与数据流图中处理框对应的操作
- 4.利用继承减少冗余操作
面向对象设计
0.概述
-
1.分析是提取和整理用户需求,并建立问题域精确模型的过程
-
2.设计是把分析阶段得到的需求转变成符合成本的质量要求的,抽象的系统实现方案的过程
-
3.OOD就是用面向对象观点建立求解域模型的过程
-
4.细分
- 1.系统设计:确定实现系统的策略和目标系统的高层结构
- 2.对象设计:确定解空间中类,关联,接口形式及实现服务的算法
1.OOD的准则
-
1.模块:对象即为模块
-
2.抽象:过程抽象,数据抽象,参数化抽象
-
3.信息隐藏:封装
-
4.弱耦合
-
1.交互耦合
- 1.尽量降低消息连接的复杂程度
- 2.减少对象发送(或)接受的消息数
-
2.继承耦合
-
-
5.强内聚
- 1.服务内聚:一个服务应该完成且完成一个功能
- 2.类内聚:一个类只有一个用途,它的属性和服务应该是高内聚的
- 3.一般-特殊内聚:是对应的领域知识的正确抽取
-
6.可重用
- 1.尽量使用已有的类
- 2.如果确实需要创建新类,则在设计这些新的协议时,应该考虑将来的可重复使用性
2.启发规则
-
1.设计结果清晰易懂
- 1.用词一致
- 2.使用已有的协议
- 3.减少消息模式的数量
- 4.避免模糊的定义
-
2.一般-特殊结构的深度应适当
-
3.设计简单的类
- 1.避免包含过多的属性
- 2.有明确的定义
- 3.尽量简化对象之间的合作关系
- 4.不要提供太多服务
-
4.使用简单的协议
-
5.使用简单的服务
-
6.把设计变动减至最少
3.软件重用
-
1.概述
-
1.重用
- 1.知识重用
- 2.方法和标注的重用
- 3.软件成分的重用
-
2.软件成分的重用级别
- 1.代码重用
- 2.设计结果重用
- 3.分析结果重用
-
3.典型的可重用软件成分
- 1.项目计划
- 2.成分估计
- 3.体系结构
- 4.需求模型和规格说明书
- 5.设计
- 6.源代码
- 7.用户文档和技术文档
- 8.用户界面
- 9.数据
- 10.测试用例
-
-
2.类构件
-
1.可重用软件应具备的特点
- 1.模块独立性强
- 2.具有高度可塑性
- 3.接口清晰,简明,可靠
-
2.类构件的重用方法
- 1.实例重用
- 2.继承重用
- 3.多态重用
-
-
3.软件重用的效益
- 1.提高质量
- 2.提高生产率
- 3.减低成本
4.系统分解
-
1.子系统之间的两种交互方式
- 1.客户–供应商
- 2.平等伙伴
-
2.组织系统的两种方法
-
1.水平层次组织
- 1.封闭式:每层子系统仅仅使用其直接下层提高的服务
- 2.开放式:某层子系统可以使用处于其下面的任一子系统所提供的服务,不符合信息隐藏原则
-
2.垂直块组织
-
-
3.设计系统的扩普结果
5.设计问题域子系统
-
1.调整需求的情况
- 1.用户需求或外部环境发生了变化
- 2.分析员对问题域不透彻或缺乏领域专家帮助,以致面向对象分析模型不完整,准确地反映用户的真实需求
-
2.重用已有的类
- 1.旋转有可能被重用的已有类,标出这些候选类中对本问题无用的属性和服务,尽量重用那些能使无用的属性和服务降低到最低程度的类
- 2.在被重用的已有类和问题域之间添加泛化关系
- 3.标出问题域中从已有类继承来的属性和服务
- 4.修改与问题域类相关的关联,必要时修改为与被重用的已有相关的关联
-
3.把问题域类组合在一起
-
4.增添一般泛化类以建议协议
-
5.调整继承层次
- 1.多重继承
- 2.单重继承
6.设计人机交互子系统
- 1.分类用户
- 2.描述用户
- 3.设计命令层次
- 4.设计人机交互类
7.设计任务管理子系统
-
1.分析并发性
-
2.设计任务管理子系统
- 1.确定事件驱动型任务
- 2.确定时钟驱动型任务
- 3.确定优先任务
- 4.确定关键任务
- 5.确定协调任务
- 6.尽量减少任务数
- 7.确定资源需求
8.设计数据管理子系统
-
1.旋转数据存储管理模式
- 1.文件管理系统
- 2.关系数据库管理系统
- 3.面向对象数据库管理系统
-
2.设计数据管理子系统
-
1.设计数据格式
- 1.文件系统
- 2.关系数据库系统
- 3.面向对象数据库管理系统
-
2.设计相应的服务
- 1.文件系统
- 2.关系数据库
- 3.面向对象数据库管理系统
-
9.设计类中的服务
-
1.确定类中应由的服务
-
2.设计实现服务的方法
- 1.设计实现服务的算法
- 2.选择数据结构
- 3.算法与数据结构的关系
- 4.定义内部类和内部操作
10.设计关联
- 1.关联的遍历
- 2.实现单向关联
- 3.实现双向关联
- 4.关联对象的实现
11.设计优化
-
1.确定优先级
-
2.提高效率的几项技术
- 1.增加冗余关联以提高访问效率
- 2.调整查询次序
- 3.保留派生属性
-
3.调整继承关系
- 1.抽象与具体
- 2.为提高继承程度而修改类定义
- 3.利用委托实现行为共享
面向对象实现
0.概述
- 1.把面向对象设计结果翻译成某种程序语言书面的面向对象程序
- 2.测试并调用面向对象的程序
1.程序设计语言
-
1.面向电源线语言的优点
- 1.一致的表示方法
- 2.可重用性
- 3.可维护性
-
2.面向对象语言的技术特点
- 1.支持类与对象概念的机制
- 2.实现整体-部分(聚集)结构的机制
- 3.实现一般-特殊(泛化)结构的机制
- 4.实现属性和服务的机制
- 5.类型检查
- 6.类库
- 7.效率
- 8.持久保持
- 9.参数化类
- 10.开发环境
-
3.选择面向对象语言
- 1.将来能否占主导地位
- 2.可重用性
- 3.类库和开发环境
2.程序设计风格
-
1.提高可重用性
-
1.提高方法的内聚
-
2.减小方法的规模
-
3.保持方法的一致性
-
4.把策略与实现分开
-
5.全面覆盖
-
6.尽量不使用全局信息
-
7.利用继承机制
- 1.调用子过程
- 2.分解因子
- 3.使用委托
- 4.把代码封装在类中
-
-
2.提高可扩充性
- 1.封装实现策略
- 2.不要用一个方法遍历多条关联链
- 3.避免使用多分支语句
- 4.精心确定共有方法
-
3.奇高健壮性
- 1.预防用户的操作错误
- 2.检查参数的合法性
- 3.不要预先确定限制条件
- 4.先预测后优化
3.测试策略
- 1.面向对象的单元测试
- 2.面向对象的集成测试
- 3.面向对象的确认测试
4.设计测试用例
-
1.测试类的方法
- 1.随机测试
- 2.划分测试:状态、属性、功能
- 3.基于故障的测试
-
2.继承测试方法
- 1.多类测试
- 2.从动态模型导出测试用例