このMicrosoft.Xna.Framework.Game
クラスには、プログラマーがクラスのタイプとクラスのインスタンスをAddメソッドに提供することによってゲームにサービスを追加できるようにするServicesプロパティがあります。
これで、AudioComponent
を必要とするすべてのクラスとメソッドにを渡す代わりに、Game
インスタンスを渡してサービスを検索するだけです。(サービスロケーター)
ゲームには多くのサービス(GraphicsDevice、SceneGraph、AudioComponent、EffectsManagerなど)があるため、基本的にはすべてにGameを渡します。
では、なぜこれらのインスタンスをシングルトンにしないのですか?まあ、シングルトンはグローバルな状態を持ち、テストを防ぎ、設計をはるかに脆弱にするため、悪いからです。サービスロケーターは、オブジェクトへの依存関係を渡すだけでなく、そのクラスを他のサービスと結合するサービスロケーター(ゲーム)を渡すため、多くの人にとってアンチパターンと見なされます。
では、なぜXNAおよびゲーム開発でサービスが推奨されるのでしょうか。それは、ゲームが通常のプログラムとは異なり、それらのコンポーネントと密接に絡み合っており、クラスの機能に必要なすべてのコンポーネントを渡す必要が非常に煩雑になるためでしょうか?そのとき、ゲームサービスはゲームデザインに必要な悪ですか?長いパラメーターリストと結合を含まない代替手段はありますか?