getSomething
ではなくfindSomething
で始まる特定のメソッドを指定する必要があるかどうか、常に理解するのに苦労しています。
問題は、不十分に設計されたAPIに対してhelpersを作成することにあります。これは通常、オブジェクトをパラメーターとして必要とするオブジェクトからデータを取得するときに発生します。以下に簡単な例を示します。
_public String getRevision(Item item) {
service.load(item, "revision");
// there is usually more work to do before getting the data..
try {
return item.get_revision();
}
catch(NotLoadedException exception) {
log.error("Property named 'property_name' was not loaded", exception);
}
return null;
}
_
このメソッドの名前をgetRevision()
またはfindRevision()
のどちらにするかを決定する方法と理由
取得時間が非常に短いことがわかっている場合(ハッシュテーブルまたはbtreeからのルックアップなど)、Get
を使用します。
Find
は、検索プロセスまたは計算アルゴリズムを意味します実行に「より長い」期間が必要です(より長い任意の値の場合)。
find
は失敗する可能性がありますが、get
は失敗しないはずです。
私が私の子供たちとよくする会話を引用するには:
me:こんにちは!バッテリーを探しに行きます
子供:しかし、彼らはどこにいますか?
me:だから、私はあなたに行くように言ったfindそれらを。それらがどこにあるかを知っていれば、私はあなたにそれらをgetするように言ったでしょう。または、母親に尋ねることもできます。
同じ考え方が成り立ちます:
安価に入手できる情報を返すメソッド(おそらくインライン化するか、最適化して削除できる)、またはこのオブジェクトが一意に所有する情報に「get」を使用します。
情報を取得するために機能するメソッドには「find」を使用します。または、他のオブジェクトを使用して情報を検索します。
次のパターンを適用します。
Foo GetFoo()
はnullを返すことができず、その複雑さはO(log(n))以下ですbool TryGetFoo(out Foo)
はnullを返すことができ、その複雑さはO(log(n))以下ですFoo FindFoo()
はnullを返すことができず、その複雑さはO(log(n))よりも大きいbool TryFindFoo(out Foo)
はnullを返すことができ、その複雑さはO(log(n))よりも大きいこのようにして、コードは意図と予想される複雑さについてかなり明確になります。
通常、ゲッターは直接リストまたは辞書/セットへのアクセス用です。
ファインダーはディープサーチ、リストのフルスキャンなどです...
あなたの場合:
public bool TryGetRevision( Item item, out String revision )
{
service.load( item, "revision" );
// there is usually more work to do before getting the data..
try
{
revision = item.get_revision();
return true;
}
catch( NotLoadedException exception )
{
log.error( "Property named 'property_name' was not loaded", exception );
revision = "";
return false;
}
}
Findは、呼び出し間で変更される可能性があるいくつかのパラメーターを使用してデータベースクエリを実行する場合など、結果がないことを意味します。一方、Getは、結果がメソッドに事前に認識されているか、一度認識されると変更されないこと、つまり、呼び出しにパラメーターがないことを意味します。
たとえば、Customer findCustomerById(long customerId)やCustomer getCustomer()などを使用します
get
はどのような場合でも適切です_実際、多くの場合、何かを取得するためには、まずそれを見つける必要があると想定されています。わからない場合は、get
を使用してください。
私はfindMinimum()
またはfindOptimal()
のようなメソッドにfind
を使用します。つまり、戻り値を計算する特別なアルゴリズムがあり、単純にリクエストをしませんDB、ファイルシステム、リモートサーバーなど、一部のデータを受信します。
検索または取得接頭辞を使用しないでください。これは niformAccessPrinciple の違反であり、bertrand meyerによって作成されました。次のようなメソッドを作成しないでください。
public String revision(Item item)
通常、Get
を使用してオブジェクト/値を取得し、Find
を使用してlocation(配列など)を取得します。
例:
object o = obj.GetItem( 'name');
integer i = somearray.Find( 'name');
私にとって、find
は、複数の結果が存在する可能性があることを意味します。 get
は1つだけを意味します。