actionscript-3 – 在这个简单的例子中如何思考“告诉,不要问”?

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

点赞