如何使用CRC卡精心设计?

时间:2008-09-19 02:07:23

标签: oop ooad crc-cards

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

更新

任何显示人们使用此技术进行阐述的视频链接都将受到赞赏。

6 个答案:

答案 0 :(得分:33)

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

保持这种平衡是CRC卡进入的地方。当他们坐在桌子上时,你可以看到整个计算。但是,当你拿起一张卡片时,你在物理上,动力学上鼓励采取那个对象的观点 - 我有这个计算的一小部分与有限的资源有关,我将如何完成它?

随着时间的推移,同时保持两种观点的能力似乎渗透到大脑中。越来越少写在卡上。然后卡片是空白的。过了一段时间,人们只是指出卡片的位置,如果他们打算从堆栈中取出一个空白的卡片。最终,人们可以在不需要卡片的情况下获得思维方式的好处。在与未掌握余额的人交谈时,拔出实力卡可能是一种有用的沟通协助。

我发现卡片的最大弱点是缺乏反馈。你可以欺骗自己如何编写代码。我建议只使用卡片直到出现一个有趣的问题,转向测试/代码进行确认,然后重新开始设计。

Ward和我在15年左右的时间制作了一个设计会议的视频,但我没有在任何地方找到它并且我没有副本。我不确定它在任何情况下都可以用作教学工具。我不知道其他视频,但它们可能很有趣,特别是如果你要比较几种不同的设计师风格。

答案 1 :(得分:13)

我会尽力给出答案。 因此,CRC卡通常用于在面向对象的环境中进行建模,以便更好地理解必须开发的系统(但我认为您已经知道了)。 当你在实际实施之前到达时,CRC卡就到了最后。达到该级别的不同步骤可能如下:

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

    的问候,
    树里

答案 2 :(得分:7)

the source - Kent Beck,Ward Cunningham,听说过他们吗?

答案 3 :(得分:7)

我认为你的声明“我在这里没有人知道谁使用CRC卡”几乎总结了开发中CRC卡的状态。在我看来,CRC卡是从传统的,计划驱动的开发到敏捷开发的一步。世界继续前进。我没有关注如何使用CRC卡,而是研究像TDD这样的技术,它们可以利用UML和CRC卡等技术作为中间工件,但更集中于代码,尤其是测试。这是CRC卡发明者采取的方向,我建议你也采取这种方向。

答案 4 :(得分:5)

在我的意见中使用它们而不会弄得一团糟的最简单方法是在文件头中写下一些CRC卡,如下所示:

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

然后,每当您需要添加功能时,请检查您的卡,并确保您不会违反您在其中所述的任何合同。例如,所有突然取决于UIMouseEvent,例如,卡上没有任何地方,所以它是禁止包括它。

答案 5 :(得分:3)

在2003年出版的Object Design: roles, responsibilities, and collaborations Rebecca Wirfs-Brock和{ Alan McKean详细讨论了CRC卡。他们真正强调它对整个程序的不同之处在于它应该是一种非常具有触觉的体验,并且当试图充实设计/要求时,它会放松人们围绕物理对象的想法。

该章的副标题表明,使用这些卡是“探索性设计”阶段的一部分,所以它可能在进行大量编码之前出现,但我认为没有理由你不会继续回到它们敏捷项目的每次迭代,并提醒自己你认为你要去的地方,并在需要时(作为一组课程)审查。

我似乎记得他们甚至建议在房间周围传球,这样只有拥有球的人才能说话,所以也许并不是因为让每个人都在房间里谈论角色的CRC卡。和重要的对象的责任?

如果您想阅读CRC卡的案例研究(当然除了肯特和沃德的原始论文之外),请查看The CRC card book