当前课程知识点:软件工程 > 第9章 面向对象分析与设计 > 9.2 CRC卡片分拣法 > 讲课视频-2
这样我们筛选出来的
就剩下6个类
分子是牌 牌叠 手牌 庄家
玩家和赌注
从刚刚的过程我们可以看到
这里在CRC卡片分拣法里
类识别的方式
是从原始的文本资料中识别类
找出干系人提交给我们的
问题描述中的名词和名词短语
在名词和名词短语中
找出它描述的应用领域中
信息的结构或者本质
把它加入到我们考虑的范围中来
除了用这种方式以外
我们还可以通过其它的来源
来识别出类的定义
比如相关背景信息
比如由用户和干系人直接提供
还比如我们知道
适用于当前场景下的
那些分析模式中已有的类
在类识别过程中
我们要把握的一个原则是
要尽可能识别出多的侯选类
之后我们再按照一定的标准
对它的类的价值和用处进行分析
然后再筛选这些侯选的类
我们明确的作出了理性判断以后
把一个类排除在外
要比在第一版本中根本不考虑
来得更合理
识别出类以后
我们为每个类
分别分配一张卡片
下一步就是针对每个类
来识别它的功能职责
由于功能职责总是关乎
这个类的对象相关的行为和动作
下一步我们就是要问题描述中
扫描相关的动词短语
在这里需要注意的是
并不是每一个动词
都会成为类的职责
我们要找出那些
对我们关注的刚刚找出的
这些侯选类相关的那些动词
有的时候多个具体的动作
还可以合并为一个职责
随着我们对这个问题
分析过程的深入
我们还会发现新的职责
因此 无论是类的定义
还是职责的定义
都是一个不断修正和提升的过程
是要有反复的
当我们发现
两个类是在合作完成
同一个职责的时候
我们会为二者同时添加该职责
从这一页的描述中
我们过滤出来的是
赌注 上限 底牌 名牌
在这一页中我们没有发现
新的名词
因此我们就继续后边的过程
对问题描述进行扫描
可以获得比较精确的
侯选类的识别
但是在识别类的功能的时候
我们会发现
问题描述本身只能给我们一些
重要的启示
很多过程也是需要我们透过字面
来发现出来 抽取出来的
比如对于牌
我们会知道
我们需要知道牌面的数字是什么
花色是什么
对应花色的点数是什么
而要知道点数
我们首先要知道
它是数字牌 还是A J Q K
因此 这里头蕴含的
不仅仅是字面
能够识别出来的动词
还有我们对整个问题的
深入的理解
在识别出侯选类对应的
功能职责之后
我们将进入下一步
就是在这些对应的功能职责中
找出哪些侯选类之间
是要存在交互协作关系
共同完成某些过程和功能的
我们前边已经学过了UML用例图
在识别了侯选类的职责之后
我们就是要识别类
类对象之间的交互协作关系
这里我们就可以采用
类似UML用例图的方法
将交互着的类找出来
但是我们要知道
目的并不是为了写出所有的
应用场景
而是为了
进一步对类和刚刚的职责定义
进行精化
这里我们给出的是一个
21点游戏进行过程中
庄家和玩家的交互情景的例子
通过对这个例子的分析
我们可以进一步完善
庄家 玩家和手牌的职责定义
比如庄家首先洗牌
玩家下注
庄家发第一张牌
玩家拿牌
庄家给自己发牌
手牌返回庄家手牌的点数
庄家发第二张牌
庄家询问玩家是否需要继续要牌
玩家根据自己手中的点数
决定是否继续要牌
并根据点数确定何时停止
当计算出最终的点数之后
玩家根据需要
决定是否要增加还是减少赌注
最终
玩家亮牌 庄家亮牌
并根据输赢
来分配最终的赌金
通过这个情景的分析
我们识别出了
以下的交互关系
首先 就是应用
庄家 玩家 手牌
它们各自向彼此发送了
什么样的消息
通过对这个交互关系的识别
可以得到最终的CRC卡片
也就是如图中所示的
首先我们得到纸牌这个类
CARD它的功能职责是
它既要知道它的牌是什么
又要知道它的点数是什么
与纸牌交互的类包括牌叠
而跟牌叠交互的类
包括庄家和手牌
而牌叠最主要的功能就是
重新洗牌
牌叠的牌的张数
拿到牌叠的下一张牌
以及显示当前的牌叠在屏幕上
这是庄家的职责
首先庄家要决定何时开启下一轮
还要在牌叠中取一张卡
和它交互的包括手牌
也就是庄家自身的手牌
和玩家以及牌叠
玩家的功能职责包括
要牌 拿到下一张牌
亮牌以及计算手牌的点数
和它交互的类包括
庄家和手牌
而手牌本身
它既和庄家交互也和玩家交互
它的主要职责就是
返回当前牌的点数
在手牌中增加一张底牌
以及亮牌
我们通过这样的初步分析
就得到了第一张UML类图
这里我们既得到了
当前的类的定义
也得到了类的一部分属性
以及相关活动的定义
它的相关操作
主要来自刚刚的交互过程
也就是所谓的功能职责
而它的属性
就是在功能职责的过程中
要用到的那些属性
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)