Board类有一个8x8的2D Piece
数组,所以我显然可以通过执行board.move(piece1, 3, left)
来移动Board类,但是我无法简单地说出来像piece1.move(3, left)
一样移动的那块,因为它没有办法知道关于板的任何信息(没有把它作为参数传递),所以它无法将自己移动到特定的索引,或者知道是否一块已经占据这个索引,或者它被告知要移出阵列的边界。
答案 0 :(得分:3)
您还有其他尚未建模的对象,例如Game
和Player
。让我们退后一步,思考每个模型的责任:
Piece
非常小。它知道它是什么,它是什么颜色,可能就是它。Board
或Piece
,对吗?)它知道哪个Pieces
制作完整的游戏设置。它知道每个Piece
可以做出哪些动作。它知道在任何给定时间Piece
上任何给定Board
的位置。Player
与Game
互动。它会告诉Game
它想要对Piece
执行给定操作。 Game
将允许或拒绝该操作,并根据该操作修改Game
(检查,配合,僵局,其他Player
轮次等的状态。 (同样,Pieces
和Board
并不关心这些状态。)如果Game
对象变得臃肿且笨重,它可能会被分成碎片并且主要作为复合对象存在。例如,对于给定的规则集,您可以有MoveList
个可能的移动。 Game
由它组成,但不需要在内部包含它。
我越是想到这一点,我就越认为Board
和Piece
被分开为这个领域中真正“愚蠢”的对象。它们甚至不是真正的实体,只是价值对象。与另一件具有完全相同属性的一件基本上可与另一件件互换。 (如果你失去了一位黑主教,你可以用另一位黑人主教代替它,而不会对经验造成任何不利影响。)如果这两个被视为不可变数据结构而不是模型,域可能会更流畅。
(值得注意的是,其他Board
可以使用完全不同的Games
套来重复使用相同的Piece
。)
作为练习,我建议关注Robert Martin's Bowling Game Kata。当您考虑用于验证域的实际测试时,您会惊讶地发现,您可以将多少精力投入到游戏域建模中,以使其变得简单很多。我们可以在学术上整天考虑这些国际象棋模型,但是提出一些测试来验证游戏可以使设计更简单。
答案 1 :(得分:2)
一件作品本身并不知道碰巧放置的位置(可能不需要知道)。因此,需要调用Board
方法移动一块文件没有任何问题。