XNAエンジンを作成していて、すべてのモデルをに格納していList
ます。これをエンジン全体で使用できるようにするために、これを作成して、public static List<Model>
開発した新しいクラスからアクセスできるようにしました。それは確かにモデルのリストを取得することも本当に簡単にしますが、これは正しい使用法ですか?または、メソッド宣言で実際に変数を渡す方がよいでしょうか?
5 に答える
OOPでは、非常に正当な理由がない限り、静的メソッドとプロパティの使用を避けることをお勧めします。その理由の1つは、将来、何らかの理由でこのリストの2つ以上のインスタンスが必要になる可能性があり、その後、静的呼び出しでスタックすることです。
静的なメソッドとプロパティは厳密すぎます。スティービーがそれを述べているように:
静的メソッドは花崗岩と同じくらい柔軟です。使用するたびに、プログラムの一部を具体的にキャストします。足が固まるのを見ているときに、足が詰まっていないことを確認してください。いつの日か、あなたは本当に、そのdang PrintSpoolerクラスの別の実装が本当に必要であり、それがインターフェース、ファクトリ、および一連の実装クラスであるはずであることに驚かれることでしょう。D'oh!
ゲーム開発については、「おそらく機能する可能性のある最も単純なことを行う」ことを提唱しています。それが簡単な解決策である場合、これにはグローバル変数(public static
C#)の使用が含まれます。後でいつでもより正式なものに変えることができます。Visual Studioの「すべての参照を検索」ツールを使用すると、これが非常に簡単になります。
そうは言っても、グローバル変数が実際に何かを行うための「正しい」方法である場合はほとんどありません。したがって、それを使用する場合は、正しい解決策を認識して理解する必要があります。したがって、「怠惰であること」と「優れたコードを書くこと」の間で最良のトレードオフを行うことができます。
グローバルなものを作る場合は、なぜそうするのかを完全に理解する必要があります。
この特定のケースでは、コンテンツを取得しようとしているように聞こえます。複数回要求すると、同じコンテンツオブジェクトContentManager
が自動的に返されることに注意してください。したがって、モデルをグローバルリストにロードするのではなく、クラスのビルトインをクラスのプロパティを介して利用できるようにすることを検討してください。Game
ContentManager
public static
Game
または、さらに良いことに、私が好む方法があります。それはもう少し良いと思います。別の質問への回答で説明します。基本的に、private static
それらを使用するクラスでコンテンツ参照を作成し、関数に渡しConentManager
ますpublic static LoadContent
。これにより、プログラム全体からアクセスされるグローバルを使用するのではなく、静的な使用を個々のクラスに区分します(後で解放するのは困難です)。また、適切なタイミングでコンテンツの読み込みを正しく処理します。
モデルリストをカプセル化するSingleonオブジェクトを実装することをお勧めします。MSDNシングルトン
の実装をご覧ください。
これはバランスとトレードオフの問題です。
もちろん、OOPの純粋主義者は、モジュールに「すぐに使える」ものを導入することでコードの区画化を破り、保守、変更、デバッグなどを困難にするため、このようなグローバル変数は絶対に避けてくださいと言うでしょう。
ただし、私の個人的な経験では、非常に大規模なエンタープライズクラスのアプリケーションを維持している、非常に大規模なエンタープライズソリューションチームの一員である場合にのみ回避する必要があります。
その他の場合、グローバルにアクセス可能なデータを「グローバル」オブジェクト(または静的オブジェクト、同じもの)にカプセル化すると、OOPコーディングが大幅に簡素化されます。
モデルのリストを返すグローバルなGetModels()関数を作成することで、中立的な立場を得ることができます。または、DIを使用して、モデルのリストを自動的に挿入します。