Кажется, в этом уроке названия немного вводят в заблуждение.Класс с именем Shape
представляет один элемент, который падает.Tetrominoes
enum
, по-видимому, описывает , какой это тип элемента (т.е. его "форма"!).
Таким образом, код, который вы разместили, создает новый элемент и указывает его форму.
Методы rotateRight()
и rotateLeft()
не изменяют саму форму, позволяя методу tryMove()
проверить, является ли движение допустимым, и игнорируют его, если оно не't (например, если вы повернете предмет в стену).tryMove()
просто сохраняет старые значения (включая старый экземпляр Shape
), когда перемещение запрещено.Если rotateLeft()
/ rotateRight()
изменил Shape
, то пришлось бы отменить эту операцию, что усложнило бы код.
Кроме того, есть несколько придирок с этим кодом:
- Я бы назвал
Tetrominoes
класс Tetromino
, так как типы enum
обычно называются в единственном числе (поскольку вы часто ссылаетесь на элемент single : Tetromino.SquareShape
. - Я бы добавил информацию о конкретной координате каждой
Tetromino
в эту enum
, эффективно поместив в нее большую часть логики из метода setShape()
. The *Класс 1039 * смешивает логику и представление, он должен быть отделен (это значительно облегчает тестирование).
Например, класс Board
может реализовывать всю логику без какой-либо графики (т.е. неt ссылается на что-либо из java.awt
или javax.swing
). Затем вы пишете BoardPanel
, который рисует состояние Board
и взаимодействует с пользователем, вызывая соответствующие Board
методы.