読みやすさの観点から、ブールメソッドにどのメソッド名を好むかという簡単な質問:
public boolean isUserExist(...)
また:
public boolean doesUserExist(...)
また:
public boolean userExists(...)
読みやすさの観点から、ブールメソッドにどのメソッド名を好むかという簡単な質問:
public boolean isUserExist(...)
また:
public boolean doesUserExist(...)
また:
public boolean userExists(...)
public boolean userExists(...)
私の好みでしょう。条件付きチェックを自然な英語のようにします。
if userExists ...
しかし、厳格なルールはないと思います-一貫性を保つだけです
userExists
90% の確率で、呼び出しコードは次のようになるためです。
if userExists(...) {
...
}
そしてそれは英語で非常に文字通りに読めます。
if isUserExist
if doesUserExist
冗長に見えます。
読みやすさを追求しながら、明瞭さを犠牲にすることに注意してください。
よりも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) ...
これは、「if user dot get age is greater than or equal to 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 Don't Ask」に従って、true/false を返す多くの関数がとにかく消えてしまい、オブジェクトにその状態を尋ねる代わりに、何かをするように指示します。その状態に基づいた方法。
可読性の目標は常に、可能な限り自然言語に近いコードを書くことです。したがって、この場合、userExists
最良の選択と思われます。それにもかかわらず、接頭辞「is」を使用することは、別の状況では正しい場合がありますisProcessingComplete
。
1) 自然言語では意味があり、2) 私が見た API の規則に従っているため、私は userExists() を使用します。
自然言語で意味をなすかどうかを確認するには、声に出して読んでください。「ユーザーが存在する場合」は、「ユーザーが存在する場合」または「ユーザーが存在する場合」よりも有効な英語のフレーズのように聞こえます。「ユーザーが存在する場合」の方が良いでしょうが、「the」はおそらくメソッド名には不要です。
ファイルが Java SE 6 に存在するかどうかを確認するには、File.exists() を使用します。これは、バージョン 7でも同じようです。C# は、 PythonやRubyと同じ規則を使用します。うまくいけば、これは言語にとらわれない答えと呼ぶのに十分なほど多様なコレクションです. 一般的に、言語の API に合わせてメソッドに名前を付けることに賛成します。
この質問に対する私の簡単なルールは次のとおりです。
ブール メソッドにすでに動詞がある場合は、追加しないでください。それ以外の場合は、検討してください。いくつかの例:
$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
ここで他のいくつかの答えに見落とされたと思うことがあります
これがC++クラスメソッドであるかC関数であるかによって異なります。これがメソッドの場合、呼び出されるif (user.exists()) { ... }
かどうかif (user.isExisting()) { ... }
は不明if (user_exists(&user))
です。これが、オブジェクトが前にあるときに文のように読み取られるため、ブールメソッドを動詞で開始する必要があるというコーディング標準の背後にある理由です。
残念ながら、古いC関数の多くは、成功の場合は0を返し、失敗の場合はゼロ以外を返すため、すべてのブール関数が動詞で始まるか、常にtrueと比較しない限り、使用されているスタイルを判別するのは難しい場合があります。if (true == user_exists(&user))
純粋に主観的です。
私が好むuserExists(...)
のは、次のようなステートメントの方が読みやすいからです。
if ( userExists( ... ) )
また
while ( userExists( ... ) )
この特定のケースでは、最初の例は、私をひるませるほどひどい英語です。
if ステートメントでそれを読んだときの響きからして、私はおそらく 3 番に行きます。「ユーザーが存在する場合」は、「ユーザーが存在する場合」よりも適切に聞こえます。
もちろん、これはifステートメントのテストで使用されることを前提としています...
私はこれらのどれも好きです:
userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
メソッド名は可読性に役立ちます。コード全体に適合するものだけが最適です。ほとんどの場合、条件で始まるため、subjectPredicate は自然な文の構造に従います。