web-dev-qa-db-ja.com

"get"と "find"プレフィックスを使用した命名方法を決定する方法と理由

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()のどちらにするかを決定する方法と理由

51
knownasilya

取得時間が非常に短いことがわかっている場合(ハッシュテーブルまたはbtreeからのルックアップなど)、Getを使用します。

Findは、検索プロセスまたは計算アルゴリズムを意味します実行に「より長い」期間が必要です(より長い任意の値の場合)。

85
Robert Harvey

findは失敗する可能性がありますが、getは失敗しないはずです。

64
coredump

私が私の子供たちとよくする会話を引用するには:

me:こんにちは!バッテリーを探しに行きます

子供:しかし、彼らはどこにいますか?

me:だから、私はあなたに行くように言ったfindそれらを。それらがどこにあるかを知っていれば、私はあなたにそれらをgetするように言ったでしょう。または、母親に尋ねることもできます。

同じ考え方が成り立ちます:

  • 安価に入手できる情報を返すメソッド(おそらくインライン化するか、最適化して削除できる)、またはこのオブジェクトが一意に所有する情報に「get」を使用します。

  • 情報を取得するために機能するメソッドには「find」を使用します。または、他のオブジェクトを使用して情報を検索します。

45
jimwise

次のパターンを適用します。

  • 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;
    }
}
5
Cyril Gandon

Findは、呼び出し間で変更される可能性があるいくつかのパラメーターを使用してデータベースクエリを実行する場合など、結果がないことを意味します。一方、Getは、結果がメソッドに事前に認識されているか、一度認識されると変更されないこと、つまり、呼び出しにパラメーターがないことを意味します。
たとえば、Customer findCustomerById(long customerId)やCustomer getCustomer()などを使用します

3
jwenting

getはどのような場合でも適切です_実際、多くの場合、何かを取得するためには、まずそれを見つける必要があると想定されています。わからない場合は、getを使用してください。

私はfindMinimum()またはfindOptimal()のようなメソッドにfindを使用します。つまり、戻り値を計算する特別なアルゴリズムがあり、単純にリクエストをしませんDB、ファイルシステム、リモートサーバーなど、一部のデータを受信します。

2
superM

検索または取得接頭辞を使用しないでください。これは niformAccessPrinciple の違反であり、bertrand meyerによって作成されました。次のようなメソッドを作成しないでください。

public String revision(Item item)
2

通常、Getを使用してオブジェクト/値を取得し、Findを使用してlocation(配列など)を取得します。

例:

object o = obj.GetItem( 'name');

integer i = somearray.Find( 'name');
1
GrandmasterB

私にとって、findは、複数の結果が存在する可能性があることを意味します。 getは1つだけを意味します。

0
Karl Bielefeldt