我正在使用C#编写棋盘游戏,其中两个最重要的类是Piece
和Square
。通常,Piece
的每个实例都有Square
(作为属性),Square
的每个实例都可能有Piece
(也可以作为属性)或者可能为空。< / p>
我将代码放在Square.Piece
和Piece.Square
的set方法中,以确保维持这种关系(例如,当一个片段从一个方格移动到另一个方格时)并避免明显的危险链接属性在无限循环中调用彼此的set方法。
但是当从板上移除piece
并将其square
设置为'null'时,我似乎有太多的if语句来避免空异常,而且看起来很简单的模式在概念上变得很远在实践中过于复杂且容易出错。
我想知道我的整个方法是否错误。当piece
还有square
属性时,Square
是否应将Piece
作为属性?我实际上是否开始编写反模式? Piece
的{{1}}在创建时可能为空,而Square
的{{1}}通常为空(表示空)。我应该用另一种方式来表示不在板上的空方块和碎片吗?
我假设当一个类以双向关系链接到另一个类时,有一个更优选,更健全的解决方案。
非常感谢任何想法。
答案 0 :(得分:2)
使用更高级别的抽象,使用
等方法move(piece, originalSquare, destinationSqueare)
place(piece, square)
remove(piece)
promote(originalPiece, finalPiece)
这些方法将使用Piece
和Square
中的基本方法,并且将是您的主逻辑使用的方法
答案 1 :(得分:1)
在我看来,你正在推翻从Piece
移除Board
的过程。
游戏将以Board
课程为中心。从Piece
中删除Board
后,该片就消失了;你再也不会做任何事了。你不会调用任何方法或任何东西。那个对象现在已经死了 - 无法到达。因此,实际上没有任何理由可以更改Piece
的状态以使其Board
引用无效。
这确实是一种非常常见的模式,通常的做法就是放手。一旦没有人再引用Piece
,你就完成了;不再重要 Piece
仍然恰好引用了Board
。让它保持参考;它不会造成任何伤害(因为没有人会再用那个Piece
做任何事情),并且它很快就会被垃圾收集。