我正在尝试设计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
的实现在ArrayBoard
和ListBoard
上将完全不同。例如,虽然实现getAllValidSwitches()
时仅需要ArrayBoardSwitchController
方法,但使用getPieceAt()
并不是一个好主意(在该类中,我在内部使用列表,因为这样比较容易检查移动是否有效)。据我所知,有两种可能的解决方案:
ListBoardSwitchController
和ISwitchController
接口。这样我只会游戏和棋盘(而
基本上,游戏只是一个
董事会的控制者
将是拥有所有
游戏逻辑)。不会那么好
因为课程不会
如果我有的话,尽可能地凝聚力
3个不同的类别。
我需要与公众合作的所有方法
在具体的课程中。例如,如果我需要
IBoard
方法,我将其公开在
getYellowPiecesList()
上,以便ListBoard
可以用它。
ListBoardSwitchController
只会了解它,因为它知道它仅适用
针对
ListBoardSwitchController
。 您对此事有何看法?这里的重点不是如何设计“宝石迷阵”游戏,而是如何解决此问题,这是您尝试实现算法时经常发生的问题:一方面,您希望有一个清晰而良好的OOP设计,另一方面,您希望拥有一个清晰而良好的OOP设计。有时会妨碍合理而有效的算法实现。
最佳答案
这里的主要问题是SwitchController的实现在ArrayBoard和ListBoard上将完全不同。
如果是这种情况,那么听起来您对IBoard
接口的设计还不够好,因此类可以在不了解实现细节的情况下使用IBoard
的实现。如果IBoard
的用户需要知道正在使用什么实现,那么它几乎无法实现拥有接口的目的!
我强烈建议您重新访问要在IBoard
上公开的方法,以查看是否存在一种可以更通用的方式公开诸如“在此坐标处取得成果”之类的方法。确保控制器需要在IBoard
实例上调用的任何方法都是,而是IBoard
接口中的方法。
例如,虽然要实现getAllValidSwitches()ArrayBoardSwitchController仅需要getPieceAt()方法,但与ListBoardSwitchController一起使用并不是一个好主意(在该类中,我在内部使用列表,因为这样比较容易检查移动是否有效) 。
如果诸如“在此坐标处获取零件”之类的操作对IBoard
接口有用,那么实现必须忠实于其合同并正确实施。听起来您的ListBoard
不忠实于IBoard
中列出的合同。