在以下简单的情况下,你会如何坚持“告诉,不要问”的原则(以下简称“原则”)?在俄罗斯方块游戏,我有相关的以下示例局,BlockGrid和片类:如何在这个简单的例子中思考“告诉,不要问”?
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;
}
}
怎么不问不说工作? – 2010-02-07 02:07:14
这里有一个很好的参考“告诉,不要问”:http://www.pragprog.com/articles/tell-dont-ask – Dolph 2010-02-07 02:23:47