面向对象设计之CRC卡片

1.什么是 CRC card?

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

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

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

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

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

clip_image002

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. 写出最关键的职责和交互方式,关键交互方工要画出交互图。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

川藏线徒搭

http://www.mafengwo.cn/i/6296156.html

删数问题

Problem Description 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。Input 输入有多组…

面试70问 经典回答

http://group.cnblogs.com/topic/37628.html

Mybatis整合spring

整合思路 1、SqlSessionFactory对象应该放到spring容器中作为单例存在。 2、传统dao的开发方式中,应该从spring容器中获得sqlsession对象。 3、Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。 4、数据库的连接以及数据库连接池事务…

最少拦截系统

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹…

云计算的理解

原文:http://www.chinacloud.cn/show.aspx?id15917&cid17 老叟发现,即使是一些搞计算机的人,也不了解“云”是什么。于是,俺卖车之余就写了一篇科普: 到底什么是云(云计算) 有很多关于云的介绍。然而,…

什么是Springmvc以及如果编写第一个入门程序

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图: Springmvc处理流程 入门程序 创建web工程 springMVC是表现层框架,需要搭建web工程开发。 如下图创建动态web工程: 输入…

迷瘴

Problem Description 通过悬崖的yifenfei,又面临着幽谷的考验—— 幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅。由于此处长年不见天日,导致空气中布满了毒素,一旦吸入体内,便会全身溃烂而死。幸好y…

驳斥《沙盒用于数据防泄密是重大技术原理性失误》

http://blog.ifeng.com/article/30786929.html 最近网上出现了一篇名为《沙盒用于数据防泄密是重大技术原理性失误》的文章,经作者鉴定,是某不良公司攻击技术领先的竞争对手苏州深信达公司的软文。该公司为何主动公开攻击竞争对手,可能和最近…

windows驱动开发学习

序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概也就3~4年时间.大多数人都认为会驱动开发的都是牛人,高手之类的.其实高…

Springmvc架构详解

框架结构 框架结构如下图: 架构流程 1、 用户发送请求至前端控制器DispatcherServlet 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一…

区间覆盖问题

用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。 现在要求画m条线段覆盖住所有的区间,条件是:每条线段可以任意长,但是要求所…

Windows驱动开发如何入门

http://blog.csdn.net/charlessimonyi/article/details/50904854 http://blog.csdn.net/charlessimonyi/article/details/50904956

springmvc整合mybatis之准备阶段与文件配置

文章出处:课程资料 web.xml等配置文件的解释:打开博客 为了更好的学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合。 整合目标:控制层采用springmvc、持久层使用mybatis实现。 步骤详解: …

悼念512汶川大地震遇难同胞

Problem Description 时间:2008年5月16日(震后第4天) 地点:汶川县牛脑寨人物:羌族老奶奶【转载整理】牛脑寨是一个全村600多人的羌族寨子,震后几天,这里依然能常常听到隆隆的声音,那…

Win10下VS2015(WDK10)驱动开发环境配置

1、 概述 微软在”WDK7600“以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VisualStudio,然后再从微软官网下载集成的WDK开发包、或者离线安装包,但是安装后Visual Studio就集驱动程序开发,编译&…

懒虫小鑫

roblem Description 小鑫是个大懒虫,但是这一天妈妈要小鑫去山上搬些矿石去城里卖以补贴家用。小鑫十分的不开心。不开心归不开心,小鑫还是要做这件事情的。我们把这个事情简化一下。有n块矿石,设第i块矿石由两个数字wi和pi表示。分别表示这块…

springmvc与mybatis整合之实现商品列表

需求 实现商品查询列表&#xff0c;从mysql数据库查询商 品信息。. DAO开发 使用逆向工程&#xff0c;生成代码 注意修改逆向工程的配置文件 ItemService接口 public interface ItemService {/*** 查询商品列表* * return*/List<Item> queryItemList();}. ItemServi…

中断处理程序与中断服务例程

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 1 什么是中断2中断处理程序3中断服务例程4request_irq函数分析 1. 什么是中断 简单来说中断就是硬件设备与处理器的一种交流方式&#xff0c;比如当我按下一个键时&#xff0c;只有当处…

Windows驱动程序开发语言

Windows驱动程序和Win32应用程序一样&#xff0c;都是PE格式&#xff0c;所以说&#xff0c;只要某种语言的编译器能够编译出PE格式的二进制格式文件&#xff0c;并且能够设置驱动程序的入口地址&#xff0c;那么这种语言就可以用来开发Windows驱动程序&#xff0c;所以可以选择…