静的メソッドで満たされたユーティリティクラスが大好きでした。彼らは、さもなければ冗長性とメンテナンスの地獄を引き起こすことの周りにあるヘルパーメソッドの素晴らしい統合を作りました。それらは非常に使いやすく、インスタンス化も廃棄もありません。ただ火をお忘れなく。これは、サービス指向アーキテクチャーを作成するための私の最初の無意識の試みだったと思います。しかし、システムが成長するにつれて、ドラゴンがやってきます。
ポリモーフィズム
幸福にうなり声を上げるUtilityClass.SomeMethodメソッドがあるとします。突然、機能を少し変更する必要があります。ほとんどの機能は同じですが、それでもいくつかの部分を変更する必要があります。静的メソッドでなければ、派生クラスを作成し、必要に応じてメソッドの内容を変更できます。静的メソッドなので、できません。もちろん、古いメソッドの前または後に機能を追加する必要がある場合は、新しいクラスを作成して、その中にある古いクラスを呼び出すことができます。
インターフェースの問題
静的なメソッドは、論理的な理由により、インターフェースを介して定義できません。また、静的メソッドをオーバーライドすることはできないため、静的クラスをインターフェイスで渡す必要がある場合は、静的クラスは役に立ちません。これにより、戦略パターンの一部として静的クラスを使用できなくなります。インターフェースの代わりにデリゲートを渡すことにより、いくつかの問題にパッチを当てるかもしれません。
テスト
これは基本的に、上記のインターフェースの問題と関連しています。実装を交換する能力は非常に限られているため、製品コードをテストコードに置き換えるのも困難です。繰り返しになりますが、それらをラップすることはできますが、実際のオブジェクトの代わりにラッパーを受け入れることができるようにするために、コードの大部分を変更する必要があります。
ブロブを促進する
静的メソッドは通常ユーティリティメソッドとして使用され、ユーティリティメソッドは通常異なる目的を持つため、一貫性のない機能で満たされた大きなクラスにすぐに到達します-理想的には、各クラスはシステム内で単一の目的を持つ必要があります。目的が明確に定義されている限り、クラスは5倍にしたほうがいいです。
パラメータクリープ
そもそも、かわいくて無邪気な静的メソッドは、単一のパラメーターを取るかもしれません。機能が成長するにつれて、いくつかの新しいパラメーターが追加されます。間もなくオプションのパラメーターが追加されるため、メソッドのオーバーロードを作成します(または、パラメーターをサポートする言語でデフォルト値を追加します)。やがて、10個のパラメーターを取るメソッドがあります。最初の3つだけが本当に必要で、パラメーター4から7はオプションです。しかし、パラメーター6が指定されている場合、7〜9も入力する必要があります...この静的メソッドが行ったことを単一の目的で行うクラスを作成した場合、必要なパラメーターをコンストラクターを使用して、ユーザーがプロパティを介してオプションの値を設定したり、複数の相互依存値を同時に設定したりするメソッドを使用できます。また、メソッドがこの程度の複雑さまで成長した場合、
理由もなくクラスのインスタンスを作成するよう消費者に要求する
最も一般的な引数の1つは、クラスのコンシューマーが、後でこのインスタンスを使用しないで、この単一のメソッドを呼び出すためのインスタンスを作成することを要求するのはなぜですか?クラスのインスタンスの作成は、ほとんどの言語で非常に安価な操作であるため、速度は問題になりません。消費者に追加のコード行を追加することは、将来的にはるかに保守可能なソリューションの基盤を構築するための低コストです。最後に、インスタンスの作成を避けたい場合は、簡単に再利用できるようにするクラスのシングルトンラッパーを作成するだけです。ただし、これにより、クラスがステートレスであることが必要になります。ステートレスではない場合でも、すべてを処理する静的なラッパーメソッドを作成しながら、長期的にはすべての利点を利用できます。最後に、
絶対的に扱うのはシスだけです
もちろん、静的メソッドの嫌いには例外があります。肥大化へのリスクをもたらさない真のユーティリティクラスは、静的メソッド(System.Convertなど)の優れたケースです。プロジェクトが将来のメンテナンスを必要としない1回限りのものである場合、全体的なアーキテクチャはそれほど重要ではありません-静的か非静的かは重要ではありません-開発速度は重要です。
標準、標準、標準!
インスタンスメソッドを使用しても、静的メソッドの使用が妨げられることはなく、その逆も同様です。差別化の背後に理由があり、それが標準化されている限り。さまざまな実装方法で広がっているビジネスレイヤーを見ることほど悪いことはありません。