我正在创建一个益智游戏,就像一个业余项目一样,但是该项目现在已经达到了很多代码(约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的绘制方法需要附加的不同输入并且此方法的声明发生更改(例如,可能需要更多信息)时,对绘制方法的调用必须一直更改为“向上”。
结论和实际问题
因此,基本的问题是:旧情况违反了封装,新情况可能没有,但也似乎不是封装原理的可靠实现。所以我的问题是:您对改进此设计有何想法?您将如何实现拼图块,它们的状态以及对其进行绘制操作?
最佳答案
构建知道如何绘制PieceDrawer
的Piece
。我强烈建议进行以下分离:
这种设置的唯一丑陋之处是PieceDrawer和Pieces之间的耦合。另一方面,您可以将所有这些耦合都放在一个位置,并且所有作品的作品绘画都可能相似。通过替换GamePanel和PieceDrawer,您可以将整个应用程序转换为基于文本的应用程序,而无需接触任何模型类。或为用户提供样片表示形式的选择(使PieceDrawer成为接口,有几个实现它们的类)...