web-dev-qa-db-ja.com

ブールメソッドの命名の読みやすさ

読みやすさの観点からの単純な質問です。ブールメソッドの場合、どのメソッド名を好みますか。

public boolean isUserExist(...)

または:

public boolean doesUserExist(...)

または:

public boolean userExists(...)
99
Yuval Adam
public boolean userExists(...)

私が好むでしょう。それはあなたの条件付きチェックをはるかに自然な英語のようにします:

if userExists ...

しかし、私は難しいと速いルールはないと思います-ただ一貫している

92
Martin

userExistsと言うでしょう。なぜなら、呼び出しコードの90%が次のようになるからです:

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

そして、それは英語で非常に文字通り読みます。

if isUserExistおよびif doesUserExistは冗長なようです。

34
Kai

可読性の目標は、常に自然言語に可能な限り近いコードを記述することです。したがって、この場合、userExistsが最良の選択のようです。それにもかかわらず、接頭辞「is」の使用は、たとえばisProcessingCompleteなどの別の状況で正しい場合があります。

14
Konamiman

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

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歳以上の場合...」と表示されますtrue-「自然な英語」ではありませんが、_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を返す多くの関数はとにかく消え、オブジェクトにその状態を尋ねる代わりに、何かをするように指示します。その状態に基づいた方法。

13
Michael Parker

UserExists()を使用するのは、1)自然言語で意味があり、2)私が見たAPIの規則に従うからです。

自然言語で意味があるかどうかを確認するには、声を出して読んでください。 「ユーザーが存在する場合」は、「ユーザーが存在する場合」または「ユーザーが存在する場合」よりも有効な英語のフレーズのように聞こえます。 「ユーザーが存在する場合」の方が良いでしょうが、「the」はおそらくメソッド名には不要です。

ファイルがJava SE 6に存在するかどうかを確認するには、 se File.exists() を使用します。これは同じように見えます バージョンでは7 。C#は 同じ規則 を使用します- Python および Ruby を使用します。言語に依存しない答え:一般的に、私はあなたの言語のAPIに合わせてメソッドの命名を支持します。

8
David

ここで他のいくつかの答えが逃したと思うことを考慮することがあります

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

  2. 残念ながら、多くの古いC関数は成功すると0を返し、失敗すると0以外の値を返すため、動詞で始まるすべてのブール関数に従うか、常にif (true == user_exists(&user))

5
Lee Ballard

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

ブールメソッドに既に動詞がある場合は、追加しないでください。それ以外の場合は、検討してください。いくつかの例:

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

純粋に主観的。

userExists(...)の方が好きです。なぜなら、次のようなステートメントのほうが読みやすいからです。

if ( userExists( ... ) )

または

while ( userExists( ... ) )
1
zumalifeguard

この特定のケースでは、最初の例は非常に恐ろしい英語であるため、私はうんざりします。

Ifステートメントで読んだときの音のせいで、おそらく3番目に行くでしょう。 「ユーザーが存在する場合」は、「ユーザーが存在する場合」よりも優れています。

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

1
Dana

私はこれらのいずれかが好きです:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
1
John Kugelman

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

0
Yuan

なぜプロパティの名前を変更しないのですか?

if (user.isPresent()) {
0
Artem Lukanin