Как бы вы придерживались принципа «Говори, не спрашивай» (далее «принцип») в следующем простом сценарии? В игре 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);
}
}
Как только падающая часть помещается в нижнюю строку BlockGrid, она больше не должна быть «падающей частью». Прав ли я в том, что не нарушаю принцип следующим?
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 переместить часть. Метод movePiece в BlockGrid отправляет события 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;
}
}