サンプルのゲーム エンジン サーバーでは、ゲームの世界を World オブジェクトで表すことができます。ゲームには複数のゲーム ワールドがある場合があり、ワールドにいるプレーヤーは、そのワールド内のユニットの位置データのみを受け取る必要があります。
class World
{
public List<Unit> Units { get; set; }
}
ただし、コードの一部は、ユニットがどのワールドにいるかを簡単に調べることができる必要もあります。そのため、ユニット オブジェクト自体がワールド参照を追跡します。
class Unit
{
public World World { get; set; }
}
これはルックアップには機能しますが、プログラマーがオブジェクト間の関係を認識していないときにデータを変更するとすぐに問題が発生するため、 を読み取り専用に変更Units
しWorld
、 に次のコードを追加しましたUnit
。
public virtual World World
{
get { return _world; }
set
{
// Unit must always be in a world
Contract.Requires<ArgumentNullException>(value != null);
// If already this, don't do anything
if (value == _world) return;
var oldWorld = _world;
_world = value;
if(oldWorld != null) oldWorld.UpdateUnitEntry(this);
_world.UpdateUnitEntry(this);
}
}
これは機能しますが、これを行うためのより良い方法があるように感じます。特に、同じ方法でリンクする必要があるものを追加すると (a にWorld
もStructure
s とPlayer
s があります)、多くの繰り返し機能が入ります。両側を手動で更新せずに、この 1 対多の関係を実現するより良い方法はありますか? ?