ブール値を返すJavaメソッドの命名規則(疑問符なし)


93

他の言語でメソッド/関数名の最後に疑問符を使用するのが好きです。Javaではこれができません。回避策として、Javaでブール値を返すメソッドに他にどのように名前を付けることができますか?使用してishasshouldcan方法音の前で大丈夫いくつかのケースのために。そのようなメソッドに名前を付けるより良い方法はありますか?

たとえば、createFreshSnapshot?


2
?メソッド名で使用できる言語は何ですか?
SLak

11
@ SLaks、Scheme、Ruby ...
Skilldrick

スキームではp、メソッド名の末尾に常にa を付けます
Erick Robertson

@エリック:常にではありませんが、 "p"は述語を指定する1つの標準的な方法です
Jason S

私たち =私の学部のスキームクラスは常にしました。私はこの規則をJavaで使用することはありません。
エリックロバートソン

回答:


121

規約は、名前で質問することです。

以下は、JDKにあるいくつかの例です。

isEmpty()

hasChildren()

こうすると、名前の最後に疑問符が付いているように名前が読み取られます。

コレクションは空ですか?
このノードには子がありますか?

そして、それtrueはイエスをfalse意味し、ノーを意味します。

または、アサーションのように読み取ることができます。

コレクションは空です。
ノードには子があります

注:
メソッドにのような名前を付けたい場合がありますcreateFreshSnapshot?。疑問符がない場合、名前は、メソッドが必要かどうかを確認するのではなく、スナップショットを作成することを意味します。

この場合、実際に何を求めているのかを再考する必要があります。のようなものisSnapshotExpiredははるかに優れた名前であり、メソッドが呼び出されたときにメソッドが通知する内容を伝えます。このようなパターンに従うことで、より多くの関数を純粋で副作用のない状態に保つことができます。

その場合はGoogle検索のためのisEmpty()Java APIの中で、あなたは結果の多くを得ます。


createFreshSnapshotについてはどうですか?
letronje

4
@letr、まあ、私はおそらくそれをlit isSnapshotExpiredまたはそのようなものに名前変更するでしょう。(基準に基づく)
jjnguy

8
「shouldCreateFreshSnapshot()」という単語を使用して、 'createFrshSnapshot'の問題を回避します(ただし、この場合はisSnapshotExpired()の方が優れています)
DJClayworth

1
shouldHeartbeat()メソッドを使用してハートビートメッセージを送信する必要があるかどうかを確認します。
エリックロバートソン

なぜそれがアサーションではなく質問であるisEmpty()と考えるのですか?これらの名前を主張または述語と考えると、実際には英語で少し読みやすくなります。hasChildren()
リック

29

クラスにJava Beans仕様との互換性を持たせたい場合、リフレクションを利用するツール(JavaBuildersJGoodies Bindingなど)がブールゲッターを、getXXXX()またはisXXXX()メソッド名として認識できるようにします。Java Beans仕様から:

8.3.2ブールプロパティ

さらに、ブールプロパティの場合、ゲッターメソッドがパターンに一致することを許可します。

public boolean is< プロパティ名 > ();

これは、「<さのPropertyName >」この方法は代わりに「GET <設けてもよいのPropertyName >」方法、またはそれが「GET <以外に設けてもよいのPropertyName >」方法。どちらの場合も、ブールプロパティに「is < PropertyName >」メソッドが存在する場合、「is < PropertyName >」メソッドを使用してプロパティ値を読み取ります。ブールプロパティの例は次のとおりです。

public boolean isMarsupial();
public void setMarsupial(boolean m);

あなたがpublic boolean is<PropertyName>(); それがジェネリックのように見えると言うとき、それは混乱しています。
エリックロバートソン、

ねえ、私はスペックを引用しています。仕様に従って斜体にします。
Jason S

4
Java Beanの互換性は気にしません。メソッド名が適切に聞こえるようにしたいだけです:)
letronje

4
Javabeansの互換性を気にしない場合でも、命名規則はIDEで構成されている「beans」の元の範囲をはるかに超えて成長しているため、従う価値があります。たとえば、メソッド名としてisEmptyを使用する場合、object.emptyを使用してJSPからこのメソッドを呼び出すことができますが、他の接頭辞を持つメソッドを呼び出すことはできないため、object.childrenを使用してobject.hasChildren()を呼び出すことはできません。したがって、JSPおよびEL(式言語)を使用すると、Javabeansプロパティにアクセスできます。あなたが私に尋ねれば大きな勝利。
Stijn de Witt 2010

JavaBeansは非常に具体的です。「is」というプレフィックスが付いているのではないかと思ったり、思われたりすることがよくありますが、実際はそうではありません。
Snicolas

26

このリンクを投稿したいのですが、この回答を確認して、Javaスタイルの規則を探すための覗き見に役立つ場合があります。

Javaプログラミングスタイルのガイドライン

項目「2.13 、ブール変数とメソッドに接頭辞を使用する必要があります。」特に関連があり、is接頭辞を提案します。

スタイルガイドはさらに提案します:

isプレフィックスにいくつかの選択肢があり、状況によってはより適合します。これらはしていることができますすべき接頭辞:

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

ガイドラインに従っている場合、適切なメソッドの名前は次のようになると思います。

shouldCreateFreshSnapshot()

2
参考までに、ガイドラインは著作権のあるGeotechnical Software Servicesです。とはいえ、彼らは正当なものであることを示唆するために下部にあるソースを参照しています。
Donal Lafferty、2015年

11

失敗する可能性のあるメソッド、つまりブール値を戻り値の型として指定する場合は、プレフィックスを使用しますtry

if (tryCreateFreshSnapshot())
{
  // ...
}

他のすべての場合には、is.. has.. was.. can.. allows....のような接頭辞を使用します。


15
しかし、tryはそれが質問であること(戻り値があること)を伝えません。
Steve Kuo

メソッドが失敗したかどうかを示すブール値を返さないでください。メソッドが失敗した場合は、例外をスローします。メソッドが失敗してfalseになると想像してください。何が問題だったのかをどのように判断しますか?
Wouter van Koppen

5

標準では、接頭辞として「is」または「has」を使用します。例えばisValidhasChildren


2

is私が他の誰よりも遭遇したものです。現在の状況で意味のあるものは何でも最良の選択肢です。


0

この一般的な命名規則について別の見方をしたいと思います。例:

java.util.Setを参照してください:boolean add​(E e)

根拠は次のとおりです。

何らかの処理を行って、 成功したかどうか報告し ます。

一方でreturn確かにあるbooleanメソッドの名前が指している必要があります完了するために処理するのではなく、結果の型(この例ではブール値)。

あなたのcreateFreshSnapshot例は、これを意味しているように思われるため、私にとってはこの観点にもっと関連しているようです:新鮮なスナップショットを作成してから、作成操作が成功したかどうかを報告します。この理由を考えると、名前createFreshSnapshotはあなたの状況に最適なもののようです。


1
なぜあなたが反対票を投じられているのか、私にはわかりません。意味論的ではないため、使用を避けていますが、多くの内部Java APIで使用されている規約です。
カミルBęben

1
私は最初は「Set:boolean add(E e)」しか書いていないので、よく知られているjava.util.Setに関するものであることに人々は気付かなかったと思います。または多分私の英語がとても悪いので:D。
賛成票を
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.