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