25

静的クラスは悪い習慣と見なされますか? 数日前にこれに関する記事を読みました (見つけられませんでした、申し訳ありません)。基本的に、静的クラス (特に「ヘルパー」クラス) を持つことは通常、悪いコードの兆候であると述べていました。これは正しいですか、そうである場合、その理由は何ですか?

4

7 に答える 7

28

静的クラスの悪用は悪い習慣と見なすことができます。しかし、言語機能の乱用も同様です。

静的メソッドのみを持つ非静的クラスと静的クラスを区別しません。静的クラスは、コンパイラが開発者の意図を強制できることを除いて、事実上同じものです (このクラスをインスタンス化しない、その機能にアクセスするための便利な構文など)。

あなたが言うように、「ヘルパー」クラスが急増すると、問題が発生する可能性があります (設計、保守性、可読性、発見可能性、その他の機能...)。ここに議論はありません。しかし、「ヘルパー」クラスは決して適切ではないと主張できますか? 疑わしい。

実際、静的クラスを責任を持って使用すると、コードに大きなメリットがもたらされます。

  • static クラスは、Enumerable私たちの多くが気に入っている一連の拡張メソッドを提供します。それらは、特定のタイプのインスタンスに関連付けられていない機能/ビジネス ロジックの論理セットです。
  • 環境/コンテキストによって提供されるサービス: 例: ロギング、構成 (場合によって)
  • その他(現時点では思いつきません:))

いいえ、一般的には悪い習慣ではありません。それらを賢く使ってください...

于 2009-08-22T06:09:11.297 に答える
7

一般的な議論は、静的クラスで可変状態を維持し、基本的にそれらをグローバル変数として使用することに反対していると思います。静的クラスの静的ヘルパー メソッドには何の問題もありません。

そして、なぜグローバル変数が悪いのかについては、こことグーグルの間で、それに関する50万のページとブログ投稿を見つけることができると確信しています.

于 2009-08-22T04:22:11.827 に答える
4

いや、それは本当に正しくない。

オブジェクトのインスタンスに固有ではなく、状態を必要としない関数はたくさんあります。たとえば、「数学」関数を考えてみましょう。

ほとんどすべての言語には次のようなものがあります。

y = Math.round(x);

したがって、「ラウンド」関数は静的です。あなたが狂っているなら、(C#)のようなものについて議論することができます:

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

しかし、私見ですが、そうするのは少し奇妙です。

確かに、あまりにも多くの静的関数が何か問題が発生している兆候である場合がありますが、当然のことながら、それは「悪い」ものではありません。

于 2009-08-22T04:04:03.483 に答える
4

それは「静的クラスの使用が間違っている」(この場合は記事が間違っている) という意味ですか、それとも「静的クラスはよく書かれていないコードに見られる」(この場合、静的クラス自体が悪いと言っているのではなく、間違って使われることもあります)

静的関数は、それらを使用するためにオブジェクトのインスタンスを作成したり、メソッド呼び出しに「this」ポインターを渡したりする必要がないため、非静的関数よりも効率的です。

グローバル変数を保持するために静的クラスを使用することは別の問題です。その場合、基本的なルールは「静的は悪い」ではなく、「グローバルは悪い」ということです。

于 2009-08-22T06:07:13.657 に答える
2

静的メソッドがコードのテスト可能性を損なう可能性がある理由、および静的メソッド (静的クラスの悪い部分) があらゆる種類の潜在的に驚くべき結合とコンポーネント間の相互作用を導入する理由について、いくつかの Google テスト ブログ投稿へのリンクを次に示します。

〇についてどう考えるか

シングルトン

static-methods-are-death-to-testability

于 2009-08-22T04:36:04.370 に答える
1

すべてのメソッドが静的である Utility クラスが必要な場合があります。その場合、クラスを静的にすると、意図が明確になります。少なくとも C# では、静的クラス内に非静的メソッドを含めることはできません。

于 2009-08-22T04:18:02.740 に答える