読みやすさの観点から、ブールメソッドにどのメソッド名を好むかという簡単な質問:
public boolean isUserExist(...)
または:
public boolean doesUserExist(...)
または:
public boolean userExists(...)
getUserExistence
、userIsNotExtinct
、userHasExistentialState
等...
読みやすさの観点から、ブールメソッドにどのメソッド名を好むかという簡単な質問:
public boolean isUserExist(...)
または:
public boolean doesUserExist(...)
または:
public boolean userExists(...)
getUserExistence
、userIsNotExtinct
、userHasExistentialState
等...
回答:
public boolean userExists(...)
私の好みでしょうか。それはあなたの条件チェックを自然な英語にはるかに似せるので:
if userExists ...
しかし、私は厳格で迅速なルールはないと思います-一貫しているだけです
if
?彼らが副作用を持っている場合、それはさらに臭いです。if IsUserExisting()
そしてif DoesUserExist()
恐ろしい見て、避けるべきです。
userExists
、宣言する変数の名前は何ですか?userExists
メソッドではなく変数に適しています。@オスカーが書いたように-それは質問ではなく声明のように聞こえます。
読みやすさを追求しながら、明快さを犠牲にすることに注意してください。
は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を返す多くの関数がいずれにしても消え、オブジェクトにその状態を要求する代わりに、何かを実行するように指示します。その状態に基づく方法。
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.
それは非常に明確です。それがブール値を返す以外のことをした場合、ほとんどの開発者は驚かされると私は断言します。
Most developers
はそこでの文章の鍵です。何かを確認する以外のall developers
ことをしたら驚いたと思いCheckExists()
ます。それExists()
はひどい名前ではなく、それCheckExists()
がより良い名前です。この質問は、一般的な原則として、最良の命名パターンを尋ねています。答えは、それを他の関数と同様に扱い、名前を動詞で始め、ブール値を返すからといって別のパターンを使用しないことです。
userExists()を使用するのは、1)自然言語で意味があり、2)これまでに見たAPIの規則に従っているためです。
自然言語で理解できるかどうかを確認するには、読み上げてください。「ユーザーが存在する場合」や「ユーザーが存在する場合」よりも、有効な英語のフレーズのように聞こえます。「ユーザーが存在する場合」の方が適切ですが、「the」はおそらくメソッド名では不要です。
Java SE 6にファイルが存在するかどうかを確認するには、File.exists()を使用します。これは、バージョン7でも同じように見えます。C#が使用する同じ規則を、として行うのPythonとRubyのを。うまくいけば、これはこれを言語にとらわれない答えと呼ぶのに十分多様なコレクションです。一般的に、私はあなたの言語のAPIに合わせてメソッドに名前を付けることに賛成です。
ここで他のいくつかの回答に見落とされたと思うことを考慮する必要があります
これがC ++クラスメソッドかC関数かによって異なります。これがメソッドである場合、呼び出されるif (user.exists()) { ... }
かどうかif (user.isExisting()) { ... }
は不明if (user_exists(&user))
です。これがコーディング標準の背後にある理由です。ステートboolメソッドは、オブジェクトがその前にあるときに文のように読み取られるため、動詞で始まる必要があります。
残念ながら、多くの古いC関数は、成功すると0を返し、失敗すると0以外を返すため、すべてのbool関数を動詞で始めるか、常にtrueと比較しない限り、使用されているスタイルを特定するのは困難です。 if (true == user_exists(&user))
私はこれらのどれかが好きです:
userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
isBabbyFormed