如果我有一个单独的课程,以及一个单独的课程,我怎么告诉他们在彼此分开时移动?

时间:2012-10-01 00:17:52

标签: java

Board类有一个8x8的2D Piece数组,所以我显然可以通过执行board.move(piece1, 3, left)来移动Board类,但是我无法简单地说出来像piece1.move(3, left)一样移动的那块,因为它没有办法知道关于板的任何信息(没有把它作为参数传递),所以它无法将自己移动到特定的索引,或者知道是否一块已经占据这个索引,或者它被告知要移出阵列的边界。

2 个答案:

答案 0 :(得分:3)

您还有其他尚未建模的对象,例如GamePlayer。让我们退后一步,思考每个模型的责任:

  • Piece Piece非常小。它知道它是什么,它是什么颜色,可能就是它。
  • 董事会:也相当小。它知道它的方块是什么。
  • 游戏:这可能是最复杂的组件。它知道游戏规则。 (毕竟,如果您想要更改游戏规则,那么您不必更改BoardPiece,对吗?)它知道哪个Pieces制作完整的游戏设置。它知道每个Piece可以做出哪些动作。它知道在任何给定时间Piece上任何给定Board的位置。
  • 播放器PlayerGame互动。它会告诉Game它想要对Piece执行给定操作。 Game将允许或拒绝该操作,并根据该操作修改Game(检查,配合,僵局,其他Player轮次等的状态。 (同样,PiecesBoard并不关心这些状态。)

如果Game对象变得臃肿且笨重,它可能会被分成碎片并且主要作为复合对象存在。例如,对于给定的规则集,您可以有MoveList个可能的移动。 Game由它组成,但不需要在内部包含它。

我越是想到这一点,我就越认为BoardPiece被分开为这个领域中真正“愚蠢”的对象。它们甚至不是真正的实体,只是价值对象。与另一件具有完全相同属性的一件基本上可与另一件件互换。 (如果你失去了一位黑主教,你可以用另一位黑人主教代替它,而不会对经验造成任何不利影响。)如果这两个被视为不可变数据结构而不是模型,域可能会更流畅。

(值得注意的是,其他Board可以使用完全不同的Games套来重复使用相同的Piece。)

作为练习,我建议关注Robert Martin's Bowling Game Kata。当您考虑用于验证域的实际测试时,您会惊讶地发现,您可以将多少精力投入到游戏域建模中,以使其变得简单很多。我们可以在学术上整天考虑这些国际象棋模型,但是提出一些测试来验证游戏可以使设计更简单。

答案 1 :(得分:2)

一件作品本身并不知道碰巧放置的位置(可能不需要知道)。因此,需要调用Board方法移动一块文件没有任何问题。