nullCheck

突然だが、メソッド名とその振る舞いについてツッコミたい。

今触っているプログラムに、次のような名称のメソッドが何度も出てくる。文字列がnullまたは長さゼロの文字列であるかどうか調べる、というものである。

boolean nullCheck(String str)

先に言っておく。そもそも名前の付け方を間違っている。こんな名前のメソッドを作ってはいけない。

まず、メソッドはオブジェクトの振る舞いをあらわすのだから、動詞から始まるべきである(例外もあるけど)。上記の場合、checkNull()になるべきで、nullCheck()などあり得ない。もっとも、checkNull()にしても、「nullを調べる」といったわけのわからない意味になるため、checkという単語を使っていること自体が誤りであると言える。

また、この名前には返値が何を意味するのかつかみづらいという問題がある。booleanということは、返す値はtrueかfalseしかない。よって、こういうメソッドの名前は「はい」「いいえ」で回答できる疑問文の形になっているべきだ。具体的には、isXXX(XXXであるか?)またはhasXXX(XXXを持っているか?)といった名前にする。例えば今回のケースでは、isNull()という名前にしておけば、「isNull(nullか?)」「true(はい)」ということで、trueが返ればnullであることが一目瞭然である。checkといわれても、「チェックした結果」など2値に制限されないから、trueにしろfalseにしろ返った値がどういう意味を持つのかいまひとつよくわからない。

と、根本的に間違っていることを理解したうえで、あえて話を進める。果たして、このメソッドは引数strがnull(または長さゼロの文字列)である際に、trueとfalseのどちらを返すべきであろうか?

俺は、感覚的にtrueを返すべきだと思う。しかし、人によっては逆に考えて、falseを返すよう実装するものらしい。今回扱っているプログラムではfalseを返すので、大変混乱し、容赦なくisNotNull()という名前に変えた。英語の文法的にどうなのか検討すべきなのか、とも思ったが、それだと結局結果がbooleanの2値に収まらないということはすでに書いた。

ま、結局名前が悪いから判断に困るのだ、もうちっと頭つかって名前つけろ、という結論に落ち着くわけなのだが、微妙な認識違いがなんだか気持ち悪い。そういうものだと思うしかないのであろう。設計書に複数通りに解釈できるような曖昧な文を書かない、というのは常識である。しかし、これはソースコードにも適用できるようである。