单一职责原则 - 棋盘棋子

4

将单一职责原则应用于棋盘应用程序,Piece接口/类应该负责什么?

我确定它需要知道它的颜色、类型和有效移动。但是它是否也应该知道它在棋盘上的位置(x/y)?或者,棋盘应该知道每个棋子的位置。

这个决定也会对棋子如何移动产生一些影响,例如,棋盘是否决定棋子的有效移动等等。


2
你可能对Eric Lippert的这个系列感兴趣:http://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/。他审查了将游戏规则编码为游戏角色的属性和方法的模式,并最终拒绝了它作为不合适的模式。例如,给定棋子的有效移动应该在对象模型中表示为*规则*对象或类似的内容。(这也将使您的程序更容易处理Chess960或另一个[变体](https://en.wikipedia.org/wiki/List_of_chess_variants))。 - phoog
你能否用行为来指定职责,而不是知识?如果一个棋子知道它的位置,那么需要知道关于位置的行为是什么?对于棋盘也是如此。顺便说一下,你可能想读一下这篇非常好的关于SRP的文章:http://blog.8thlight.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html - Nghia Bui
1个回答

2

您考虑将 PieceOnBoard 作为一个不同于 Piece 的实体是正确的。

有几种方法可以实现它 - 但通常您需要将适用于象棋中的车的方面与它参与特定对弈的具体车分开。

您可以将 Piece 设计为一个接口,该接口根据 PieceOnBoad 和 BoardPosition 给出有效移动,它可以拥有特定于不同类型棋子的具体实现。这个类的实现对于 "Rook" 将对应于 "Rook in General"。

PieceOnBoard 将由 Piece、Color 和 BoardPosition 的组合而成。PieceOnBoard 的每个特定实例将对应于参与特定棋局的特定车。

然后,BoardPosition 可以仅仅是一组 PieceOnBoard 对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接