ASP.NET で静的関数を使用するのが最適なのはどのような場合ですか?
-
12-09-2019 - |
質問
ASP.NET で静的関数を使用する場合と使用しない場合について疑問に思っています。
パフォーマンス、優れた慣行に従うなどのさまざまな側面で、それらを使用する場合の利点と欠点は何ですか (その他、関連性があると思われるものは何でも)。
解決
短所:
- スレッドの問題 (静的関数はインスタンスを呼び出す必要がないため、コードの別の部分から簡単に呼び出すことができます。共有状態への読み取り/書き込みを行うと、マルチスレッド環境ではこの状態が破損する可能性があります) ASP.NETなど)
- 単体テストが難しい (静的関数はオブジェクト インスタンスを必要としないため、コンストラクターの注入は不可能です。つまり、依存関係を注入する唯一の方法は、依存関係を関数自体に引数として渡すことです)
長所:
- パフォーマンス (これには疑問があります。ほとんどの場合、パフォーマンスの向上は、コードの他の部分に比べてまったく無視できるほどです)
他のヒント
静的は、任意のアプリケーションと同じように、適切な解決策である状況は間違いなくあります。いつでもあなたがアプリケーションスコープで生きるべきいくつかのオブジェクトを持って、そしてない要求スコープで、それは静的である必要があり、あなたがそれにアクセスして操作するための静的メソッドを使用する必要があります。
例として、ここで私は基本的にシリアライザのキャッシュであるASP.NETアプリケーションのために最近書いたコードの抜粋です。シリアライザは、作成するには高価であり、私たちは、限り、私たちのアプリケーション・生活などのためのタイプごとに同じものを再利用することができますので、彼らのために各要求スレッドで時間を無駄にする必要はありません。
(注:これは、静的な側面を示すためにストリップダウンされています)。
public class XmlSerializerUtility
{
private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();
private static object sync = new object();
public static T Deserialize<T>(string input)
{
XmlSerializer xs = GetSerializer(typeof(T));
using (StringReader sr = new StringReader(input))
{
return (T)xs.Deserialize(sr);
}
}
public static XmlDocument Serialize(object input)
{
XmlDocument doc = new XmlDocument();
XmlSerializer xs = GetSerializer(input.GetType());
using (MemoryStream stream = new MemoryStream())
{
xs.Serialize(stream, input);
stream.Position = 0;
doc.Load(stream);
}
return doc;
}
private static XmlSerializer GetSerializer(Type type)
{
lock (sync)
{
XmlSerializer xs = null;
if (!serializers.ContainsKey(type))
{
xs = new XmlSerializer(type);
serializers.Add(type, xs);
}
else
{
xs = serializers[type];
}
return xs;
}
}
}
静的メソッドへの唯一の主要な欠点は、それがほぼ完全に非ユニットテスト可能だということです。メソッドのユーザーは、具体的な方法にバインドする必要があるため、偽造または不可能ではないにしても難しいあざける作り、抽象化にバインドすることはできません。
これはまたはただし、コードに応じて、問題であってもなくてもよいです。
あなたが気をつけたい他の事は、静的なデータがサーバへのすべての要求にわたって普遍的であるということです。
所属していません StackOverflow