ブールメソッドの命名の可読性


120

読みやすさの観点から、ブールメソッドにどのメソッド名を好むかという簡単な質問:

public boolean isUserExist(...)

または:

public boolean doesUserExist(...)

または:

public boolean userExists(...)

21
最初のものは次のように聞こえますisBabbyFormed

言語によって異なります。異なる言語には異なる規則があります。JavaとObjective Cが思い浮かびます。また主観的な境界線。
ジェドスミス

主観-十分に公正
Yuval Adam

2
純粋に主観的。getUserExistenceuserIsNotExtinctuserHasExistentialState等...
dreamlax

サルトルは誇りに思います
Cornel Masson

回答:


112
public boolean userExists(...)

私の好みでしょうか。それはあなたの条件チェックを自然な英語にはるかに似せるので:

if userExists ...

しかし、私は厳格で迅速なルールはないと思います-一貫しているだけです


3
「{メソッドコール}を自然な英語にはるかに近づける」というのは、全体にわたる合理的な命名の素晴らしいテストのように聞こえます。問題についての私の考えを明確にした-ありがとう!
cori

16
一方、単独で、または「if」の直後にない場合、「userExists()」は、意図された質問ではなく、実際のステートメントのように聞こえます。「IsUserExisting()」や「DoesUserExist()」とは異なり、簡単な質問では英語の自然言語の単語順序規則に従います。
Oskar Berggren

4
..しかし、boolを返すメソッドがif?彼らが副作用を持っている場合、それはさらに臭いです。if IsUserExisting()そしてif DoesUserExist()恐ろしい見て、避けるべきです。
RJFalconer 2018

@RJFalconerは、いくつかの場所でそのメソッドの結果を使用する必要がある場合があるため、変数に割り当てます。メソッドが呼び出されるのでuserExists、宣言する変数の名前は何ですか?userExistsメソッドではなく変数に適しています。@オスカーが書いたように-それは質問ではなく声明のように聞こえます。
ヤロスワフWlazło

サブジェクト、述語、およびオブジェクトが必要な状況(たとえば、UserSessionIsCompleteまたはIsUserSessionComplete)では、どちらを使用しますか?
ヤン

40

私の言うところはuserExists、私の呼び出しコードは90%の確率で次のようになるためです。

if userExists(...) {
  ...
}

そしてそれは文字通り英語で読む。

if isUserExistそして、if doesUserExist冗長に思えます。


18

読みやすさを追求しながら、明快さを犠牲にすることに注意してください。

if (user.ExistsInDatabase(db))読みやすくなっていますif (user.CheckExistsInDatabase(db))が、ビルダーパターンを持つクラス(または状態を設定できるクラス)の場合を考えてみます。

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

それExistsInDatabaseが存在するかどうかを確認するのか、それとも存在するという事実を設定するのかは明確ではありません。あなたは書きませんでしょうif (user.Age())か、if (user.Name())いずれかの比較値なしで、なぜですif (user.Exists())そのプロパティ/関数はブール型であり、あなたがより自然な英語などを読み取るために機能/プロパティの名前を変更することができますので、純粋に良いアイデア?ブール値以外の他のタイプに使用するのと同じパターンに従うのはとても悪いですか?

他のタイプでは、ifステートメントは関数の戻り値をコード内の値と比較するため、コードは次のようになります。

if (user.GetAge() >= 18) ...

これは、「ユーザードットゲットエイジが18以上の場合...」と読みます。これは「自然な英語」ではありobject.verbませんが、自然な英語に似たことはないと私は主張しますが、これは単に現代のプログラミングの基本的な側面です(多くの主流言語)。プログラマは通常、上記のステートメントを理解するのに問題はありません。

if (user.CheckExists() == true)

これは通常短縮されます

if (user.CheckExists())

致命的なステップが続きます

if (user.Exists())

「コードは書き込まれるよりも10倍頻繁に読み取られる」と言われていますが、バグを見つけやすいことも非常に重要です。オブジェクトを存在させ、成功に基づいてtrue / falseを返すExists()という関数があるとします。コードif (user.Exists())を簡単に確認でき、バグを特定できませんでしたif (user.SetExists())。たとえば、コードを読み取れば、バグはより明確になります。

さらに、user.Exists()には、複雑なコードや非効率なコードを簡単に含めることができ、データベースにラウンドトリップして何かをチェックします。user.CheckExists()は、関数が何かを行うことを明確にします。

ここですべての応答も参照してください:命名規則:ブール値を返すメソッドの名前は何ですか?

最後の注意として、「Tell Do n't Ask」に続いて、true / falseを返す多くの関数がいずれにしても消え、オブジェクトにその状態を要求する代わりに、何かを実行するように指示します。その状態に基づく方法。


2
> Suppose you had a function called Exists() which causes the object to existそれはすでに問題です。このようなメソッドは、のような動詞である必要がありますCreate。最低でもそうですがExist、動詞はほとんど使用されないため、「存在」します。 It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.それは非常に明確です。それがブール値を返す以外のことをした場合、ほとんどの開発者は驚かされると私は断言します。
RJFalconer

@RJFalconer Most developersはそこでの文章の鍵です。何かを確認する以外のall developersことをしたら驚いたと思いCheckExists()ます。それExists()はひどい名前ではなく、それCheckExists()より良い名前です。この質問は、一般的な原則として、最良の命名パターンを尋ねています。答えは、それを他の関数と同様に扱い、名前を動詞で始め、ブール値を返すからといって別のパターンを使用しないことです。
マイケルパーカー、

はい、問題はブールメソッドに最適な命名パターンについてです。Boolメソッドは一意であり、独自の共通名(述語)を持っています。それらを他の関数のように扱うべきではありません。ブールメソッド名の質問の横に動詞を置くのは冗長です。そして、それはコードの読みやすさに悪影響を及ぼします。ブール法に質問の形で名前を付けるが、動詞は使用しないことが業界のベストプラクティスとして受け入れられています。例: docs.microsoft.com/en-us/dotnet/api/system.io.file.existsの developer.android.com/reference/java/io/File#exists()
アウミール

@Almir File.Existsは非常に古い呼び出し(少なくともドットネット1.1)であり、最新の読みやすさの基準の良い例ではありません。マイクロソフトが同意する最新の例については、最新のドットネットコアAPIを参照してくださいgithub.com/dotnet/sdk、ランダムな例のリンク リンク リンク
Michael Parker

15

読みやすさの目標は、常に自然言語に最も近いコードを書くことです。したがって、この場合userExistsは、最良の選択のようです。プレフィックス「is」を使用しても、たとえば、別の状況では正しい場合がありisProcessingCompleteます。


1
2番目の例として、ProcessingIsComplete自然言語に近いですか?例:if(ProcessingIsComplete())
Yang

9

userExists()を使用するのは、1)自然言語で意味があり、2)これまでに見たAPIの規則に従っているためです。

自然言語で理解できるかどうかを確認するには、読み上げてください。「ユーザーが存在する場合」や「ユーザーが存在する場合」よりも、有効な英語のフレーズのように聞こえます。「ユーザーが存在する場合」の方が適切ですが、「the」はおそらくメソッド名では不要です。

Java SE 6にファイルが存在するかどうかを確認するには、File.exists()使用します。これは、バージョン7でも同じように見えます。C#が使用する同じ規則を、として行うのPythonRubyのを。うまくいけば、これはこれを言語にとらわれない答えと呼ぶのに十分多様なコレクションです。一般的に、私はあなたの言語のAPIに合わせてメソッドに名前を付けることに賛成です。


5

ここで他のいくつかの回答に見落とされたと思うことを考慮する必要があります

  1. これがC ++クラスメソッドかC関数かによって異なります。これがメソッドである場合、呼び出されるif (user.exists()) { ... }かどうかif (user.isExisting()) { ... }
    は不明if (user_exists(&user))です。これがコーディング標準の背後にある理由です。ステートboolメソッドは、オブジェクトがその前にあるときに文のように読み取られるため、動詞で始まる必要があります。

  2. 残念ながら、多くの古いC関数は、成功すると0を返し、失敗すると0以外を返すため、すべてのbool関数を動詞で始めるか、常にtrueと比較しない限り、使用されているスタイルを特定するのは困難です。 if (true == user_exists(&user))


5

この質問に対する私の簡単なルールは次のとおりです。

booleanメソッドが動詞をすでに持っている場合は、動詞を追加しないでください。それ以外の場合は、それを考慮してください。いくつかの例:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

純粋に主観的。

userExists(...)このようなステートメントが読みやすくなるので、私は好む:

if ( userExists( ... ) )

または

while ( userExists( ... ) )

1

この特定のケースでは、最初の例はひどい英語です。

if文でそれを読んだときの音の理由から、おそらく3番目に行くでしょう。「ユーザーが存在する場合」よりも「ユーザーが存在する場合」の方が音が良い。

もちろん、ifステートメントテストで使用されることを想定しています...



0

メソッド名は読みやすくするために役立ちます。コード全体に適合するものだけが最適です。ほとんどの場合、条件で始まるため、subjectPredicateは自然な文構造に従います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.