-1

これが正しい場所かどうかはわかりません。しかし、私は非常に答えが必要です。

私はトーナメント管理用のプログラムを書いています。私は単純な問題を抱えていますが、私にとってはそれほど明確ではありません。

多くのクラブがあります (1 つの都市から 1 つのクラブ)。クラブには選手がいます。クラブのない選手はいません。

Player クラスと Club クラスがあります。クラブ クラスの選手のリストを保持するか、選手のクラブを彼のクラスに保持する必要がありますか? どちらの方法が良いでしょうか?

4

4 に答える 4

1

依存性注入を使用する場合、答えは、両方を行うことです。Club には、プレイヤー オブジェクトの配列を保持する配列構造があります。player には、Club オブジェクトを格納する club 変数があります。

于 2012-12-04T22:23:59.973 に答える
1

データをどのように使用する必要があるかによって異なります。

  • Playerですべての sを取得できるようにする必要がある場合Clubは、Clubクラスで s のリストを維持する必要がありますPlayer
  • Club特定の がPlayer属する を取得できるようにする必要がある場合、クラスは変数Playerを維持する必要があります。Club
  • 両方が必要な場合は両方を使用しますが、どちらかが変更されるたびに必ず同期させてください。

それらを同期させるには、基本的に各メソッドの 2 つの異なるバージョンが必要です。最初のバージョン (「パブリック」バージョン) は、呼び出しの副作用を自動的に処理し、2 つの表現を同期します。2 番目のバージョンは、最初のバージョンによって呼び出されるものです。無限ループにつながるため、同期は実行されません。

これは次のようになります。

  • Club.AddPlayer (プレーヤー プレーヤー、ブール値の sync=true)
    1. playerこのクラブの選手リストに追加します。
    2. 同期する場合:
      1. さんの現在のクラブRemovePlayer(player,false)に連絡してください。player
      2. に電話SetClub(this,false)してplayerください。
  • Club.RemovePlayer (プレーヤー player、ブール値 sync=true)
    1. playerこのクラブの選手リストから削除します。
    2. 同期する場合:
      1. コールしplayer.SetClub(null,false)ます。
  • Player.SetClub (クラブクラブ、boolean sync=true)
    1. プレーヤーのクラブを に設定しclubます。
    2. 同期する場合:
      1. プレーヤー クラブが でない場合はnull、コールRemovePlayer(this,false)します。
      2. そうclubでない場合はnull、 AddPlayer(this,false)` を呼び出します。

これは不必要に不格好に思えるので、他の誰かがより良いアイデアを持っていることを願っています... :-)

于 2012-12-04T22:18:29.227 に答える
1

すべてのプレイヤーはクラブを持っているため、クラブ クラスのプレイヤーのリストを保持します。これにより、特定のクラブのすべてのプレーヤーをすばやく簡単に列挙または検索できます。ただし、その親 Club を指す Player クラスにも参照を持たない理由はありません。各方向にリンクを持つ有効な使用例があるため、両方を行います。

各プレイヤーは 1 つのクラブにしか所属できないと想定しています。そうでない場合、事態はもう少し複雑になります。

C# での例: (コンパイル/テストされていないため、軽微なエラーが含まれている可能性があります)

public class Club
{
   // other class members

   // this is private so that code must use Club's methods to get at the Players
   private List<Player> _players;

   public int PlayerCount
   {
      get
      {
         return _players == null ? 0 : _players.Count;
      }
   }

   public void AddPlayer(Player p)
   {
      // null checking etc
      // here you could enforce a rule that p.ParentClub must be null
      // to prevent a Player from being in multiple Clubs
      p.ParentClub = this;
      _players.Add(p);
   }

   public void RemovePlayer(Player p)
   {
      // null checking etc
      _players.Remove(p);
      p.ParentClub = null;
   }
}

public class Player
{
   // other class members

   public Club ParentClub 
   { get; set; }
}

これで、次のようなことができます。

// add Player Joe to the London Club if it is not full (10 members max)
// otherwise add Joe to the Munich Club
if(londonClub.PlayerCount <= 10)
{
   londonClub.AddPlayer(joePlayer);
}
else
{
   munichClub.AddPlayer(joePlayer);
}

// print how many players are in the club that Joe is in
Console.WriteLine("Number of Players in Joe's Club: " + joePlayer.ParentClub.PlayerCount.ToString());

// move Joe to the Amsterdam club. Note that it does not matter what Club Joe was already in
joePlayer.ParentClub.RemovePlayer(joePlayer);
amsterdamClub.AddPlayer(joePlayer);
于 2012-12-04T22:19:02.667 に答える
0

目的に応じて、両方の方法でリンクできます。クラブクラスをalist<int> PlayerIdsで、プレーヤークラスをaでコーディングしint ClubId、操作に応じてどちらかを使用します。

たとえば、クラブページを表示する場合はクラブクラスを使用しやすく、プレーヤーページを表示する場合はプレーヤークラスを使用しやすくなります。

于 2012-12-04T22:24:20.910 に答える