如何使用CRC卡进行精心设计?

时间:2020-03-06 14:24:23  来源:igfitidea点击:

我一直想知道人们如何使用CRC(类责任协作)卡。我已经在书中阅读了有关它们的内容,在互联网上发现了模糊的信息,但从未真正掌握过。我认为某人应该制作一个YouTube视频,显示使用CRC卡的会话,因为我的一本书描述它很难用文字表达,因此应该"由已经掌握它的人教"。可悲的是,我周围没有人使用CRC卡,我想了解更多信息。

更新

任何显示人们正在用这种技术精巧制作的视频的链接都将受到赞赏。

解决方案

查阅消息来源肯特·贝克(Kent Beck),沃德·坎宁安(Ward Cunningham),听说过吗?

在我看来,使用它们而不引起混乱的最简单方法是在文件标头中写下一些小的CRC卡,如下所示:

///////////////////////
//* CRC CARD
//*  Class: UISliderEvent
//*  Responsability: Event that holds the value and id of a Slider's movement
//*  Collaborators: UISlider, UIEvent
//////////////////////

然后,每次需要添加功能时,请检查卡,并确保我们没有违反其中规定的任何合同。例如,突然之间取决于UIMouseEvent的对象,在Card上就不存在了,因此不可以包含它。

我会尽力回答。
因此,通常将CRC卡用于面向对象环境中的建模,以更好地了解必须开发的系统(但我想我们已经知道了)。
当我们在实际实施之前到达CRC卡时,CRC卡就在最后。达到该级别的不同步骤如下:

  • 起点是进行需求启发。建议在此尽早并持续地吸引客户(看看敏捷方法,即极限编程)。
  • 然后可以使用用例图(UML)或者用户故事(敏捷的极端编程方法)对需求进行建模。这里的关键问题是找到正确的相关对象。当然,这很大程度上取决于我们所在的域。如果我们采用"硬性"方式,则可以应用"名词提取"之类的技术。因此,我们可以解析规范文档并提取所有名词(包括复合名称和带有形容词的名词)。分析所有这些并丢弃不相关的。
  • 一旦有了正确的名词->对象,就可以开始创建CRC卡。那么,在CRC会话中做什么?主要任务是查找并分配我们(先前)找到的对象的职责,然后将这些对象放在小型索引卡(我们的CRC卡)上。 "职责"主要是特定对象的核心功能,而"协作"部分是实现某些功能所需的其他对象(这些是模型中不同对象之间的依赖关系)。分配职责的重点是,职责应以某种平衡的方式在整个系统中很好地分配。另一个非常重要的一点是避免对象之间的职责重复(这是CRC卡的作用)。 CRC会议应从集思广益会议开始,在开发人员之间进行积极讨论,并应在实际索引卡上直接进行。

希望我能以某种方式为我们提供帮助。

问候,
朱里

很难在SO答案中进行总结,但是我会尝试的。设计对象的挑战之一是在从整体角度思考与从单个对象角度思考之间取得平衡。我们需要整体透视图来完成计算,但是我们需要单个对象透视图才能有效地细分逻辑和数据。

保持这种平衡是CRC卡进入的地方。当它们坐在桌子上时,我们会整体看一下计算。但是,当我们拿起一张卡片时,从肢体的角度出发,从肢体的角度出发,我们会鼓励我们从一个物体的角度出发-我只用有限的资源来完成这一小部分的计算,我该如何完成呢?

随着时间的流逝,同时拥有这两种观点的能力似乎渗入了大脑。越来越少的东西写在卡片上。然后,这些卡为空白。过了一会儿,人们只是指出如果不愿意从堆栈中拿出一张空白卡,该卡将在哪里。最终,人们完全不需要卡片就能从思维方式中受益。但是,当与尚未掌握天平的人交谈时,拿出实物卡可能是一种有用的交流帮助。

我发现这些卡片的最大缺点是缺乏反馈。我们可以欺骗自己,弄清楚代码将如何生成。我建议仅在出现有趣的问题之前使用卡,转向测试/代码进行确认,然后再继续设计。

Ward和我在15年前左右制作了一段设计会议的视频,但我在任何地方都找不到在线视频,也没有副本。我不确定它在任何情况下都可用作教学工具。我不了解其他视频,但它们可能很有趣,尤其是当我们需要比较几种不同的设计师风格时。

我认为陈述"我周围的人谁都不知道使用CRC卡"几乎可以概括出CRC卡的开发状态。我认为,CRC卡是从传统的,计划驱动的开发向敏捷开发迈出的一步。世界在前进。我没有研究如何使用CRC卡,而是研究了TDD之类的技术,该技术可以将诸如UML和CRC卡之类的技术用作中间工件,但着重于代码,尤其是测试。这就是CRC卡的发明者所采取的方向,我建议我们也这样做。

Rebecca Wirfs-Brock和Alan McKean在2003年出版的《对象设计:角色,职责和协作》一书中详细讨论了CRC卡。他们确实强调了它与整个过程的不同之处,即这应该是一种非常触觉的体验,并且在试图充实设计/要求时,它使人们放松了绕过物理对象的想法。

该章的副标题建议使用卡是"探索性设计"阶段的一部分,因此它可能是在进行大量编码之前出现的,但是我认为没有理由我们不会在每次迭代中都继续使用它们。一个敏捷项目,并提醒自己我们想去的地方,并在有需要时进行复习(作为一个小组)。

我似乎记得,他们甚至建议在房间里传一个球,这样才允许那个有球的人讲话,所以也许与其说是CRC卡,还不如让每个人都在谈论房间的角色和职责重要的对象?

如果我们想阅读实际使用CRC卡的案例研究(当然还有Kent和Ward的原始论文),那么请阅读CRC卡书。