プロが教えるわが家の防犯対策術!

変数やメソッドの名前を決めるのは、
簡単なことのようで難しかったりします。
それでいて重要であったりもします。
そこで、1つ気になる点があるので質問させていただきます。

例えばある Util クラスがあるとします。(例として StringUtils クラス)
この StringUtils は static なメソッドの集まりをもつように実装します。

文字列が空かどうか調べるために、よく使用されているのが public static boolean isEmpty(String value) というメソッドがありますが、これに疑問があります。
このメソッドを使用する場合は、StringUtils.isEmpty("abc") などとなると思いますが、これって英語の意味的におかしい気がします。(私は英語がまったくできないので偉そうなことは言えませんが、、)
これだと、「StringUtlsは空だ」みたいな意味になってしまいませんか?

私はこういうときには「checkIfValueIsEmpty(String value)」のようにしています。StringUtils.checkIfValueIsEmpty("abc")
これだと「StringUtils が value を空かどうかチェックする」という意味になりませんか?

皆さんはこういう場合、どのように命名されていますか?
確かに boolean を返す場合には定例や規約として「is~」が使われていますが、どうも気持ちが悪いので質問させていただきました。

以上、よろしくお願いいたします。

A 回答 (3件)

Java全般ではないが、JavaBeansにおける命名規則として、



・値を設定するものは「setプロパティ」
・値を取得するものは「getプロパティ」
・ただし、取得する値が真偽値である場合には「isプロパティ」

という形で記述「しなければならない」ことになっている。それ以外の記述は受け付けない。このJavaBeansの仕様が、非常にシンプルでわかりやすいということから、それ以外にも浸透していっているんじゃないかと思う。基本的にこの種の命名は、それが自然言語に似ているかどうかということより「一定のルールに従って書くこと」が重要だ。

StringUtils.isEmpty

それに、これはどう考えても、

StringUtils is Empty

と解釈するほうが変だろう。StringUtilsとisEmptyは別の役割なわけで、もともとのオブジェクト指向の源泉をたどっていくなら、これは「StringUtilsさんが、"isEmpty"といっているよ」というような意味合いであるはず。つまり、

StringUtils: "Is empty?"

ってことだろう。ならば、別に違和感はない。逆にcheckIfValueIsEmptyというように「check~」という命名は、何らかのチェック処理を行わせるものであり、結果を真偽値として取得するには変だ。メソッドの命名は、それがどういう働きのものかを類推できるものでなければいけない。であるならば「真偽値の返値を持つ」ということをメソッド名から瞬時に読み取れる名前である必要がある。

checkIfValueIsEmptyの場合、それが「チェックをするだけ」か、「チェックし、結果を真偽値で返す」か、「チェックし、結果をStringで返す」か、わからない。が、JavaBeansの命名規則をベースに考えるなら、チェックし真偽値を返すなら「isEmpty」、チェックしString値を返すなら「getEmpty」、チェックだけをし返値がないなら「checkEmpty」となり、名前を見ただけでメソッドの働きがすぐにわかる。

また、これは命名規則さえ知っていれば、「こういう働きをするメソッドは何という名前か」を類推して知ることもできる。命名ルールが重要なのは、それが自然な表現かどうかではなく、実にこの「誰でも機能から名前を、名前から機能を相互に類推できる」という部分にある。自然言語に似せるために、このもっとも重要な部分が機能しなくなったのでは本末転倒だ。プログラミング言語における命名は、常に「いかにして名前だけで誰もがその内容をわかるものにするか」を第一義に考えなければならないはずだ。

まあ、少なくともこうした基本的な命名のマナーを定めてきた連中は、われわれ日本人よりはるかに英語に通じている米国人なわけで、そうした米国人に対して、日本人が「英語として変だ」といっても、なぁ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

「StringUtils: "Is empty?"」
は私も考えました。
ただ、「static の場合には、メソッド名は疑問形とする」
といった慣例もないので躊躇していました。

isEmpty()とすることで、そのメソッドの仕様がわかりやすいというのも
わかります。
「自然言語に沿うよりルールに沿う」ということも考えました。

Jakarta commons ライブラリを作った人達にも聞いてみたいですねw

ありがとうございました!!

お礼日時:2009/06/26 14:48

自分の場合ですが、isXXX()メソッドは疑問文ではなくて



 「(引数の値は) is Empty. True or False?」

とこちらが問いかけているようなものなんだな、と
思うようにしてました。
    • good
    • 0

StringUtils.isEmpty("abc")


の場合、
StrintUtilsクラスのisEmpty()メソッドを呼び出す。
と言う意味合いのであると思われますので、
クラス名をS(主語)、メドッソ名をV(動詞)と考える事には無理があると思います。

英文にするなら、
call StringUtils class isEmpty method.のような解釈の方が近いかと、
思いますよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

確かに、static メソッドなので、
オブジェクトに紐付かないので
そのように考えると良いかもしれませんね。

ただ、いきなり「is」で始まるのは
やっぱり抵抗があるんですよね、、、
そもそも「is」始まりのメソッドは、
オブジェクトに紐付くメソッド(インスタンスメソッド)用の
名前じゃないのかなと勝手に思っています。

せめて「checkEmpty」?
また話が戻りそうだ、、、

ありがとうございました!!

お礼日時:2009/06/26 13:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!