次の簡単なシナリオで、「教えて、聞かないで」の原則 (以下、「原則」) をどのように順守しますか? Tetris ゲームには、次の例に関連する 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;
}
}