これが正しい場所かどうかはわかりません。しかし、私は非常に答えが必要です。
私はトーナメント管理用のプログラムを書いています。私は単純な問題を抱えていますが、私にとってはそれほど明確ではありません。
多くのクラブがあります (1 つの都市から 1 つのクラブ)。クラブには選手がいます。クラブのない選手はいません。
Player クラスと Club クラスがあります。クラブ クラスの選手のリストを保持するか、選手のクラブを彼のクラスに保持する必要がありますか? どちらの方法が良いでしょうか?
依存性注入を使用する場合、答えは、両方を行うことです。Club には、プレイヤー オブジェクトの配列を保持する配列構造があります。player には、Club オブジェクトを格納する club 変数があります。
データをどのように使用する必要があるかによって異なります。
Playerですべての sを取得できるようにする必要がある場合Clubは、Clubクラスで s のリストを維持する必要がありますPlayer。Club特定の がPlayer属する を取得できるようにする必要がある場合、クラスは変数Playerを維持する必要があります。Clubそれらを同期させるには、基本的に各メソッドの 2 つの異なるバージョンが必要です。最初のバージョン (「パブリック」バージョン) は、呼び出しの副作用を自動的に処理し、2 つの表現を同期します。2 番目のバージョンは、最初のバージョンによって呼び出されるものです。無限ループにつながるため、同期は実行されません。
これは次のようになります。
playerこのクラブの選手リストに追加します。RemovePlayer(player,false)に連絡してください。playerSetClub(this,false)してplayerください。playerこのクラブの選手リストから削除します。player.SetClub(null,false)ます。clubます。null、コールRemovePlayer(this,false)します。clubでない場合はnull、 AddPlayer(this,false)` を呼び出します。これは不必要に不格好に思えるので、他の誰かがより良いアイデアを持っていることを願っています... :-)
すべてのプレイヤーはクラブを持っているため、クラブ クラスのプレイヤーのリストを保持します。これにより、特定のクラブのすべてのプレーヤーをすばやく簡単に列挙または検索できます。ただし、その親 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);
目的に応じて、両方の方法でリンクできます。クラブクラスをalist<int> PlayerIdsで、プレーヤークラスをaでコーディングしint ClubId、操作に応じてどちらかを使用します。
たとえば、クラブページを表示する場合はクラブクラスを使用しやすく、プレーヤーページを表示する場合はプレーヤークラスを使用しやすくなります。