【发布时间】:2016-07-05 13:23:01
【问题描述】:
我目前正在重构我为 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();
}
我要做的是在构造inputBoard 和outputBoard 对象之前在Board 类中设置totalRows 和totalColumns 的静态值。我之所以要这样做是因为在构建扩展 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 对象的目的吗?
您认为解决此问题的更好选择是什么?
【问题讨论】:
-
一开始就不要静态,也不要
Board.getTotalColumns()。这种静态使用违背了所有 OOP 思想。您的Board构造函数需要一个GameSettings对象。与Board交互的类在它们的构造函数中需要它等等。 -
@zapl 感谢您的评论。我认为当您知道某物的价值不会在实例之间发生变化时,静态很有用。你是不是建议我做类似的事情:
inputBoard = new InputBoard(gameSettings.getCodeLength(), gameSettings.getNumOfGuesses());
标签: java oop refactoring settings