0

潜在的なゲームの基礎をレイアウトしていますが、カプセル化された効率的なクラスを設計するのに苦労しています。

一般に、モジュール性とカプセル化を維持するために、オブジェクトは相互にほとんど依存するべきではないと人々は言います。

ただし、あるオブジェクトがお互いを認識していることが便利な場合もあります。

Dogというクラスがあるとしましょう。

public class Dog {

  public void eat() { ... }
  public void wagTail() { ... }

}

犬には飼い主がいるので、犬の飼い主クラスがあります。

public class DogOwner {
  private Dog dog;

  public Dog getDog() { return dog; }
  public void petDog() { ... }
  public void takeDogForWalk() { ... }
}

Dogでは、 があり、その所有者がいない場合はどうなるでしょうか。getOwner()のメソッドを作るのは理にかなっているようですDog

public class Dog {
  private DogOwner owner;

  public void eat() { ... }
  public void wagTail() { ... }
  public DogOwner getOwner() { return owner; }

}

ただし、これはDogに関する情報を提供DogOwnerするようになりました。これは、情報隠蔽に違反しているようです。、およびがあるDogため、冗長性も作成されているようです。 DogOwnerDogOwnerDog

飼い主を見つけるもう 1 つの方法は、単純にすべての飼い主を調べて、対応する犬を見つけることです。Dogこれはとの依存関係を作成しませんがDogOwner、すべての所有者を循環する必要があるため、必要以上にコストがかかるようです。

では、方法DogがあってもgetOwner()よろしいでしょうか。Dogそうでない場合、所有者のみがわかっている場合に所有者に効率的にアクセスするために、他にどのような選択肢がありますか?

4

3 に答える 3

0

私はソフトウェア設計の実用主義者ではありませんが、これがあまりにも多くの設計原則に違反することになるとは思いません。それについてDog何かを「知る」ためには、のメソッドDogOwnerにアクセスする必要があります。DogOwnerだから、あなたは言っているのではなく、Dog.getDogOwnersNameそのようなことを言うでしょうDog.getOwner().getName(). このように、すべてのDog関心事はその所有者が誰であるかです。しかし、それ以上の情報は事実上隠されています。

于 2015-07-02T00:42:44.550 に答える
0

「ほとんど頼らないでください」 - 必要なだけ、多くても少なくてもいけません。

もちろん、犬はその所有者へのリンクを持つことができます。あなたは代替案について尋ねました.1つは、多くのコードが所有者を気にしない場合でも、犬と所有者の情報を常に一緒に運ぶことです。2つ目は、犬を飼っていて飼い主がわからない場合は、明らかに飼い主に尋ねることはできません。犬を飼い主にマッピングするハッシュ テーブルを作成することもできますが、犬を飼い主と一緒に保管することもできます。または、すべての犬の所有者のデータベースを持っていて、その犬の所有者をスキャンしますが、厳密にはスケーラブルではありません。

于 2015-07-02T00:42:54.313 に答える
0

こうすればいいと言う。ただし、Dog をキーとして、DogOwner を値として持つ辞書を使用することも考えられます (DogOwner は時間の経過とともに変化する可能性があるため)。これには、Dog/DogOwner 関係の 1 つの中央リポジトリを保持するという追加の利点もあります。

于 2015-07-02T00:51:27.517 に答える