我正在创建一个益智游戏,就像一个业余项目一样,但是该项目现在已经达到了很多代码(约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的绘制方法需要附加的不同输入并且此方法的声明发生更改(例如,可能需要更多信息)时,对绘制方法的调用必须一直更改为“向上”。

结论和实际问题
因此,基本的问题是:旧情况违反了封装,新情况可能没有,但也似乎不是封装原理的可靠实现。所以我的问题是:您对改进此设计有何想法?您将如何实现拼图块,它们的状态以及对其进行绘制操作?

最佳答案

构建知道如何绘制PieceDrawerPiece。我强烈建议进行以下分离:

  • 模型类:保留并允许访问和修改内部应用程序状态,但对如何操作或表示它们一无所知。您的Piece / PieceContoller / PuzzleController类应该在这里。据我所知,PieceState应该合并到Piece中(因为它将不再包含那么多数据)。您的PuzzleController现在将只知道如何修改模型类状态,而对用户输入则一无所知。
  • View + Controller类:严格用于UI。通过模型的高级方法访问模型,但将尽可能多的实际游戏委托给模型。您的PieceDrawer和GamePanel(一个JPanel)类将属于此类别。 GamePanel将负责收集用户输入并在PuzzleController中执行移动,然后使用PieceDrawer绘制每个部件。

  • 这种设置的唯一丑陋之处是PieceDrawer和Pieces之间的耦合。另一方面,您可以将所有这些耦合都放在一个位置,并且所有作品的作品绘画都可能相似。通过替换GamePanel和PieceDrawer,您可以将整个应用程序转换为基于文本的应用程序,而无需接触任何模型类。或为用户提供样片表示形式的选择(使PieceDrawer成为接口,有几个实现它们的类)...

    08-06 04:20