领域设计与代码的一致性:以保龄球计分软件为例

导读在领域设计与聚合根的文章中,提到了两个导致设计与代码脱节的情况:

领域设计与代码的一致性:以保龄球计分软件为例

在领域设计与聚合根的文章中,提到了两个导致设计与代码脱节的情况:

  1. 代码未反映出软件架构:架构图描述的是一个系统或一个模块的结构和关系,但代码未能准确反映这种结构。这可能导致设计和实现之间的不一致,从而影响系统的可维护性和可扩展性。
  2. 设计的表现力不足:设计可能没有充分表达出某些约束和规则,读者需要阅读代码实现才能清楚具体的内容。这种情况可能会使设计和代码之间的耦合度过高,不利于系统的维护和修改。

让我们通过一个例子来说明“代码未反映出软件架构”的问题。假设我们要开发一个保龄球计分软件。在开始之前,我们需要了解需求,这里就是“保龄球的记分规则”。规则如下:

  • 一局比赛由10轮组成,每轮比赛中,参赛者可以投掷两次来尝试击倒所有的瓶子。如果参赛者一次即击倒所有的瓶子,则称为“全中”,并且本轮结束。如果参赛者第一次没有击倒所有的瓶子,第二次击倒了所有的瓶子,则称为“补中”。如果一轮比赛中,两次投掷都没有击倒所有的瓶子,本轮也宣告结束。
  • 全中轮记分规则:本轮击倒得到的10分,加上接下来的两次投掷击倒的瓶子数量,再加上前一轮的分数。
  • 补中轮记分规则:本轮击倒得到的10分,加上接下来的一次投掷击倒的瓶子数量,再加上前一轮的分数。
  • 其它轮记分规则:本轮两次击倒的瓶子数量,再加上前一轮的分数。

如果第十轮为全中,那么参赛者可以多投两次,以完成对全中的记分。相应的,如果第十轮为补中,那么参赛者可以多投一次,以完成对补中的记分。

根据上述规则,我们可以得到初步的设计:一局比赛(Game)有10轮(Frame),每轮(Frame)有一到三次投掷(Throw)。全中则是一次投掷,其它为两次投掷。最后一轮如果全中或补中,则是三次投掷。也就是说,游戏最多可以投23次。每轮的记分规则如下:全中轮、补中轮和其它轮的计分规则如上所述。初步关系如上图所示。

然而,《敏捷软件开发:原则、模式与实践》中的代码并没有反映出这种软件架构。虽然书中花了一章的内容来讨论这个软件的开发过程,并通过结对编程 TDD的方式一步步进行代码演进(具体推导过程请阅读《敏捷》),但最终得到的代码并没有清晰地反映出保龄球计分的架构和规则。

这个例子说明了一个问题:仅仅通过代码来反映软件架构和设计是远远不够的。为了更好地实现领域设计,我们需要采用多种方法和工具来表达和验证我们的设计。只有这样,我们才能确保设计和代码的一致性,提高软件的可维护性和可扩展性。

标签: 规则 记分规则

免责声明:本文由用户上传,如有侵权请联系删除!