我正在尝试设计Bejeweled游戏。我基本上有3节课。 Game类(这是玩家将要使用的类),Board类(代表板)和SwitchController类(负责检查板上所需的开关是否有效),进行开关,计数可用的可能开关的数量(这样我就可以知道游戏何时结束等)。

我当前的设计如下所示:

Game:
isGameOver()
isSwitchValid(coord1, coord2)
makeSwitch(coord1, coord2)
getPieceAt(coord)
getBoardLength()

IBoard:
getPieceAt(coord)
setPieceAt(coord, piece)
getLength()

我的想法将是ISwitchController:
ISwitchController:
isSwitchValid(coord1, coord2)
makeSwitch(coord1, coord2)
getAllValidSwitches()

这是有关如何组织类的示意图:

我将可以使用2种不同的IBoard具体类(对于每一种,我都必须有一个ISwitchController实现)。

问题:

我的程序是要有2个IBoard实现:

第一个是ArrayBoard,它将所有板子存储在2D阵列中。没什么特别的。我将定义一个ArrayBoardSwitchController来管理此类。

第二个是ListBoard,对于每种颜色的块,都有一个List / Set,其中包含该颜色的所有块的坐标。我将定义一个ListBoardSwitchController来管理此类。

这里的主要问题是SwitchController的实现在ArrayBoardListBoard上将完全不同。例如,虽然实现getAllValidSwitches()时仅需要ArrayBoardSwitchController方法,但使用getPieceAt()并不是一个好主意(在该类中,我在内部使用列表,因为这样比较容易检查移动是否有效)。

据我所知,有两种可能的解决方案:
  • 我可以合并在一起ListBoardSwitchControllerISwitchController接口。这样我只会
    游戏和棋盘(而
    基本上,游戏只是一个
    董事会的控制者
    将是拥有所有
    游戏逻辑)。不会那么好
    因为课程不会
    如果我有的话,尽可能地凝聚力
    3个不同的类别。
  • 让接口原样放置
    我需要与公众合作的所有方法
    在具体的课程中。例如,如果我需要IBoard方法,我将其公开
    getYellowPiecesList()上,以便ListBoard可以
    用它。 ListBoardSwitchController只会
    了解它,因为它知道它仅适用
    针对ListBoardSwitchController

  • 您对此事有何看法?这里的重点不是如何设计“宝石迷阵”游戏,而是如何解决此问题,这是您尝试实现算法时经常发生的问题:一方面,您希望有一个清晰而良好的OOP设计,另一方面,您希望拥有一个清晰而良好的OOP设计。有时会妨碍合理而有效的算法实现。

    最佳答案

    这里的主要问题是SwitchController的实现在ArrayBoard和ListBoard上将完全不同。

    如果是这种情况,那么听起来您对IBoard接口的设计还不够好,因此类可以在不了解实现细节的情况下使用IBoard的实现。如果IBoard的用户需要知道正在使用什么实现,那么它几乎无法实现拥有接口的目的!

    我强烈建议您重新访问要在IBoard上公开的方法,以查看是否存在一种可以更通用的方式公开诸如“在此坐标处取得成果”之类的方法。确保控制器需要在IBoard实例上调用的任何方法都是,而IBoard接口中的方法。

    例如,虽然要实现getAllValidSwitches()ArrayBoardSwitchController仅需要getPieceAt()方法,但与ListBoardSwitchController一起使用并不是一个好主意(在该类中,我在内部使用列表,因为这样比较容易检查移动是否有效) 。

    如果诸如“在此坐标处获取零件”之类的操作对IBoard接口有用,那么实现必须忠实于其合同并正确实施。听起来您的ListBoard不忠实于IBoard中列出的合同。

    08-25 15:52