我正在编写一个小游戏,我有两个类:Board和Piece.Board(到目前为止)有一个Piece可以移动的边界Board.
public class Board {
private Piece piece_;
private int width, height;
...
movePieceDown() {
piece_.moveTo(this, 1, 2);
}
}
public class Piece {
public boolean moveTo(Board board, int x, int y) {
// move piece to new location (x,y)
// return true if successful
}
}
Run Code Online (Sandbox Code Playgroud)
如果我piece_.moveTo(this, 1, 2);通过参考董事会的话,这是不好的方法,如果船上没有障碍,那么Piece可以搬到新的位置?在没有通过参考董事会的情况下,Piece不知道新位置是否存在障碍或是否超出董事会边界.
在我看来,每个对象都应该只关心自己:片段应该移动到新位置,如果合法移动,董事会应该担心,但是我发布的这个示例代码更有意义并简化了事情.
TL; DR:我打破了一些OOP指南,将对象本身传递给了一个字段的方法,还是一些正常的OOP习惯用法?提前谢谢你向我澄清这一点.
这不是一个糟糕的方法.传递this给各种方法在编程中并不罕见.这取决于你的设计,就我而言,Piece课堂上没什么.
Board课堂上的一件事可能是令人困惑的 - movePieceDown方法.你有不可用的参数Board board.如果您打算将其this用作参数,请删除该属性,因为董事会不应将其他板作为潜在参数接收,事实上,不应该知道其他板可以存在.
最后,您可以确保Piece看到Board作为方法参数的接口,并确保该合约永远不会更改.例如,它可以有这些方法:
public interface IBoard {
public boolean isFieldFree(int x, int y)
public Piece getPiece(int x, int y)
}
Run Code Online (Sandbox Code Playgroud)
无论您以后如何更改董事会的实施,这都应该始终有效,因此您Piece在更改时无需重新编写代码Board.通过这种方式,您可以强制执行以下规则:Piece无法更改电路板的状态(在界面中,不要公开任何改变电路板状态的方法).
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |