在以下简单场景中,您将如何坚持“告诉,不问”原则(以下简称“原则”)?在俄罗斯方块游戏中,我有与以下示例相关的 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;
}
}