5

私は小さなゲームをプログラミングしており、2 つのクラスがあります:BoardPiece. の境界線で移動できるBoardものを (これまでのところ) 持っています。PieceBoard

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
  }
}

piece_.moveTo(this, 1, 2);ボードに障害物がなければピースが新しい場所に移動できるように、ボードへの参照をパスするのは悪いアプローチですか? Board への参照を渡さないと、Piece は新しい場所に障害物があるのか​​、それとも Board の境界から外れているのかを知りません。

私の意見では、すべてのオブジェクトは自分自身だけを心配する必要があります。ピースは新しい場所に移動し、ボードはそれが合法的な移動かどうかを心配する必要がありますが、私が投稿したこのサンプルコードはより理にかなっていて物事を簡素化します.

TL;DR: オブジェクト自体をフィールドのメソッドに渡すことで OOP ガイドラインに違反していますか、それとも通常の OOP イディオムですか? これを私に明確にしていただきありがとうございます。

4

7 に答える 7

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) 
}

後で Board の実装をどのように変更しても、これは常に機能するはずなのでPiece、 を変更するときにコードを作り直す必要はありませんBoard。このようにして、ボードの状態を変更できないというルールを適用できPieceます (インターフェイスでは、ボードの状態を変更するメソッドを公開しないでください)。

于 2013-06-26T12:00:20.433 に答える
2

一般的に合格thisは珍しくありませんが、ケースによって異なります。この場合、それが神であるかどうかは、実装の詳細に依存します。ABoardには動き回ることができるパイプがいくつかあるため、位置はピースのプロパティです。ただし、ピースをある場所から別の場所に移動することは、ボードの機能である可能性があります。たとえば、新しい場所がすでに占有されている場合はどうなりますか? 駒は他の駒を動かしますか?これはあなたのデザインに適していますか?

駒の署名から、moveTo 関数がボードを受け入れることが期待できます。これは、駒があるボードから別のボードに移動できることを示しています。コードを読むと、実際にそうならない限り、誤解を招く可能性があります。

于 2013-06-26T12:05:30.163 に答える
1

見出しの特定の質問にのみ答える (オブジェクト指向設計に関する一般的な意見ではない): いいえ、それは悪い習慣ではなく、むしろ一般的です。

ただし、コンストラクターで外部の世界に渡すthisことはお勧めできません。これは、受信者がソースを一貫性のない状態で見る可能性があるという同時シナリオで厄介なバグにつながる可能性があるためです。

于 2013-06-26T12:13:45.577 に答える
0

これは、通常のメソッド呼び出しで暗黙的に渡されます。フォーラムで見つけたこの回答を読んでください。

これについては、 JVM 仕様を読むこともできます。

于 2013-06-27T12:21:18.193 に答える