質問
静的クラスは悪い習慣とみなされますか?数日前、これに関する記事を読みました (見つけられませんでした、申し訳ありません)。その記事では、基本的に、静的クラス (特に「ヘルパー」クラス) は通常、コードが悪い兆候であると書かれていました。これは正しいのでしょうか?また、正しい場合、その理由は何ですか?
解決
静的クラスの乱用は悪い習慣であると考えられます。しかし、あらゆる言語機能の悪用も同様です。
私は、静的メソッドのみを備えた非静的クラスと静的クラスを区別しません。これらは事実上同じものですが、静的クラスを使用するとコンパイラーが開発者の意図を強制できる点が異なります (このクラスをインスタンス化せず、その機能にアクセスするための便利な構文、 等).
あなたが言うように、「ヘルパー」クラスが急増すると、問題が発生する可能性があります(デザイン、保守性、読みやすさ、発見しやすさ、その他の機能など)。ここでは議論の余地はありません。しかし、「ヘルパー」クラスは 一度もない 適切な?私はそれを疑う。
実際、静的クラスを責任を持って使用すると、コードに大きなメリットがもたらされます。
- の
Enumerable
静的クラスは、私たちのほとんどが愛用する一連の拡張メソッドを提供します。これらは、特定のタイプのインスタンスに関連しない機能/ビジネス ロジックの論理セットです。 - 環境/コンテキストによって提供されるサービス:例: ロギング、構成 (場合によって)
- その他 (現時点では思いつきません :))
いいえ、一般的には悪い習慣ではありません。賢く使ってください...
他のヒント
は、それが「静的クラスはしばしばひどく書かれたコードの中で発見された」「静的クラスの使用は間違っている」(この場合、記事が間違っている)、または意味しています(その場合、自分自身の静的なクラスが不良であることを言っていませんしかし、彼らは時々間違って使用されていること)
あなたがそれらを使用するか、またはメソッド呼び出しに「この」ポインタを渡すためにオブジェクトのインスタンスを作成する必要はありませんので、静的関数は非静的よりも効率的です。
グローバル変数を保持するために、静的クラスを使用することは別の問題である - 基本的なルールは、「静が悪い」ということではありませんが、「グローバルが悪い」、その場合には、
。私は、一般的な引数は、静的なクラスで変更可能な状態を維持し、基本的にはグローバル変数としてそれらを使用しないことだと思います。静的クラスの静的ヘルパーメソッドは何も問題はありません。
とグローバル変数が悪い理由として、私はここの間確信しているとあなたはそれについての半分百万のページやブログ記事を見つけることができますグーグルます。
いや、それは本当に正しいではありません。
があり、オブジェクトのインスタンスに固有ではない機能がたくさんあり、それは状態を必要としません。例えば、「数学」の機能を検討します。
ほとんどすべての言語のようなものを持っています:
y = Math.round(x);
だから、「ラウンド」関数は静的です。あなたは、あなたが狂った場合、(C#の)のような何かを主張することができます:
class RoundFunction<T> : GeneralMathFunction<T>
{
public override T Operate (params object[] variables) {
..
}
}
しかし、私見では、あなたがそうするように少し奇妙なことと思います。
確かに理由の中に、それは「悪い」ではない、そこにあまりにも多くの静的関数が間違って何かの予兆している時間があるが、ます。
ここでは、静的メソッドは、あなたのコードのテスト容易性を傷つけることができるだけでなく、なぜ(静的クラスの悪い部分である)の静的メソッドは、潜在的に驚くべきカップリングとの相互作用のすべての種類を紹介する理由について、いくつかのGoogleのテストブログ記事へのリンクですコンポーネント間ます。
あなたはすべてのメソッドは静的なユーティリティクラスを持っている必要性があります。あなたはクラスが静的にする場合その場合には、それは明らかに自分の意思を示しています。そして、少なくともC#で使用すると、静的クラス内の非静的メソッドを持っていないことができます。
私はかなり頻繁に呼び出されるメソッドのための私のコードで静的なユーティリティクラスのすべての時間を使用しますが、痛みはインスタンス化することです。例のようになりますような単純なロギングクラスます:
public static class Logging
{
public static UpdateAction(int id, object data)
{
SqlConnection connection = new SqlConnection("conn string from config file");
// more logic here...
}
}
さて、私が今までそれが巨大なconcurrancyの問題のために、一般的につながることができますので、これらのクラスとメソッドは、グローバル状態の任意の並べ替えを保存しなければならないのない方法でちょうど悪いデザインです。
だから、それらの静的クラスはグローバルな状態のいくつかの種類を維持することを避けるため、静的クラスを避けることはありません。