C#などのオブジェクト指向言語で静的クラスを使用しているプログラマーを目にするたびに、彼らが間違っていることに気づきました。主な問題は明らかにグローバルな状態であり、実行時に、またはテスト中にモック/スタブを使用して実装を交換することの難しさです。
好奇心から、十分にテストされたプロジェクトを選択するプロジェクトのいくつかを見て、実際にアーキテクチャとデザインについて考えようと努力しました。私が見つけた静的クラスの2つの使用法は次のとおりです。
アプリケーションキャッシュ:そのための静的クラスの使用は明らかに間違っています。
MemoryCache
またはRedis に置き換えたい場合はどうなりますか?
.NET Frameworkを見ると、静的クラスの有効な使用例も見当たりません。例えば:
File
静的クラスを使用すると、代替クラスに切り替えるのが非常に困難になります。たとえば、分離ストレージに切り替えるか、ファイルをメモリに直接格納する必要がある場合、またはNTFSトランザクションをサポートできる、または少なくとも259文字を超えるパスを処理できるプロバイダーが必要な場合はどうでしょうか。持つ共通のインタフェースと複数の実装は、使用して同じように簡単現れるFile
コードベース要件の変更のほとんどを書き換えることではないの恩恵で、直接。Console
静的クラスはテストを非常に複雑にします。ユニットテスト内で、メソッドが正しいデータをコンソールに出力することをどのように確認すべきですか?Stream
実行時に注入される書き込み可能に出力を送信するようにメソッドを変更する必要がありますか?非静的コンソールクラスは、静的クラスと同じくらい単純で、静的クラスのすべての欠点がないように思われます。Math
静的クラスも適切な候補ではありません。任意精度の演算に切り替える必要がある場合はどうなりますか?それとも、より新しく、より高速な実装ですか?または、単体テスト中にMath
クラスの特定のメソッドが実際にテスト中に呼び出されたことを通知するスタブに?
Programmer.SEで、私は読んだ:
C#で「静的」を使用しないでください。一部の回答は、静的クラスに完全に反しています。他の人は、「静的メソッドは使用しても問題がなく、プログラミングで正当な場所がある」と主張しますが、引数でそれを焼き付けないでください。
シングルトンを使用する場合と静的クラスを使用する場合。ユーティリティクラスには問題があると上記で述べたので、ユーティリティクラスについて説明します。
なぜ、いつクラスを「静的」にする必要がありますか?クラスの「静的」キーワードの目的は何ですか?言及されている唯一の有効な使用法は、拡張メソッドのコンテナです。すごい。
拡張メソッドとは別に、静的クラスの有効な用途は何ですか。つまり、依存性注入またはシングルトンが不可能であるか、設計の品質が低下し、拡張性と保守が難しくなる場合ですか。
instanceof
)使用する能力が失われます。これは、2つのインスタンスが与えられた場合、IFoo
それらが同じクラスによってサポートされている保証がないためです。
YAGNI
、そしてあなたが文字列の異なる種類が必要な場合、あなたは自分のIDEは、のすべてのインスタンスを変更するために買ってあげることを受け入れるcom.lang.lib.String
にはcom.someones.elses.String
、コードベース全体に。