I am currently in the process of refactoring the code I wrote for a text/console version of the Mastermind board game. I am a bit stuck with how to best approach improving this section my GameLogic
class.
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(); }
What I am trying to do is set the static values of totalRows
and totalColumns
in the Board
class BEFORE constructing the inputBoard
and outputBoard
objects. The reason why I want to do this is because I need to have these values present when constructing instances extending Board (an abstract class). The reason why I am making these values static is because they should be the same across all instances extending from Board
and so that I can do something like Board.getTotalColumns()
throughout the application.
The reason why I think this is suspiciously bad is because it would be possible to declare inputBoard
or outputBoard
without first setting the static member variables and of course it would also be possible to accidentally set the values of the static member later on to any arbitrary value.
Another approach I thought of was to make the getters in GameSettings public and static so that I could do something like this instead:
public abstract class Board { private static final int totalColumns = GameSettings.getCodeLength(); private static final int totalRows = GameSettings.getNumOfGuesses(); // other stuff... }
This would allow me to avoid using setters and the problems associated with using them as listed above. But wouldn’t this defeat the purpose of instantiating a GameSettings
object?
What do you think are better alternatives to approach this?
Answer
I am not an expert on design pattern. I would try something like below –
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; } }
Now I would do –
public GameLogic(GameSettings gameSettings) { inputBoard = new InputBoard(gameSettings); outputBoard = new OutputBoard(gameSettings); }