1.什么是 CRC card?

CRC (Class-Responsibility-Collaborator) Card是目前比较流行的面向对象分析建模方法。在CRC建模中,用户、设计者、开发人员都有参与,完成对整个面向对象工程的设计。

CRC卡是一个标准索引卡集合,包括三个部分:类名类的职责类的协作关系每一张卡片表示一个类

· 类 代表一系列对象的集合,这些对象是对系统设计的抽象建模,可以是一个人、一件物品等等,类名写在整个CRC卡的最上方

· 职责 包括这个类对自身信息的了解,以及这些信息将如何运用。诸如,一个人,他知道他的电话号码、地址、性别等属性,并且他知道他可以说话、行走的行为能力。这个部分在CRC卡的左边。

· 协作 指代另一个类,我们通过这个类获取我们想要的信息或者相关操作。这个部分在CRC卡的右边。

CRC卡片的背面往往记载着这个类的详细描述和在CEC设计中的一些注意事项。

2.如何使用CRC卡组织团队成员?

我们可以使用CRC卡完成设计团队成员的组织工作,但是需要限制在6人以下以提高效率,否则可能会增加沟通成本。我们的成员组成一般有以下三类,职责、人数建议、及其特征描述如下:

· 用户

o 人数:3-5

o 特征:

§ 丰富的行业知识

§ 清晰的业务流程

§ 逻辑思维和良好沟通

§ 对系统设计感兴趣

· OO设计人员

o 人数:1-2

o 特征:

§ 通晓CRC建模流程和方法

§ 通晓OO设计思路和方法

§ 有实际开发OO系统的经验

· 项目协调人

o 人数:1

o 特征:

§ 良好的会议沟通和管理技巧

§ 通晓CRC建模流程和方法

3.CRC分析流程

1)准备工作:

召集人员,拿到相关业务流程的需求——Statement of work,SOW工作陈述,从SOW中提炼出需求,以项目符号列表的形式表示每一个特定的需求。

2)CRC卡的建立:

a.类对应于名词,读完需求分析后,你可以划出一些名词作为类设计的切入点。当然,要习惯于迭代的方式,一开始列出的名词并不见得都要最终设计为一个类,而后续可能因为可用性等需要设计额外的类。

b.我们可以通过这个名词列表进行一一筛选分析,适当把握抽象与具体的关系,比如一个司机、一个秘书、一个经理可能都能抽象为人这个类,但是在第一轮迭代中,若无明显的需求,我们可以先暂时不用去考虑。对于普通的一般的关系,我们可以考虑超类的设计,也可以考虑通过构造函数重载完成。

c.在设计中,我们要注意目标之一是保证可扩展性,重构也是我们要考虑的一个隐性需求。

d.通过第一轮迭代我们就找出了我们需要关注的类。接着我们需要明确类的职责。职责的一个切入点是动词,从动词的列表中就可以得到职责初步列表,然后就行迭代。在这个过程中,并不是每一个动词都会成为一个职责,几个动词可能组成一个职责,最终选择的一些职责可能并没有出现在最初的职责中,对于共享的职责我们要特殊标识,以便在后续的详细设计中特殊处理(比如Java中的接口)。

e.在完成类的职责分析后我们开始根据这些职责及其交互关系明确协作关系,我们此时可以通过用例场景(系统对用户请求或事件作出响应时完成的一个事务或相关操作序列),对于每一个用例,明确交换的对象和消息。在这个过程中,参与的人可以通过角色扮演的方式,既活跃了气氛,又能在沟通交互中体现每一个类职责与协作。

f.完成CRC后就可以通过UML完成正式的初步设计了。


CRC,即Class Responsibility Collaboration,是一种用于设计面向对象软件过程中使用的交流工具和头脑风暴工具。典型的应用场合是首次确定设计中需要哪些类,及这些类如何交互。每个CRC卡上通常有以下几项:类名,父类和子类,本类的职责(responsibility),与本类交互的类型,本卡片的作者。

  使用小卡片,迫使设计人员对复杂的设计进行简单有效的描述。它会强迫设计者突出关键思路,阻止设计者在设计的早期过于关心细节的实现;另一方面,也可以阻止设计者为一个类型设计太多的职责。因为卡片的形式比较方便,设计过程中可以摊在一个桌面上,也可以用于向其他人展示设计中各个类的交互。

  为画出一个CRC卡片,通常的作法是从软件需要描述文档中找出名词和动词,并决定是否为每个名词设计一个类以及哪些动词是这些类的职责。自然,并不是每个名词都会成为软件中的一个类型,但这些通常是设计的起点。

  使用CRC的一般步骤:

  Step 1. 选择相关的用例(use case)

  Step 2. 按顺序画出与该用例有关的全部卡片。首先是触发这一用例的类型,其次是接受上一个类型消息的类。或者,把所有相关类型和他人的主要职责全部画出,放在桌面上。

  Step 3. 把所有的类型和职责全部审阅一遍,命名。

  按用例的描述,把CRC上的职责过一遍,给职责命名,并分清每个类型如何处理每项职责或委托给其他类型。

  如果是用CRC做头脑风暴的工具,随需要增加新的类型和功能,或是重新在现有的类型间划分职责。本步骤中,并不需要给类型和它们的方法命令,这些工作留到最后阶段完成。

  Step 4. 改变使用条件,对设计进行压力测试

  在审阅设计的过程中,试着逐个改变用例的假设条件,看是否会影响整个设计。在一个好的设计中,只需要增加一个类型或改动一个类型,就足以应付这些变化。也就是说,改变单个条件的情况下,这种改变可以隔离在一个小范围内。如果需要,增加一个新类型。

  并不是全部的卡片的都会进入最后的设计中,一些卡片会因为用途不多而被边缘化,不会成为最终设计的一部分。

  Step 5. 增减卡片,完善设计

  使用CRC卡片可以在桌面上同时展示多种设计,经过反复的修订,一个粗糙的设计可以演变成一个精致的设计,都最终的设计非常小巧。在修订的过程中,不要扔掉卡片,随着对问题的认识,有可能会用到这些卡片

  Step 6. 写出最关键的职责和交互方式,关键交互方工要画出交互图。

面向对象设计之CRC卡片相关推荐

  1. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  2. 卡片使用_APP必备的设计元素!卡片

    文/闫文喆 卡片是承载信息的容器,卡片可以承载不同类型的内容,其元素可以包含:图片.文字.视频.按钮.优惠券.音乐.付款信息.注册表单.社交媒体流或分享.奖励信息.链接以及以上元素的任意组合. 卡片也 ...

  3. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  4. 面向对象设计领域的OCP原则

    一.OCP简介(OCP--Open-Closed Principle ): Software entities(classes,modules,functions,etc.) should be op ...

  5. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

  6. 数据结构与算法:04 C#面向对象设计 II

    04 C#面向对象设计 II 知识结构: 5.属性 例1:属性概念的引入(问题) public class Animal {public int Age;public double Weight;pu ...

  7. 数据结构与算法:03 C#面向对象设计 I

    03 C#面向对象设计 I 知识结构: 1.类与对象 类:用高级程序语言实现的一个ADT描述. 对象:通过类声明的变量. 2.封装 2.1 什么是封装 把类的内部隐藏起来以防止外部看到内部的实现过程. ...

  8. 02面向对象设计原则

    技术交流QQ群:1027579432,欢迎你的加入! 1.为什么需要面向对象设计 变化是复用的天敌!面向对象设计最大的优势在于抵御变化! 2.重新认识面向对象 理解隔离变化 从宏观层面上来看,面向对象 ...

  9. 面向对象设计原则之三:里氏替换原则

    里氏替换原则(Liskov Substitution Principle LSP)   里氏替换原则是面向对象设计的基本原则之一.任何基类可以出现的地方,子类一定可以出现.LSP是继承复用的基石,只有 ...

最新文章

  1. 今日头条算法原理(全文)【转】
  2. 最长上升子序列(Longest increasing subsequence)
  3. springmvc参数绑定
  4. cesium学习之环境搭建
  5. python股票交易模型_如何用Python建模GGM模型并对股票估值?
  6. mysql galera haproxy_安装配置Haproxy代理MySQL Galera集群
  7. android图片的缩放、圆角处理
  8. 【STL学习】优先级队列Priority Queue详解与C++编程实现
  9. kubelet配置cni插件_不到1分钟,从零完成k3s Kubeconfig配置
  10. GB28181系统设计(三)-进程通信让python获取共享内存数据
  11. html点击控制盒子左右移动,JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例...
  12. dll修改和EXCOPE
  13. git配置取消代理_「高手」如何优雅的解决 git 超时
  14. 【剑指offer】31、栈的压入和弹出序列
  15. 吉米多维奇例题——(7)
  16. 解决 大漠测试工具 “你的系统没有发现大漠插件”问题
  17. java映射和反射的理解
  18. 被称为“Google 最大黑科技”,开发谷歌大脑,这位 AI 掌门人到底有多牛?
  19. Ubuntu 16.04升级到Ubuntu 16.10的方法:
  20. 感觉本人对事待人处理不当。

热门文章

  1. 获取显示器的唯一编号_宝马奔驰才配拥有的HUD抬头显示器,买菜车也能无损安装!...
  2. lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现
  3. cad钣金展开插件_户外垃圾桶顶盖钣金拆分展开方法
  4. php memcached close,PHP连接Memcached安装及数据库操作
  5. .net 启动mysql数据库连接_[ASP.net教程]mysql数据库连接方式(.net)
  6. vue实现上下滑动翻页_vue 实现滚动到底部翻页效果(pc端)
  7. 2015计算机二级公共基础知识,2015年计算机二级公共基础知识考点测试题(8)
  8. python桌面翻译_Python实现桌面翻译工具【新手必学】
  9. html文字转语音代码,【JavaScript】实现文本转语音功能
  10. think python 2ed_Think Python 2ed 笔记(二)