在以下簡單的情況下,你會如何堅持「告訴,不要問」的原則(以下簡稱「原則」)?在俄羅斯方塊遊戲,我有相關的以下示例局,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