Введение
В настоящее время у меня есть что-то в форме:
Tetris class ---> FallingPiece class ----> Piece class
A Piece
может быть Square
, T
и т. Д. Он имеет информацию о его форме и формах его вращения, его размере и т. Д.
Класс FallingPiece
в основном содержит атрибут со ссылкой на Piece
(в настоящее время падающая фигура в игре Тетрис) и, вероятно, будет иметь текущее местоположение (x, y)
и цвет.
Мой первоначальный дизайн должен был иметь что-то вроде:
class Tetris {
private IPieceGenerator pieceGenerator;
private FallingPiece fallingPiece;
...
public Tetris(IPieceGenerator pieceGenerator) {
this.pieceGenerator = pieceGenerator;
...
}
private void someMethodThatNeedsAFallingPiece() {
if (fallingPiece == null) {
Piece piece = pieceGenerator.Generate();
fallingPiece = new FallingPiece(piece);
}
...
}
}
У которого, конечно, есть проблема, что если я позже захочу провести модульное тестирование своего класса тетриса и узнать, в каком (x, y)
местоположении платы находится мой текущий FallingPiece
, я не могу. Я помню, как видел эту «проблему» в невероятных Миско Хевери «Чистые переговоры по коду» .
Первая проблема
похоже, что, поскольку я даю классу Tetris
ответственность за создание FallingPiece
объектов, я не могу тогда ссылаться на них (я прошел через конструкторское внедрение на фабрику Piece
, а не FallingPiece
Фабрика!).
Теперь я вижу как минимум 2 способа решить эту проблему:
- Я мог бы просто определить
internal
(C #) / package-protected
(Java) геттер для атрибута FallingPiece
, так что я могу легко проверить его. Это может показаться безобидным, но я не нахожу это слишком элегантным.
- Я мог бы вместо
Piece
Фабрики передать FallingPiece
Фабрику. Затем я мог контролировать, какие объекты будут возвращены Фабрикой, и получить к ним доступ через нее. Что вы, ребята, думаете об этом? Это обычно используется?
Есть ли другой способ решения этой проблемы?
Есть вторая проблема
связано с тем фактом, что я изначально реализовал FallingPiece
как неизменный тип. Это означает, что каждый раз, когда я хочу обновить позицию FallingPiece
на плате Tetris
, например, мне придется создавать новый экземпляр FallingPiece
, а атрибут в Tetris теперь будет указывать на новый FallingPiece
. Что может быть большой проблемой, если я хочу, например, иметь доступ к ссылке FallingPiece
через FallingPieceFactory
, который передается в класс Tetris
. Мне кажется, что неизменные типы данных могут быть, если неправильно использовать много головной боли при попытке проверить классы, верно? Или это плохое использование неизменяемого типа данных, во-первых?
Спасибо