我目前正在重构我为Mastermind棋盘游戏的文本/控制台版本编写的代码。我对如何最好地改进本部分GameLogic
课程感到困惑。
public GameLogic(GameSettings gameSettings)
{
// ..other stuff..
// initialise static members
Board.setTotalRows(gameSettings.getNumOfGuesses());
Board.setTotalColums(gameSettings.getCodeLength());
// InputBoard and OutputBoard extends the abstract class Board
inputBoard = new InputBoard();
outputBoard = new OutputBoard();
}
我要做的是在构建totalRows
和totalColumns
对象之前,在Board
类中设置inputBoard
和outputBoard
的静态值。我想这样做的原因是因为我需要在构造扩展Board(抽象类)的实例时使用这些值。我将这些值设置为静态的原因是因为它们在从Board
扩展的所有实例中应该是相同的,因此我可以在整个应用程序中执行类似Board.getTotalColumns()
的操作。
我认为这是可疑的原因是因为在没有先设置静态成员变量的情况下可以声明inputBoard
或outputBoard
,当然也可能会意外地设置稍后静态成员的值为任意值。
我想到的另一种方法是将GameSettings中的getter设为public和static,这样我就能做出类似的事情:
public abstract class Board
{
private static final int totalColumns = GameSettings.getCodeLength();
private static final int totalRows = GameSettings.getNumOfGuesses();
// other stuff...
}
这将允许我避免使用setter以及与上面列出的使用它们相关的问题。但这不会破坏实例化GameSettings
对象的目的吗?
您认为采用这种方法的更好方法是什么?
答案 0 :(得分:0)
我不是设计模式方面的专家。我会尝试下面的东西 -
<强> Board.java 强>
abstract class Board {
private final GameSettings gameSettings;
Board(GameSettings gameSettings) {
this.gameSettings = gameSettings;
}
public int getTotalColumns() {
return gameSettings.getCodeLength();
}
public int getTotalRows() {
return gameSettings.getNumOfGuesses();
}
//Other abstract methods
}
InputBoards .java
class InputBoards extends Board {
InputBoards(GameSettings gameSettings) {
super(gameSettings);
}
}
OutputBoards .java
class OutputBoards extends Board {
OutputBoards(GameSettings gameSettings) {
super(gameSettings);
}
}
GameSettings .java
class GameSettings {
public int getCodeLength() {
//return your value;
}
public int getNumOfGuesses() {
//return your value;
}
}
现在我愿意 -
public GameLogic(GameSettings gameSettings) {
inputBoard = new InputBoard(gameSettings);
outputBoard = new OutputBoard(gameSettings);
}