質問
静的ユーティリティ メソッドは一般に、OO 純粋主義者によって嫌われます。
しかし私は、アプリケーション全体での null チェックのような単純なものを回避するために使用されるユーティリティ メソッドについて人々がどのように感じているのか疑問に思っていました。
String.trim()
null 文字列で呼び出された場合は NPE をスローします。だから私はしなければなりません:
if(str!=null)
setValue(str.trim());
else
setValue("");
null をチェックするユーティリティ メソッドを作成したらどうなるでしょうか?
setValue(myTrim(str));
public static String myTrim(String str) {
if(str==null) return ""
else return str.trim();
}
このようなメソッドで私が遭遇した問題の 1 つは、チームの一部の開発者がこのユーティリティを好まない、または知らない可能性があり、null 比較を行った後に直接呼び出しを行っている可能性があることです。
これはあなたのフレームワークでもやっていることでしょうか?「はい」の場合、人々が作成し、アプリケーションで使用している他の一般的なユーティリティの一般的な使用方法は何ですか?
どちらのアプローチの長所と短所は何だと思いますか?
解決
既存のライブラリ (Apache Commons など) がすでに独自の使用法を記述している場合、私はそれを置き換える傾向があります。コードを他の人にオフロードできるため、自分の作業を他の人の作業と真に区別するソフトウェアの重要な部分に集中できます。しかし、確かに、自分で記述する必要がある場合には、静的メソッドを備えたユーティリティ クラスが最適です。
参考までに、見てください StringUtils.trimToEmpty(). 。幸運を。
他のヒント
のチームのいくつかの開発者は、/ の
このユーティリティを知らないようではないかもしれません
これは通信がために良いものです。そして私は、電子メールを意味するものではありません。
機能のこれらの種類についてが語る、おそらく他のチームメンバーが同じことをやって、あなたは、コードと努力を複製しているcommunitatingないことによっています。
あなたはこれらのユーティリティメソッドを使用する方法を見つけることがあり、あるいはいくつかのより多くの経験を積んだ開発者はすでに、より成熟したLIBを開発したり、サードパーティを使用していmigthます。
しかし、すべての手段によって、あなたのチームの
との通信私はOOの純粋主義者ではありませんよ。だから私はこのようなものが大好きです。それが簡単に無関係な詳細に行き詰まる取得せずに自分の意図を反映したコードを書くことができます何か。
それを書きます。それを自分で使用してください。恥ずかしがらないでください - は証明のそれはあなたのコードになりますどのくらいのクリーナー。最悪の場合、少なくとも... あなたののコード内のビット以下の繰り返しがあります。
設計原則の観点から言えば、より論理的に静的なメソッドに過ぎないものもいくつかあります。作成しているユーティリティ クラスに実際には「状態」がなく、多数の静的メソッドを使用してインスタンス化不可能にする方が論理的であると思われる場合は、そのようにします。ただし、クラスが本当にインスタンス化できないことを確認してください (プライベート コンストラクターを指定します。クラスを抽象クラスとして宣言している人を見たことがありますが、それはオーバーライドできるため、それは役に立ちません)。
その場合に直面する問題は、 クラスがプロジェクト全体にわたる場合は、それをライブラリ クラスとして扱う必要があります。. 。また、ライブラリの作成は、一般的なコードの作成とは異なります。
- 一般的なコードでは、時期尚早に最適化するのではなくプロファイリングを行う必要があります。しかし、ライブラリ メソッドでは、人々が将来どのように通話を使用するかを予測できません。
- メソッドの動作を文書化するか、明確に名前を付けるには細心の注意を払う必要があります。
- あなたはそれを与える必要があります ジェネリック その時点で必要な特定の機能 (例:「文字列をトークン化する」メソッドがある場合、空のトークンをどうしますか?もし あなた それらを無視する必要がありますが、 他の メソッドの呼び出し元?)
私はただのお気に入りの静的メソッドが含まれているいくつかのクラスを持っています。あなたは、任意およびすべての境界条件をチェックする大規模なユニットテストを一緒に置くことができます。
あなたがが説明した場合には - setValueメソッドは、それに送られた任意の文字列を受け入れる作る方が良いのではないでしょうか?この方法は、その値が正しくなかった場合に例外をスローしても、それをトリミングしたり、デフォルトのNULL文字列を適用することができます。
そのルーチンのjavadocは、その後はっきり入力が有効/無効であり、何が無効な入力に何が起こるかを述べることができます。
これが正しいと言っていない - ちょうど別の視点
私は、ユーティリティ機能の多くを使用します。 )があり、単に「オブジェクト」を必要としないいくつかのものがありますが、私はあなたが(トリムの持っている特定の例を好きではありません。
ヌル文字列への参照は、空の文字列とは非常に異なっています。アプリは非常に簡単で、あなたは常に「」のようにnull参照を読みたい知っている限り、私はそれをしないだろう。このような場合のために、私が好むます:
setValue((str != null) ? str.trim() : "")
私にとっては、キャッチされないNPEは、アプリケーションで起こっている大きな誤りがあることは良い兆候です!