データを取得するためのメソッド名[終了]


103

警告:これは私が投稿しているそれほど深刻な質問/ディスカッションではありません...しかし、ほとんどの開発者がこの「問題」を熟考していることは間違いありません...

どこかからデータを取得して返し、それを返すメソッドの命名規則に関する他の意見を得たいと常に思っていました...

ほとんどのメソッド名はやや単純で明白です... SaveEmployee()、DeleteOrder()、UploadDocument()。もちろん、クラスの場合、短い形式... Save()、Delete()、Upload()をそれぞれ使用する可能性があります。

ただし、私は常に最初のアクションに苦労してきました...データを取得する方法。どのプロジェクトでも、最後に使用した命名規則に満足できないため、異なる命名規則の間を行き来しているようです。私が知る限り、これらは可能性です->

  • GetBooks()
  • FetchBooks()
  • RetrieveBooks()
  • FindBooks()
  • LoadBooks()

あなたの考えは何ですか?

回答:


126

それはすべて一貫したセマンティクスについてです。

質問のタイトルでは、データの取得を使用します。これは意味的に非常に明確な方法を意味するものを定義する必要があるという意味で、非常に一般的です。次の例を挙げて、名前を付けることを考えるときに、あなたが正しい軌道に乗ることを期待します。

  1. getBooks() オブジェクトに関連付けられたすべての本を取得する場合、セットの基準がすでに定義されており、それらがどこから来ているかは非表示の詳細です。
  2. findBooks(criteria) メソッド呼び出しへのパラメーターに基づいて本のサブセットを見つけようとしているとき、これは通常、異なる検索基準でオーバーロードされます
  3. loadBooks(source) ファイルやデータベースなどの外部ソースからロードする場合です。
  4. 私はフェッチ/リトリーブを使用しません。それらは曖昧すぎてgetと混同され、用語に明確なセマンティクスが関連付けられていないためです。

例: フェッチは、一部のエンティティが離れた場所にあるものを取得して取得する必要があることを意味します。犬はスティックをフェッチし、リトリーブフェッチの同義語であり、セマンティックが追加されているため、以前に所有していた可能性があります。getも同様に取得の同義語です。これは、あなたが何かを独占的に所有していて、他の誰かが同時にそれを取得できないことを意味します。

セマンティクスは非常に重要です。

意味に関わる言語学と論理学の分岐

コメントは、getfetchなどの一般的な用語に特定のセマンティクスがなく、人によって解釈が異なることを証明しています。用語のセマンティクスを選択し、セマンティクスが明確でなく、その使用と一貫性がない場合に何を意味するのかを文書化します。

あいまいまたはあいまいな意味を持つ単語は、個人的な意見に基づいた偏見や先入観のために、人々によって異なるセマンティクスが与えられ、それが決して終わることはありません。


4
データベースからデータを取得する場合は、フェッチ/リトリーブを使用することを追加します
Liz Albin

1
うーん。ワイルドカード基準と特定の基準を区別しますか?たとえば、特定の出版社の本を探すときにFindBooks(publisher)を使用しますか?それともGetBooksFromPublisher(publisher)?
Jason

5
publisher.getBooks()は、パブリッシャーがパブリッシャーの特定のインスタンスである場合に推奨される方法です。Library.getBooks(publisher)パブリッシャーがBookSearchCriteriaインターフェースを実装した場所。Library.getBooks(author)と同じで、作成者がBookSearchCriteriaインターフェースを実装しました。また、論理的にファクトリメソッドとしてLibrary.getPublishersを()だろう

3
この回答をありがとうございます。明らかにいくつかの明快さを追加します。本質的には、特定のフィルターによる検索のためのメソッドはオブジェクトに留まる必要があると言っています。インターフェイスはどのように使用されますか?たとえば、BookSearchCriteriaインターフェース。サンプルコードを提供できますか?
Jason

2
通常、命名はfetch、データアクセス時間短い、つまり同じデバイス上、ローカルデータベース、メモリからのようなものです。load、またはdownloadアクセス時間があれば高いファイルから、インターネット、外部DBから、
ヤーノシュ

13

正直なところ、どの命名規則を使用するかはチームで決める必要があります。しかし、楽しみのために、これらのいずれかを決定するためのあなたの考えの列が何であるかを見てみましょう:

  • GetBooks()

このメソッドはデータソースに属し、どのように取得するかは関係ありません。データソースから取得するだけです。

  • FetchBooks()

データソースをブラッドハウンドのように扱い、本を取得するのは彼の仕事です。彼が一度にどれだけ彼の口に収まるかはあなた自身で決めるべきだと思います。

  • FindBooks()

データソースは司書であり、デューイ10進数システムを使用して本を検索します。

  • LoadBooks()

これらの本はある種の「電子ブックバッグ」に属しており、そこにロードする必要があります。ロード後にZipClosed()を呼び出して、失われないようにしてください。

  • RetrieveBooks()

私には何もない。


1
受け入れられた回答は、この回答と同様に、「取得」と「フェッチ」を明確に区別していませんでした。Fetchは、実行に時間がかかるか専門知識を必要とするため、他の誰かが実行する必要があることを意味しますが、getは、瞬時に使用可能な逐語的または「既製」であることを意味します。
Sridhar Sarnobat

私も今日、受け入れられた答えに問題があります。私のプロジェクト(React / Reduxベース)では、Reduxストアから引き出されるデータとアプリのデータベースとサードパーティAPIを区別することが重要だと思います。これを正しく行うことは、間違いなく将来の可読性に役立ちます。addデータベースへの書き込みとストアへの書き込みの両方に使用された元の開発者。今私はそれらを分離しようとしています、そしてそれは苦痛です。
tim.rohrer

9

答えは、あなたが何に満足していて、首尾一貫していることに固執することです。

バーンアンドノーブルのWebサイトがあり、GetBooks()を使用している場合、Movieエンティティのような別のアイテムがある場合は、GetMovies()を使用します。ですから、あなたとあなたのチームが好きで一貫しているものは何でも。


22
少なくとも、スペルミスは一貫しています。;-)
Wim Hollebrandse 2010年


まったく気分を害していない...それを指摘してくれてありがとう。
Jason

2

OO(C ++ / Java)では、getSomethingとsetSomethingを使用する傾向があります。これは、常にではないにせよ、そのデータオブジェクトを表すクラスからプライベート属性を取得するか、それを設定するためです-ゲッター/セッターペア。さらに、Eclipseがそれらを生成します。

「メモリへのロード」のようにファイルを意味する場合にのみロードを使用する傾向があり、これは通常、プリミティブ、構造体(C)、またはオブジェクトへのロードを意味します。Webの送受信を使用しています。

上記のように、一貫性がすべてであり、クロス開発者を含みます。


1

「データを取得する」という意味が明確ではありません。データベースから?ファイル?記憶?

メソッドの命名に関する私の見解は、その役割はあいまいさをなくすことであり、理想的にはドキュメントを検索する必要があるということです。これは、メソッド名が長くなっても犠牲にならないはずです。研究によると、ほとんどの中間+開発者は、ラクダのケースで複数の単語を読むことができます。IDEおよびオートコンプリートを使用すると、長いメソッド名を書き込むことも問題になりません。

したがって、「fetchBooks」が表示された場合、コンテキストが明確でない限り(たとえば、BookFetcherFromDatabaseという名前のクラス)、あいまいです。どこから取り出しますか?フェッチと検索の違いは何ですか?また、一部の開発者がセマンティクスを特定のキーワードに関連付けるという問題のリスクもあります。たとえば、データベース(またはメモリ)のフェッチとロード(ファイルから)またはダウンロード(Webから)のフェッチ。

「fetchBooksFromDatabase」、「loadBookFromFile」、「findBooksInCollection」などのようなものが見たいと思います。あまり目立たないですが、長さを超えると、はっきりします。これを読んだ人はみな、あなたがやろうとしていることをすぐに理解するでしょう。


4
fetchBooksFromDatabaseの問題は、因数分解/汎化してfetchBooksを実行したい場合に、XMLなどからデータをプルすることです。私も仕様が好きですが、同じ機能を異なる関数名で分離していることに気づくでしょう。そして、そのサーはクールではありません!
JonH '26年

GetとFindの違いは明白になる傾向があると思いますが、GetとFetchに関する質問については疑問に思います。地獄..違いはありますか?
Jason

@JonH:私はそれに同意します。ただし、さまざまなタイプのフェッチがあることを事前に知っている場合は、それをクラスの名前付けにエンコードします(そのため、コンテキストから意味を解釈できます(たとえば、DatabaseConnector対XmlConnector)。
Uri

7
@ジェイソン:「ゲッター」はユビキタスなので(JavaBeansのようなフレームワークの一部です)、多くのプログラマーはそれらをデータフィールドにアクセスするほとんど透過的な手段と考えがちです。一方、「フェッチ」は、一部のプログラマーに対して、場所から場所へのデータの転送(a-la CPUフェッチ)またはデータベースフェッチを含むより長いアクセスを示します。たとえば、Hibernateのクエリ言語にはFetch構造があります。開発者は、ドキュメントを読むのではなく、名前の期待に基づいてメソッドを使用することが多いため、間違った信号を送信しないようにすることが重要です。
Uri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.