当前课程知识点:软件工程 > 第9章 面向对象分析与设计 > 9.2 CRC卡片分拣法 > 讲课视频-1
CRC卡片分拣法
是从文档中提取类定义的
最常用方法之一
通过CRC卡片分拣的过程
我们可以了解
类的识别和类的定义的内容
最主要的方面
我们寻找类
可以采用CRC卡片分拣法
可以在用例描述中
找出相应的名词候选类
也可以根据后边
我们在设计过程中
边界类 控制类 实体类型的划分
来发现系统中的类
设计和分析模式
也可以帮我们去补全
我们所遗漏掉的类
许许多多的方法但是最主要的是
我们要对待解决的问题
有一个充分的分析之后
把其中关键的信息实体寻找出来
我们就从一个例子说起
假定我们要编写一个
21点游戏的程序
这个时候客户来到你面前
交给你一份详细的问题描述
也就是一份21点
游戏的规则说明
那么在我们开始设计
这个系统之前
我们先要看看
在这个游戏的过程中
有哪些关键的类
这些类的职责是什么
类与类之间的交互行为是什么
21点游戏的目标
是玩家要获得点数
最接近或者等于21的手牌
他要赢过庄家手牌的点数
并且不能超过21点
无论桌上有几名玩家
玩家都只是和庄家之间论输赢的
在21点游戏中
2-10的数字牌
其点数就等于牌面数值
A的点数根据玩家的需要
可以选取1或者11
JQK的点数都是10
游戏的开始玩家首先下注
下注的额度
一般是有一个上限的
如果你是桌上唯一的玩家
在下注之后
庄家就会给你发两张牌
牌面向上
双方均能看到
庄家给自己发两张牌
一张牌面向下
一张牌面向上
向下的称为底牌 向上的是明牌
当有多个玩家的时候
庄家给每位玩家
都是先发一张明牌
给自己发一张底牌
再给每个玩家和庄家
各发一张明牌
发完前两张牌之后
每位玩家自己决定
是否还需要更多的牌
当对手上的牌数满意之后
就停手等待
停手之后庄家可以继续加牌
但是不能超过21点
当你的手牌点数
超过庄家时 你赢
当你的手牌点数不及庄家时
庄家赢
玩家赢的情况
包括你的手牌点数超过庄家
且不超过21点
庄家冒过21点
庄家和玩家点数持平的时候
不输不赢
庄家退还玩家的赌注
玩家输的情况就是
玩家抓冒了21点
CRC卡片分拣法
中间包括三个要素
第一个C代表的是类 Class
第二个R
代表的是Responsibilities
表示类的职责的定义
第三个字母C
代表的是Collaborations
表示的是
类与类之间的交互关系
CRC卡片
就是如图中这样的一个表格卡片
它把三个部分分别列出来
首先我们要提取的是类的定义
然后 再给当前定义的这个类
寻找它应该完成的职责
以及和它有交互关系的
其它的类
CRC卡片相当于是
把我们在问题描述中
得到的相关的类都能够找出来
并且定义它的职责
和类与类之间的交互关系
我们下面就来看一看
CRC卡片分拣法的过程
由于类对象
通常定义的是一个命名的实体
是用名词表达
因此 我们在分析文档的时候
就先从名词开始
在这个过程中
我们要注意的是
不要想一下子把所有的类
都找对
而是把所有可能的候选的类
都先提取出来
再逐一筛选
那么都有哪些东西
可以定义为对象
对象几乎是无处不在的
它可以是外部实体
和建模中的系统存在交互
无论他是人 设备
还是其它的系统
都可以定义为对象
它也可以是建模的应用领域中
存在的某种实体事物
比如报表 信号 文字输出等等
它还可以是一个动态的
发生的动作 事件
系统上下文中发生的资源的传递
控制命令的发出等等
只要是我们关注的那些活动
也可以作为对象来定义
在应用领域的组织上下文中
出现的由系统交互的
人扮演的那些角色
以及系统所管理的
相关的组织单元的分支机构
群组 团队
以及我们所关注的
要记录其属性的相关位置
地点等信息
以及在系统中我们要关注的
组合体
比如传感器 车辆 计算机等等
这些都可以用对象来封装
关注它的属性和行为
因此
把它定义为应用领域中的对象
那么不能定义为对象的事物
主要是两个方面
那就是在对象内部封装的
单一的属性或者是要把它归结为
某个对象的操作的那些过程
比如打印 转换等等
不把这些两者定义为对象
是因为它是对象的组成部分
下面我们就回到
刚刚给大家介绍的
21点游戏的问题描述中
过滤出我们认为关键的
那些主要的名词或者名词短语
比如对这段描述
我们过滤出的名词包括
手牌 庄家 玩家 数字牌 点数
A J Q K等
从这一页的描述中
我们过滤出来的是
赌注 上限 底牌 明牌
在这一页中
我们没有发现新的名词
因此 我们就继续后边的过程
用刚刚介绍的
扫描名词的方法
我们得到了这些对象类
游戏 21点 庄家 玩家 牌
牌堆 手牌 点数 花色 赢家
A 数字牌 J Q K 赌注等等
下面我们就要采用一定的方法
从这些候选位中
找出我们真正想要定义的
那些实体类
那么类筛选的原则是什么
首先 我们要在候选类中
排出以下的这些类
首先就是
超出问题关注的范围的那些类
指代整个系统的类
功能上有所重复的或者过于含混
过于具体的类
在刚刚的我们的列表中
很明显21点和游戏
都是指代整个系统的类过于庞大
没有实际的应用
因此 我们可以把它筛掉
J Q K A这些都是非常具体的类
因此 我们也可以把它筛掉
在筛掉的初步的一些无关类之后
我们可以去进一步的去问自己
这些问题
首先 关于剩下的这个类
我们的系统需要保存
它的相关信息
它是不是对外提供某些服务
它的是不是有多个属性
类的属性是不是
由它所有的实力对象所共享
操作 是不是也是
被它所有的实力对象共享
它是一个外部实体吗
我们要不要用到它的信息
通过这样的一些问答的思维方式
我们就可以得到
我们真正想要的那些系统类
好 经过刚刚的这样的
一个筛选过程
我们就得到了最后想要的这些类
我们筛选掉的包括
代表整个系统的游戏和21点
两个候选类
以及过于具体的
A K Q J 数字牌等等
这些过于具体的类
还有只有单个属性的这样的类
点数 花色 赢家等
其中花色
因为在21点游戏中
我们并不十分关注
因此
我们既可以把它建模为一个属性
也可以忽略掉
由此我们得到了剩下的六个
真正想要的候选实体类
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)