在以下简单情况下,您将如何遵循“告诉,不要问”原则(以下简称“原则”)?在俄罗斯方块游戏中,我具有与以下示例相关的Board,BlockGrid和Piece类:
public class Board
{
private var fallingPiece:Piece;
private var blockGrid:BlockGrid;
...
public function moveFallingPiece(xDirection:int, yDirection:int):void
{
blockGrid.movePiece(fallingPiece, xDirection, yDirection);
}
}
一旦将fallingPiece放置在BlockGrid的底部行中,它就不再应该是“ fallingPiece”。我是对的,因为我没有违反以下原则吗?
if(blockGrid.getPiecePosition(piece).y == 0)
{
fallingPiece = null;
}
但是,这真的与我明显违反该原则的情况有所不同吗?
public function moveFallingPiece(xDirection:int, yDirection:int):void
{
if(blockGrid.getPiecePosition(piece).y > 0)
{
blockGrid.movePiece(fallingPiece, xDirection, yDirection);
}
else
{
fallingPiece = null;
}
}
我并没有假设我已经按照适合该原理的正确方式设计了这些类关系。如果这正是我所缺少的,请提出建议。
编辑,建议的解决方案:
我通过事件提出了“命令反馈”的答案。董事会告诉BlockGrid移动一块。 BlockGrid的movePiece方法根据结果调度MOVED_TO或MOVE_FAILED事件,Board可以收听并用来确定一块是否停止下落。请随时提供有关此解决方案的反馈。
public class Board
{
...
public function Board()
{
...
blockGrid.addEventListener(PieceMoveEvent.MOVE_FAILED, onPieceMoveFailed);
...
}
public function moveFallingPiece(xDirection:int, yDirection:int):void
{
blockGrid.movePiece(fallingPiece, xDirection, yDirection);
}
public function onPieceMoveFailed(event:MovePieceEvent):void
{
if(event.instance == currentlyFallingPiece && event.fromPosition.y != event.toPosition.y)
{
currentlyFallingPiece = null;
}
}
最佳答案
我认为,为了更好地遵循“告诉,不要问”的原则,当FallingPiece达到其静止点时,应该让blockGrid通知您的Board类。在上述两种情况下,您都在询问blockGrid该块的position.y == 0,以确定fallingPiece是否应为null。相反,您希望blockGrid告诉Board类FallingPiece.y已达到0。