1988 年,Ward Cunningham(没错,就是那个 Ward Cunningham)提出了一个使用索引卡作为面向对象设计的工具的想法。当时我正在苹果公司为 Kent Beck 工作,所以我在 Kent 的办公室通过免提电话听 Ward 描述他的想法。次年,Ward 和 Kent 在 OOPSLA 会议上发表了一篇关于 CRC 卡的 论文,顿时引起了轰动。有些公司甚至印制了带有品牌标志的 CRC 卡,这至今仍让我觉得好笑。
拿一张索引卡。(3x5 或 4x6 是不错的尺寸,但如果比这大,就太笨重不方便移动了。)在卡片顶部写上一个类的名称。画一条竖线,将卡片的其余部分分成不均匀的两半——左半部分占据宽度的大约 2/3。在左边写上这个类的职责。在右边写上这个类的对象与之协作的对象或对象类。基本内容就是这些。一旦有了代表几个类的卡片,你就可以排列这些卡片来探索对象交互并发现新的职责和协作。
虽然 CRC 卡可以单独使用,但它们真正闪光的地方在于协作设计。一个人很容易移动一张卡片来向其他人展示他们的意思。由于卡片可以独立移动,两个人可以同时在不同的卡片上书写。这使得一个轻量级但有效的团队设计过程得以实现。它也是描述设计的一种不错的方式。
CRC 卡也很好地契合了 Rails 的思维方式,在这种方式下,约束是赋能的。卡片很小,所以你无法在上面写太多内容,以免它们变得过于复杂而难以理解。有限的空间让你专注于重要的事情。而且由于卡片易于制作,因此也易于丢弃——没有投入就意味着没有痛苦。不喜欢卡片上的内容?撕掉它,重新开始。
使用 CRC 卡的一个好方法是利用它们来记录现有设计。这样,你就无需在学习新工具的同时处理设计创建的问题。然后,你可以使用它们来修改或扩展现有软件的设计。一旦你对它们熟悉了,就可以尝试用于全新的设计。
我这简短的解释 hardly justice to the topic. 阅读 Ward 和 Kent 的 论文,浏览 原始 wiki 上关于 CRC 卡的文章,当然,也可以谷歌搜索更多信息。