当前课程知识点:软件工程 > 第9章 面向对象分析与设计 > 9.1 面向对象分析 > 讲课视频
各位同学好
我是刘璘
这一节我来给大家介绍
面相对象分析有关的内容
当你看到图中的这幅图片的时候
你看到的是什么
对 这是在德国Dagstuhl
用于召开计算机方面
相关研讨会的
Dagstuhl城堡
但是
也许在一个面向
对象程序员的眼里
他看到的就会是另外一番景象
他看到的会是一个又一个
对外提供服务的对象
比如水池成了流体输入接口
门成了室内活动触发器
而窗子则成了访客监控接口
窗帘成为了隐私保护代理
走到室内
我们的面向对象的程序员
看到的
也同样是一个充满了对象的世界
比如椅子
成了臀部支撑服务代理
墙上的装饰画
成了空间分隔对象装饰器
果盘成了食品占存容器
火警监控器
成了安全服务监控代理
吊灯成了提供照明服务的
对象组合
通过这样的一个小小的比喻
大家应该可能看到
用面向对象的视角来看待世界
我们就把世界看成了是
一个一个彼此独立
又相互联系的对象实体
面向对象分析
是一种软件系统的
需求建模与分析技术
它是在上个世纪
八十年代末九十年代初提出
受到面向对象的程序设计
语义网络
和带语义的数据模型的影响
它的基本的观点
就是采用对象 类
方法等原子概念
在需求分析 设计与实现之间
建立自然的映射关系
面向对象的分析技术
关注运用领域中的实体
并将其建模为对象
面向对象分析技术
主要要基于分类 泛化 聚合关系
在对象的集合之间
建立某种层次结构
而对象的行为
就是执行预定的动作
有时候也称为服务或者活动
对象通过执行这些动作
来完成它自身状态的迁移
面向对向分析的思路
主要来源于四个方面
首先就是面向对象
程序设计中的概念
将面向对象程序设计中的概念
上推到分析和设计阶段
会使得各个阶段之间的转换
变得更为平滑
此外 面向对象分析
还从数据库设计中
汲取了主要的数据建模方法
ER图中的主要概念
其中的实体 关系 泛化
聚合和分类
用于系统中对象的建模和分析
在面向对象之前
主要的软件范型
就是结构化的分析方法
结构化分析方法
强调分而治之
将大的系统分解为
更小的子系统
单独完成独立的功能
这种思路在面向对象中
也有所体现
在人工智能 知识工程中
知识表示方法也对面向对象的
概念建模
提供了很好的借鉴的语义表示
主要是基于问题框架
和语义网络的知识表示方法
它对于刻画对象之间关系
有着很好的借鉴意义
在面向对象分析方法
全盛的时代
曾经有过50余种
面向对象的分析方法
同时存在
这其中影响最深远的要属
Peter Coad
和Yourdon 的方法
在Peter Coad的方法中
他提出对象是问题领域中
真实存在的实体
有着清晰定义的对象边界
这是什么意思
就是说
一个对象
给定的对象
我们能够清晰地知道 判断出
它是不是属于我们所定义的
这种类型的对象
也就是说
类型的区分是很明显的
那要想作出这样明显的区分
我们主要靠什么
靠的就是对象中封装的属性
和它的行为
因此面向对象的分析的
核心概念就是
对象 属性和行为
其中 行为我们用服务来定义
这个也和后来产生的
在2000年代比较流行的
面向服务的计算方法
实际上就是更强调
服务的这个角度
和对象是同一个问题的
不同的角度而已
在面向对象的分析中
除了对象属性
和服务这三个概念以外
另外两个概念
一个是结构 一个是主题
那我们先来看看
面向对象分析中
都支持哪些结构
首先就是用于表达
继承关系的一般特殊结构
一般特殊结构
将类组织成基于继承关系的
分层次的一个结构
自底向上
就是从特殊的类到一般的类
一般的类也称为父类
或者是基类
特别的类就是父类的子类
自顶向下
就是从一般到特殊
我们先有抽象的
具有公共属性的类
然后再把它特化为
更具体的
属性定义更具有特殊性的这样的类
如图中的这个类图
我们看到
患者可以分为两个特殊的类
一类是住院患者
一类是门诊患者
住院患者和门诊患者
他们有一个公共的属性
就是他们都要有一个医生
为他负责
我们要在患者的属性中添加
他所负责任的医生的名字
而在住院患者中
他有两个特殊的属性
就是住院患者
他是有相应的病房号和病床号的
而门诊患者
我们只是记录他的
上一次诊疗的时间
和相关的诊疗记录
以及下一次的预约的时间
所以我们可以看到
通过类结构
我们就能把类之间的公共的属性
提取出来
放到父类和奇类中去
而那些所属于这个类的
独特的一些属性
则放到特定的这个类
自身来定义
这样我们就可以更好的支持重用
除了一般特殊结构
在面向对相的分析中
另一个主要的结构就是
整体部分结构
整个部分结构用于描述
对象之间的组合关系
比如一个交通灯对象
是由零到三个灯组
以及支撑杆和位置组成的
我们说这样的结构就是一个
整体部分结构
它表明了一个整体的对象
是由哪些更小的
部分的对象组合而成
在面向对相的这种方法学中
它所倡导的
这一种分而治之的世界观
就仿佛是把世界切碎了
每一个碎片都是一个
独立的对象
但是对象之间
并非老死不相往来
每个对象
它存在于这个环境中
就要为他周遭的其他对象
提供服务
比如医生对象
对外提供的服务是体检
出体检报告等等
在Coad的OOA方法中
它把对象的
能够对外提供的服务
抽象成了三种类型
而这种三种类型的服务
仍然是我们目前的软件系统
最流行 最常见的服务
首先是瞬时服务
这类服务
它是用事件发生的这样的形式
提供出来的
比如创建一个新对象
终止一个旧的对象
修改某个对象的某些属性等等
它都是瞬时完成的
做一个动作之后
服务过程就结束了
另外一类服务就是计算服务
这也是计算机软件
能够对外提供的主要服务之一
这类服务主要是为其他的对象
完成某些复杂的科学计算任务
当然也包括很简单的数学计算
最后一类是持续性的服务
通常就是监控类型的服务
这类服务它需要对象
持续地去监控某些业务流程
检查预设的条件是否得到满足
当预设的报经条件满足的时候
这些监控的服务
要采取一定的动作或者报警
或者发消息
或者切断某些服务等等
这类监控服务也是现在
最常见的服务类型
我们在类图中
用带箭头的虚线来表示一个对象
引用另外一个对象的服务
这里我们就可以看到
从面向对象到面向服务
其实是看待问题的
视角的一个切换
面向对象更强调在对象的内部
所封装的那些信息
所以它采用的是一些
信息建模的这样的角度
而面向服务
它更强调的是服务过程本身
强调的是功能
因此 我们可以看到
在信息系统或者软件系统中
对象和服务
是一个事物的两个方面
一个是静态的信息结构
一个是动态的操作流程
在这个系统的模型中
我们可以看到
一共有三个类被定义出来
首先是医生类
其次是住院病人
还有病例类
这三者之间
互相调用彼此的服务
来完成它们预期的功能
比如医生对外提供的服务
是体检和出体检报告
而住院病人他对外提供的
是看病和做体检
这里实际上看病和体检
是由这个病人发出的
要用到医生相应服务
才能完成的一个服务
因此我们可以看到
医生和住院病人
他们彼此使用对方的服务
来合作完成看病体检等
系统的功能
而病历作为一个实体对象
它主要是一个信息的载体
医生对象需要调用
病例对象的取数据服务
来访问他所关注的
患者的就诊记录
以及检查结果等等
在住院病人和病历之间的
这条实线
它表明的是
病例和祝住院病人之间
存在一个关联关系
住院病人
他都有对应的病例
通过上述的简单介绍
我们知道面向对象的分析方法学
最主要的任务
首先是识别对象和类
在领域中找出类和对象
给出它们的抽象的定义
识别类之间的关系
建立由继承和组合关系
组成的类层次结构
之后就是定义主题
主题是用来将对象模型
组织成多个抽象层次或视角的
这样的一个概念
主要是通过继承关系
或者整体部分关系
联系起来的一系列的类
通常都是属于同一个主题的
我们用主题来划分领域中的
关注的不同的点
识别每个对象内部的属性信息
并把它赋予到
相应的抽象层次的类
就是我们建模的重点之一
在定义了属性之后
我们再为每个对象类
去定义相应的公共的服务
这样
我们就完成了面向对象的
分析的主要的步骤
面向对象分析方法的
局限性在于
我们最初希望采用
面向对象的思路
能够更早的进入分析和设计环节
这一初衷
往往因为分析阶段的概念
和设计阶段的概念无法对齐
而无法实现
我们在面向对象分析中
所能够沉淀下来的
最有用的对象
就是对领域实体对象的建模
这些领域实体对象
可以在后续的系统设计和实现中
沉淀为一或多个实体对象的保存
这是在我们做面向对象分析中
最有用的部分
在面对一个具体的
现实世界的问题的时候
我们应该很好的评估
对象 关系 服务等概念
是建模我们现实问题的
业务流程的最好的元素与否
当判断为是的时候
我们就可以采用
面向对象的分析方法
当感觉不适用的时候
我们就要转换方法学
去采用最适用的方法
正如我刚刚说到的
大家在后续的学习过程中
其实还经常会看到
面向对象分析的
对同一件事物的不同的叫法
我给出了一个常用术语的对照表
让大家能够对它们之间的语义
有一个很好的认识
其中最主要的就是我们知道
对象和实例
它是指的同一个东西
一般特殊关系和继承关系
是同样的
以及泛化关系
这几个是同样含义的
组成关系和整体部分关系
聚合关系
它们又是具有语义上是可替代的
消息和刺激以及事件
这几者它代表的含义是类似的
服务和操作这二者之间
表达的是同样的含义
主题或者视角
这两者又是可以互相替换的
情景这里和用例的关系
是一个抽象定义的
模板和实例的关系
在前边用例学习的过程中
大家已经了解了
另外就是参与者的概念
在有的方法中
也把它叫做用户
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)