静的クラスは、適切な場所で使用されている限り、問題ありません。
「リーフ」メソッド(状態を変更しないで、入力を何らかの形で変換するだけのメソッド)。これの良い例はPath.Combineのようなものです。これらの種類のものは便利であり、より簡潔な構文にします。静と私が持っている
問題が多数である:まず
、あなたは静的なクラスを持っている場合、依存関係が隠されています。以下を考慮してください:
public static class ResourceLoader
{
public static void Init(string _rootPath) { ... etc. }
public static void GetResource(string _resourceName) { ... etc. }
public static void Quit() { ... etc. }
}
public static class TextureManager
{
private static Dictionary<string, Texture> m_textures;
public static Init(IEnumerable<GraphicsFormat> _formats)
{
m_textures = new Dictionary<string, Texture>();
foreach(var graphicsFormat in _formats)
{
// do something to create loading classes for all
// supported formats or some other contrived example!
}
}
public static Texture GetTexture(string _path)
{
if(m_textures.ContainsKey(_path))
return m_textures[_path];
// How do we know that ResourceLoader is valid at this point?
var texture = ResourceLoader.LoadResource(_path);
m_textures.Add(_path, texture);
return texture;
}
public static Quit() { ... cleanup code }
}
TextureManagerを見ると、どのような初期化ステップがコンストラクタを見ることによって実行されなければならないかはわかりません。依存関係を見つけて、正しい順序で物事を初期化するには、クラスを掘り下げて調べる必要があります。この場合、実行する前にResourceLoaderを初期化する必要があります。この依存関係の悪夢を拡大し、おそらく何が起こるかを推測することができます。明示的な初期化の順序がない場合、コードを維持しようとしているとします。これをインスタンスとの依存関係注入と対照的にしてください。その場合、コードはでも、依存関係が満たされていない場合をコンパイルしません。
さらに、状態を変更する統計情報を使用すると、カードのようなものになります。誰が何にアクセスできるか分からず、デザインはスパゲッティモンスターに似ています。
最後に、重要なことに、統計を使用すると特定の実装にプログラムが結び付けられます。静的コードは、テスト容易性のための設計の逆です。静的に包括されたテストコードは悪夢です。静的な呼び出しは、静的型を模倣するために特別に設計されたテストフレームワークを使用していない限り、テストの倍精度型ではスワップできません。したがって、静的なシステムは、それを使用するすべてのものを即時統合テストにします。
簡潔に言えば、いくつかのものは静的であり、小さなツールや使い捨てのコードでは、私はその使用を妨げません。しかし、それを超えて、メンテナンス性、デザイン性、テスト容易性という点では、厄介な悪夢です。ここで
は問題には良い記事です:http://gamearchitect.net/2008/09/13/an-anatomy-of-despair-managers-and-contexts/
これは私が解決しなければならなかったまさに問題だった - シングルトンオブジェクトの使用、またはむしろ誤用。 – overslacked
そのすばらしい答えをありがとう。私の質問は、シングルトンが静的メソッドにパラメータとして渡された場合、静的メソッドが安全でないことになりますか? –
"純関数"と "不純な関数"という用語は、関数型プログラミングで与えられた名前で、 "安全"と "安全でない"という統計に与えられた名前です。 – Omnimike