İletileri iletmesine veya almasına izin verilen çok iyi tanımlanmış bir arabirim kümesine sahip olmalısınız - onlara bir EventScheduler'a bir başvuru vermek önemsiz olmalıdır. Değilse veya olay planlayıcısını "çok fazla" farklı türe geçirmeyi gerektiriyorsa, ellerinizde daha büyük bir tasarım sorununuz olabilir (tek tektonların çözme değil, şiddetli bir bağımlılık) ).
Zamanlayıcıyı ihtiyacı olan arayüzlere geçirme tekniğinin bir " bağımlılık enjeksiyonu " biçimi olmasına rağmen, bu durumda yeni bir bağımlılık enjekte etmediğinizi unutmayın . Bu, sistemde zaten var olan bir bağımlılıktır, ancak şimdi bunu açık bir hale getiriyorsunuz (bir singletonun örtülü bağımlılığına karşı). Genel bir kural olarak, açık bağımlılıklar daha fazla kendi kendini belgelediklerinden daha fazla tercih edilir.
Ayrıca, etkinlik planlamasının tüketicilerini birbirinden ayırarak kendinize daha fazla esneklik sağlayabilirsiniz (hepsi aynı zamanlayıcıya bağlı olmaları gerekmediğinden), bu da yerel istemci / sunucu kurulumlarını veya bir dizi başka seçeneği test etmek veya simüle etmek için yararlı olabilir - bu diğer seçeneklere ihtiyacınız olmayabilir, ancak kendinizi bunlardan yapay olarak kısıtlamak için çaba sarf etmediniz, bu bir artı.
DÜZENLEME: Demek istediğim zamanlayıcıyı dolaşmaktan bahsettiğim şey şudur: çarpışmaya yanıt vermekten sorumlu bir oyun bileşeniniz varsa, muhtemelen fizik katmanınızın bir parçası olan bazı çarpışma cevaplayıcı fabrikası aracılığıyla yaratılır. Fabrikayı bir zamanlayıcı örneği ile oluşturursanız, bu örneği oluşturduğu yanıtlayıcılara iletebilir ve bu da olayları yükseltmek (veya belki de diğer olaylara abone olmak) için kullanabilir.
class CollisionResponderFactory {
public CollisionResponderFactory (EventScheduler scheduler) {
this.scheduler = scheduler;
}
CollisionResponder CreateResponder() {
return new CollisionResponder(scheduler);
}
EventScheduler scheduler;
}
class CollisionResponder {
public CollisionResponder (EventScheduler scheduler) {
this.scheduler = scheduler;
}
public void OnCollision(GameObject a, GameObject b) {
if(a.IsBullet) {
scheduler.RaiseEvent(E_BIG_EXPLOSION);
}
}
EventScheduler scheduler;
}
Bu açıkça nesne modelinin ne olduğunu bilmediğim için çok şık ve basitleştirilmiş bir örnek; bununla birlikte, olay zamanlayıcısına bağımlılığın açık hale getirildiğini gösterir ve daha fazla kapsülleme için bir miktar potansiyel gösterir (yanıtlayıcıları, Zamanlayıcı aracılığıyla olayları yükseltmek için somun ve cıvatalarla uğraşan fabrika.Bu, her bir bireysel yanıtlayıcı uygulamasını, sisteminiz için ideal olabilecek çarpışmada hangi özel olayın yükseltileceği gibi olay sevk sisteminin uygulama detaylarından izole edecektir. - ya da değil).