在下面的简单场景中,您如何遵循“告诉,不要问”的原则(以下简称“原则”)?在俄罗斯方块游戏中,我有与以下示例相关的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;
}
}
我并没有假设我已经以正确的方式设计了这些类关系来使用该原则.如果那是我所缺少的,请就替代设计提出建议.
编辑,提出的解决方案:
我通过事件提出了“命令反馈”的答案. Board告诉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;
}
}
最佳答案 我认为,为了更好地遵循Tell,Do not Ask原则,当fallPiece达到它的休息点时,你应该让blockGrid通知你的Board类.在上面的两个场景中,您要求blockGrid是否该块的position.y == 0以确定fallingPiece是否应为null.相反,您希望blockGrid告诉Board类fallPiece.y已经达到0.