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

10-08 18:27