"check_oppai"という名前を使いたくない

check_xxx がなんでダメなのか - Yamashiro0217の日記 より



"A doctor is checking oppai."


僕もメンバーには「"check" じゃ何するかわかんないから使わないで」とちょくちょく言っている気がするので考えなおしてみた。
"check" を使ってほしくない理由は2つ。

  • 「何を」チェックするのかわかりづらい
  • 「どう」チェックするかわかりづらい(破壊的か非破壊的か)
  • チェックした「結果」をどう返すのかわからない


1つ目2つ目についてはリンク先でも書いているが、これについてはメソッド名に対象を入れてやれば何をどうチェックするかはある程度わかる。例えば、アカウント情報に使われているメールアドレスが重複しないか調べたい場合に

Account#check_email_duplicate

のような名前を付けるかもしれない。

しかし、3つ目についてはどうだろう。チェックした結果をどう返すべきか?どう返されることを想定すべきか、僕にはわからない。


ここで、最初の画像に話が戻る。英辞郎で "check" という単語を調べた*1時に、下記のような例文が出てきた。

〔〜の状態などを〕検査する、チェックする
・Have a doctor check your breasts once a year. : 年に一度、医師による乳房の検診を受けてください。

この場面で「医師がクラウディアさんに返すべき返答」が「"check_oppai_health" メソッドが返すべき値」である。

  • return 9; // 10点中9点ですね
  • return true; // nice oppai
  • throw new BreastCancerException(); // 乳がんが見つかりました
  • return ERROR_BREAST_CANCER; // 乳がんが見つかりました
  • // 返答なし(何も問題ありませんでした)

おそらくどれもありうるパターンで、どれも間違いではない。であるがゆえに、"check_oppai_health" というメソッドを見た他人は返り値に何が返ってくるか想像がつかない。

もし、上記のような返り値を返すのであれば、それぞれ下のようなメソッド名にしたほうが良いかもしれない。

  • score_oppai_health
  • has_healthy_oppai
  • assert_healthy_oppai
  • detect_oppai_error

返り値が2値なのであれば、is, has といった boolean であることが明らかな接頭辞を付けたい。また、不合格時に例外を飛ばすのであれば、保証する内容で assert(validate) したい。診断結果をエラーコードという形で返す場合は難しいので、いい例があれば教えて欲しい。

しかし、多くの場合、「検査する」という意味の "check_xxx" は上記のような慣習に倣った別の名前に置き換えられるはずで、安易に "check" を使うのは逃避行動だと認識したほうがいい。もし、"check" という単語を使わざるを得ないような処理を行なうのであれば、そのメソッドの責任の分割から考えなおしたほうが良いかもしれない。

返り値おまけ

  • // 返答なし(おっぱいにチェックマークをつけた)

そもそも "check" の意味を別の意味で捉えている場合はこんな処理が行われるかもしれない。マークシートを対象に "check" という単語を使ったりすると、こういう勘違いが生まれる場合がある。

*1:http://eow.alc.co.jp/search?q=check&ref=sa