【发布时间】:2010-08-13 08:43:05
【问题描述】:
我正在创建一个小益智游戏,只是作为一个爱好项目,但该项目现在已经达到了一个有相当多代码(大约 1500 行)的地步。尽管我试图阻止它,但代码已经变得混乱。我肯定想在我还可以的时候清理代码,让它更易于维护和阅读。
在我的游戏中有 3 个类处理有关拼图的动作:
class PieceController{
private arrayOfPieces;
private selectedPiece;
//actions like select a piece, dropa piece
}
class Piece{
private pieceID
private ArrayOfPieceStates
//handles the initial creation of pieceStates and returns the current state
}
class PieceState{
private stateDimensions
// the particular rotation of a piece, aware of it's dimensions.
}
可能这个结构应该作为一个整体重新设计,但我们假设现在还可以。
问题:还有一个 JPanel 负责处理图形,它需要知道当前拼图的 PieceState 才能绘制它。然后面板的绘图方法通过如下请求获取尺寸:
PuzzleController.getPiece().getState().getDimensions()
这似乎是一种不好的做法,因为它完全破坏了封装,正如我现在所学到的那样。当我打算重新设计拼图结构时,这些吸气剂链会断裂;
然后我想我可能会遵循“告诉不问”的绘图原则:
PieceController.drawPiece(drawingInfo) // called by the graphics Panel
Piece.drawPiece(drawingInfo) // called by PieceController
PieceState.drawState(drawingInfo) // called by Piece, now here we are aware of piece dimensions so drawing can take place.
(不是实际代码中的drawingInfo是绘图方法需要的一行参数。)
在某种程度上,我已经实现了封装,因为第一个 drawPiece 方法是图形面板所需的全部,它不需要担心这些片段是如何进一步结构化的。但是现在感觉好像只是把信息依赖倒过来了,并没有太大的进展。
首先是:绘制方法需要当前puzzlePiece状态的维度信息来绘制。 现在它变成了:puzzlePiece 的状态需要有关图形环境的信息来执行绘图操作(例如在屏幕上的哪个位置绘制棋子)。
现在,当 PieceState 的绘图方法需要额外的不同输入并且此方法的声明发生更改(例如,它可能需要更多信息)时,对绘图方法的调用必须一直“向上”更改。
结论和实际问题 所以基本上问题是:旧情况违反了封装,新情况可能不会,但似乎也不是封装原则的可靠实现。所以我的问题是:你有什么想法来改进这个设计?您将如何实现拼图块、它们的状态和对它们的绘图操作?
【问题讨论】:
标签: java oop encapsulation