「get」プレフィックスと「find」プレフィックスの付いた命名方法を決定する方法と理由


48

getSomethingvsで始まる特定のメソッドに名前を付ける必要があるかどうかを判断するのは常に困難findSomethingです。

問題は、設計が不十分なAPIのヘルパーを作成することにあります。これは通常、オブジェクトからデータを取得するときに発生し、オブジェクトをパラメーターとして必要とします。以下に簡単な例を示します。

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()orにするfindRevision()かどうか、どのように決めるのですか


2
貧弱に設計されたAPI の最良のヘルパーは、トリッキーな名前付けを台無しにすることではなく、腐敗防止レイヤーを確立することです。 AnticorruptionLayerを使用して、そのモデルとあなたのモデルとの間で翻訳を行います。」
gnat

1
この概念を聞いたことがありません。例とのより良いリンクはありますか?
既知の

1
Webを検索すると、非常に多くの情報があります。例えば、腐敗防止レイヤーの構造、パート1 「おそらく...すでに存在するスパゲッティとやり取りするタスクに直面することは避けられません。腐敗防止レイヤーを入力してください...」
gnat

回答:


83

Getハッシュテーブルまたはbtreeからの検索のように、取得時間が非常に短いことがわかっている場合に使用します。

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


3
+1取得時にgetを使用し、getを実行するために作業を行う必要がある場合を見つけます。
ジム

5
コードの変更(一部が最適化され、アルゴリズムが変更される)とAPIの変更を考慮することは、多くの場合不可能であり、適切な基準とは思えません。find後でハッシュテーブルアルゴリズムに置き換えたらどうしますか?
メゼ

2
また、呼び出しを読み取るとき、検索条件が成功しないために検索が成功しないときに「検索」が呼び出される可能性があり、「get」は何らかの異常な問題がない限り成功することが期待されます。
gnasher729

何らかの条件に基づいて結果をフィルターするオプションのパラメーターを関数が受け入れるとどうなりますか?両方getfind使用方法に応じて適用されます。
ESR

62

私はそれfindが失敗するかもしれないと言うでしょうが、そうgetすべきではありません。


25
findNULLを返すことはできgetませんが、NULLを返すことはできませんが、スロー(またはアサート)する可能性があることを意味する場合、私は同意します。
シェード

1
私はこれについて@Sjoerdに完全に同意します。
mhr

そして、もしfind()戻りますOptional<>か?その場合findnull安全です。
9:22のTheCoder

42

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

私: やあ子供!バッテリーを探して

子供:しかし、彼らはどこですか?

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

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

  • 「get」は、安価に入手可能な情報を返すメソッド(おそらくインライン化または最適化して離れる)、またはこのオブジェクトが独自に所有する情報に使用します。

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


16
プログラマーだけが子供とこの会話をします。「ごみを出しますか?」"番号。" 「ごみを出しますか?」"はい。"
ロバートハーベイ

@RobertHarvey私は人々とこの問題を抱えていると思います。誰かが何かを説明しようとしたり、質問をしたりするたびに、私は通常、質問を返して、それについて明示するように伝えます。そうしないと、通常、XY問題が発生します。そうしないと、ウォーキングオートコンプリート機能のように感じます。あなたはあなたの心に何があるのか​​分からず、言葉にそれを置くことができません、あなたはカップルの言葉をせせらぎ、あなたのためにすべての「思考」を行い、それであなたを助けることを期待しますか?いいえ、起きていません:)
akinuri

3

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


3

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

  • 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;
    }
}

+1 try、短くて正確
SpaceTrucker

2

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

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


1
良い点。個人的にfindは、あなたが提供した例ではプレフィックスとして使用しないでしょう。あなたの例のような計算タスクには、calculateまたはを使用しますcompute
既知の


1

私は通常Get、オブジェクト/値Findを取得し、その場所(たとえば、配列)を取得するために使用します。

例:

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

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

0

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


8
それはその感触を持っているようですが、私は完全に同意するかどうかわかりません。それをこのように考える:getCatfindCatgetCatsfindCatsfind..まだ返される特異なオブジェクトを表します。私の意見では、複数形は名詞に追加する必要があります。
既知の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.