就Java中正确使用封装提出了建议
作者:互联网
我正在创建一个益智游戏,就像一个爱好项目一样,但是该项目现在已经达到了很多代码(约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 / PieceContoller / PuzzleController类应该在这里.据我所知,PieceState应该合并到Piece中(因为它将不再包含那么多数据).您的PuzzleController现在将只知道如何修改模型类状态,而对用户输入一无所知.
> View Controller类:严格用于UI.通过模型的高级方法访问模型,但是将实际游戏尽可能多地委托给模型.您的PieceDrawer和GamePanel(一个JPanel)类将属于此类别. GamePanel将负责收集用户输入并在PuzzleController中执行移动,然后使用PieceDrawer绘制每个部件.
这种设置的唯一丑陋之处是PieceDrawer和Pieces之间的耦合.另一方面,您可以将所有这些耦合都放在一个地方,并且所有作品的作品绘画都可能相似.通过替换GamePanel和PieceDrawer,您可以将整个应用程序转换为基于文本的应用程序,而无需接触任何模型类.或为用户提供样片表示形式的选择(使PieceDrawer成为接口,有几个实现它们的类)…
标签:oop,encapsulation,java 来源: https://codeday.me/bug/20191105/1998472.html