絶対とは絶対言うな"
私はそれが必ずしも悪いとは思わない、あなたがそれをひどくし、それを乱用した場合にのみ悪い。
ツールとユーティリティが必要
まず最初に、私たちは皆、ほとんどどこにでもあると思われるライブラリを使用しています。たとえば、Javaの世界では、Google GuavaまたはApache Commonsの一部(Apache Commons Lang、Apache Commons Collectionsなど)。
したがって、明らかにこれらが必要です。
ハードワード、重複、バグの導入を避ける
あなたはこれらを考えるならば、かなりこれらのちょうど非常に大きな集まりですUtil
誰かが彼らの(比較的)が権利を取得するために偉大な長さを経て、彼らがしてきた以外、あなたが記述するクラスの時間 - テストと大きく目を球状に他人による。
だから、Util
クラスを書くことを悩むときの最初の経験則は、そのUtil
クラスが実際に存在しないことを確認することだと思います。
私が見た唯一の反論は、依存関係を制限したいときです:
- 依存関係のメモリフットプリントを制限したい場合、
- または、開発者が使用できるものを厳密に制御したい場合(強迫観念の大規模なチームで発生する場合、または特定のフレームワークがどこかで絶対に回避するための奇妙な超クラッピークラスを持つことが知られている場合)。
ただし、ProGuardまたは同等のものを使用してライブラリを再パッケージ化するか、自分で分解することで、これらの両方に対処できます(Mavenユーザーの場合、maven-shade-pluginは、ビルドの一部としてこれを統合するためのフィルターパターンを提供します)。
そのため、ライブラリ内にあり、ユースケースと一致し、それ以外のベンチマークが示されていない場合は、それを使用します。それがあなたのものと少し異なる場合は、それを(可能であれば)拡張するか、拡張するか、最後の手段で書き直してください。
命名規則
しかし、これまでのところ、この回答では、私はそれらをUtil
あなたのように呼んでいます。それらに名前を付けないでください。
意味のある名前を付けてください。Google Guavaを(非常に)非常に良い例として取り上げて、com.google.guava
名前空間が実際にあなたのutil
ルートであると想像してください。
util
最悪の場合はパッケージを呼び出しますが、クラスは呼び出しません。String
オブジェクトと文字列構造の操作を扱う場合は、それを呼び出さStrings
ないでくださいStringUtils
(申し訳ありませんが、Apache Commons Lang-私は今でも好きで、使っています!)。特定の処理を行う場合は、特定のクラス名(Splitter
またはなどJoiner
)を選択します。
単体テスト
これらのユーティリティの作成に頼る必要がある場合は、必ずユニットテストを行ってください。ユーティリティーの良いところは、通常、自己完結型のコンポーネントであり、特定の入力を受け取り、特定の出力を返すことです。それがコンセプトです。そのため、それらを単体テストしない理由はありません。
また、単体テストでは、APIのコントラクトを定義および文書化できます。テストが壊れた場合、何かを間違った方法で変更したか、APIのコントラクトを変更しようとしていることを意味します(または、元のテストはがらくたでした-そこから学び、二度としないでください)。
APIデザイン
これらのAPIについての設計上の決定は、おそらくあなたに長い間続くでしょう。そのため、Splitter
-cloneの作成に何時間も費やさずに、問題へのアプローチに注意してください。
いくつか質問をしてください:
- あなたのユーティリティメソッドは、クラスをそれ自体で保証しますか、それとも同様に有用なメソッドのグループの一部であることが理にかなっている場合、静的メソッドで十分ですか?
- オブジェクトを作成し、APIをより読みやすくするためにファクトリメソッドが必要ですか?
- 読みやすさと言えば、Fluent APIやBuilderなどが必要ですか?
これらのユーティリティは、幅広いユースケースをカバーし、堅牢で安定し、十分に文書化され、最小限の驚きの原則に従って、自己完結型であることが必要です。理想的には、utilsの各サブパッケージ、または少なくともutilパッケージ全体をバンドルにエクスポートして、簡単に再利用できるようにする必要があります。
いつものように、ここで巨人から学びます:
はい、これらの多くはコレクションとデータ構造に重点を置いていますが、ほとんどまたはすべてのユーティリティを直接または間接的に実装する可能性が高いとは言いません。
Util
クラス名での使用をやめてください。問題が解決しました。