【问题标题】:How does one elaborate design using CRC cards?如何使用 CRC 卡进行精心设计?
【发布时间】:2010-09-11 01:31:26
【问题描述】:

我一直想知道人们如何使用 CRC(班级责任协作)卡。我在书中读到过它们,在互联网上找到了模糊的信息,但从未真正掌握。我认为应该有人制作一个 youtube 视频来展示与 CRC 卡的会话,因为我的一本书将其描述为很难用文字表述,它应该“由已经掌握它的人教”。遗憾的是,我知道附近没有人使用 CRC 卡,我想了解更多信息。

更新

任何显示人们使用此技术详细说明的视频链接将不胜感激。

【问题讨论】:

  • “任何指向显示人们这样做的视频的链接都将受到重视。” 咯咯笑
  • 很高兴看到 SO 上有人有幽默感。

标签: oop ooad crc-cards


【解决方案1】:

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

那一章的副标题表明,使用卡片是“探索性设计”阶段的一部分,因此它可能在进行大量编码之前出现,但我认为你没有理由不继续使用它们敏捷项目的每次迭代,并提醒自己你认为你要去哪里,并在需要时进行审查(当然作为一个小组)。

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

如果您想阅读 CRC 卡的案例研究(当然除了 Kent 和 Ward 的原始论文),请查看The CRC card book

【讨论】:

  • 是的,我意识到我在重新陈述 Kent Beck 所说的一些内容,但我想引起人们的注意,而不是试图给出一个规范的答案。希望这表明,自从最初的论文以来,就有一些人接受了这个想法并坚持下去。
  • 这听起来很棒,我必须查看文献,看看我是否最终能理解 CRC 卡。虽然我必须承认,从最初的帖子开始,我学到了更多关于软件设计的知识,而且我想我理解他们正在实现什么。基本上,我一直在寻找工具来充实我的课程的职责,但自从我开始学习 TDD 后,我发现 TDD 会自动驱使我进行精细设计,而无需明确考虑。
  • CRC 卡在与不了解高级设计解决方案的人一起工作时似乎是一个很好的补充工具,但任何其他能够传达信息的类似物都应该同样适合传达抽象和精细化的需求.
【解决方案2】:

我认为您的陈述“我知道这里没有人使用 CRC 卡” 几乎总结了 CRC 卡的开发状态。在我看来,CRC 卡是从传统的、计划驱动的开发到敏捷开发的道路上的一步。世界已经在前进。我不会专注于如何使用 CRC 卡,而是研究像 TDD 这样的技术,它可以利用像 UML 和 CRC 卡这样的技术作为中间工件,但它专注于代码,尤其是测试。这是 CRC 卡的发明者所采取的方向,我建议您也采取。

【讨论】:

  • 好吧,如果这是真的,那么我的书已经过时了:x。不过,我肯定会检查 TDD。感谢您的意见。
  • 在过去的 4 场敏捷开发会议中,我参加了其中的 3 场,我可以向您保证,CRC 卡并不是那里的热门话题。我并不是说它们没用,但我也不会围绕它们构建开发方法。
  • 您可能想查看去年的敏捷 2008 计划,以了解敏捷领域的最新技术:agile2008.org
【解决方案3】:

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

保持这种平衡是 CRC 卡的用武之地。当它们放在桌子上时,您可以从整体上查看计算。然而,当你拿起一张卡片时,你会受到身体上的、动觉上的鼓励去观察那个物体——我有这个计算的一小部分要使用有限的资源,我将如何完成它?

随着时间的推移,同时持有两种观点的能力似乎会渗透到大脑中。卡片上写的越来越少。然后卡片是空白的。过了一会儿,人们只需指出卡片所在的位置,如果他们愿意从堆栈中取出一张空白的卡片。最终,人们完全不需要卡片就能享受这种思维方式的好处。不过,在与尚未掌握平衡的人交谈时,拿出真实卡片可能是一种有用的交流辅助。

我发现卡片的最大弱点是缺乏反馈。你可以愚弄自己代码的结果。我建议只在出现有趣的问题之前使用卡片,转向测试/代码进行确认,然后继续设计。

Ward 和我在大约 15 年前制作了一段设计会议的视频,但我在网上找不到任何地方,也没有副本。我不确定它在任何情况下作为教学工具是否有用。我不知道其他视频,但它们可能会很有趣,尤其是当你要比较几个不同设计师的风格时。

【讨论】:

  • 很好的答案。这是 AA 的候选人,但我会再利用它一段时间,看看其他人是否也有一些好的观点可以借鉴讨论。视频会很棒,但我找不到任何视频。视频会非常难看,因为我认为这是“你必须自己看”的视频之一
  • @[Statement]:呃......你不可能得到更好的答案 - 这是发明它的人之一!
  • @[Steven A. Lowe] Kent Beck 很可能是发明者之一,但这并不意味着其他人不能对这个主题有更多了解。特别是来自使用和评估该技术的人。仅仅因为作者已经回答并不意味着其他人不应该发表意见
  • @[声明]:我没有说其他人不应该回答。但请注意前 2 个答案,一个是 Kent Beck 论文的链接,另一个是 Kent Beck 的回复。可能会出现一种模式...... ;-)
【解决方案4】:

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

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

我希望我能以某种方式帮助你。

问候,
朱里

【讨论】:

  • 是的,你帮我理解了很多。因此,CRC 卡用于为松散定义的系统中的任何给定类查找候选方法以及参数参数?
  • 我不会说方法和参数,而是更多关于责任点(然后导致方法)。 CRC 卡应该是更好地了解您的系统并促进开发人员之间讨论的一种手段。否则你不应该使用它们。他们不应该阻碍你。
  • @Juri 再次阅读您的评论时注意到的一件(有趣的)事情是,所有 事物本质上似乎都会以某种方式阻碍您。你必须克服最初的困惑或不确定性障碍,直到你深深地感觉到它是否是一种障碍。直到你知道它是如何充分发挥作用或清楚地看到它的价值之前,我认为大多数(如果不是全部)新想法似乎都是一个障碍。 :)
  • 足够公平,但这取决于它是否似乎只是因为你正面临最初的学习曲线或它真的阻碍你因为它不适合您和您的团队的工作方式。我记得当 Erich Gamma (Eclipse) 作为我们大学的客座讲师做演讲时;他是 XP 之父之一,实践如现场客户、结对编程等。关于他们是否在团队中积极实践结对编程的问题,他说他们尝试过,但对他们没有用,所以他们离开了。你知道我的意思:)
【解决方案5】:

在我看来,使用它们最简单的方法是在文件头中写下小 CRC 卡,如下所示:

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

然后,每次您需要添加功能时,请检查您的卡片,并确保您没有违反您在其中声明的任何合同。例如突然依赖 UIMouseEvent,这在 Card 上没有任何位置,因此禁止包含它。

【讨论】:

  • 您是否将此作为一种常见做法?
【解决方案6】:

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

【讨论】:

  • 看来“源”来找我们了 :)
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2021-03-22
  • 2014-10-14
相关资源
最近更新 更多