Saya sering menggunakan pendekatan ini dalam permainan C # /. NET saya sendiri. Selain manfaat lain (dan bahaya!) Yang dijelaskan di sini, ini juga dapat membantu menghindari masalah serialisasi.
Jika Anda ingin memanfaatkan fasilitas serialisasi biner .NET Framework bawaan, maka menggunakan ID entitas dapat membantu meminimalkan ukuran grafik objek yang ditulis. Secara default, pemformat biner .NET akan mengeluarkan serial seluruh objek grafik di tingkat bidang. Katakanlah saya ingin membuat serial sebuah Ship
instance. Jika Ship
memiliki _owner
bidang referensi Player
siapa yang memilikinya, maka Player
instance itu akan keluar juga. Jika Player
berisi _ships
bidang (dari, katakanlah ICollection<Ship>
), maka semua kapal pemain juga akan ditulis, bersama dengan benda lain yang dirujuk di tingkat bidang (secara rekursif). Sangat mudah untuk secara tidak sengaja membuat serial grafik objek yang besar ketika Anda hanya ingin membuat serialisasi satu bagian kecil saja.
Sebaliknya, jika saya memiliki _ownerId
bidang, maka saya bisa menggunakan nilai itu untuk menyelesaikan Player
referensi sesuai permintaan. API publik saya bahkan dapat tetap tidak berubah, dengan Owner
properti hanya melakukan pencarian.
Sementara pencarian berbasis hash umumnya sangat cepat, overhead yang ditambahkan bisa menjadi masalah untuk set entitas yang sangat besar dengan pencarian sering. Jika itu menjadi masalah bagi Anda, Anda bisa menyimpan referensi dengan menggunakan bidang yang tidak diserialisasi. Misalnya, Anda dapat melakukan sesuatu seperti ini:
public class Ship
{
private int _ownerId;
[NonSerialized] private Lazy<Player> _owner;
public Player Owner
{
get { return _owner.Value; }
}
public Ship(Player owner)
{
_ownerId = owner.PlayerID;
EnsureCache();
}
private void EnsureCache()
{
if (_owner == null)
_owner = new Lazy<Player>(() => Game.Current.Players[_ownerId]);
}
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
EnsureCache();
}
}
Tentu saja, pendekatan ini juga dapat membuat serialisasi lebih sulit ketika Anda benar - benar ingin membuat serial objek grafik besar. Dalam hal ini, Anda perlu merancang semacam 'wadah' untuk memastikan bahwa semua benda yang diperlukan disertakan.