将对象本身(this)传递给字段的方法是一种糟糕的方法吗?

h00*_*00s 5 java oop

我正在编写一个小游戏,我有两个类:BoardPiece.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习惯用法?提前谢谢你向我澄清这一点.

dar*_*jan 8

这不是一个糟糕的方法.传递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无法更改电路板的状态(在界面中,不要公开任何改变电路板状态的方法).