Rubyで真偽値を返すメソッドを作るときの命名について、今までちゃんと気にしたことがなかったので調べてみた。
具体的には真偽値を返すメソッドの命名について、大きくは以下のようなパターンが考えられると思う。
oo?
is_oo
is_oo? can_oo?
xxable (できるか?的な意味で)
変数名には?は付けられないので、真偽値を返す変数名にはis_ooのようにisをつけて変数を定義することが多いはず。
でもメソッドには?をつけることができ、また、?をつけることが多いとなんとなく思っていた。
ただ、本当にoo?でいいのか、is_で始めたらダメなのか?とか色々思ったので調べてみた。
検索してみたら以下のように書いてあった。
Predicate Methods Suffix
The names of predicate methods (methods that return a boolean value) should >end in a question mark (i.e. Array#empty?). Methods that don’t return a >boolean, shouldn’t end in a question mark.日本語訳
述語メソッド (ブール値を返すメソッド) の名前は疑問符で終わる必要があります (例: Array#empty?)。ブール値を返さないメソッドは疑問符で終わるべきではありません。
# 例
# bad
def even(value)
end
# good
def even?(value)
end
なのでoo?で終わらせるのがいいことはわかった。
xxable (できるか?的な意味で)的なものも、xxable?としてしまうのが良さそう。
次に、isと?のどちらもつけて、is_oo?とするのはどうなのかについては、以下のように書いてあった。
Predicate Methods Prefix
Avoid prefixing predicate methods with the auxiliary verbs such as is, does, or can. These words are redundant and inconsistent with the style of boolean methods >in the Ruby core library, such as empty? and include?.日本語訳
述語メソッドの前に is、dos、can などの助動詞を付けることは避けてください。これらの単語は冗長であり、Ruby コア ライブラリのブール メソッドのスタイル (empty? など) と矛盾しています。
# 例
# bad
class Person
def is_tall?
true
end
def can_play_basketball?
false
end
def does_like_candy?
true
end
end
# good
class Person
def tall?
true
end
def basketball_player?
false
end
def likes_candy?
true
end
end
とのこと。
そもそもisとかcanをつけること自体が良くないみたい。
なので結論としては、oo?とするのが良い。
思ったこと
このような言語のお作法的なところは、お作法自体を知らないとなんとなくの雰囲気で書いてしまうことが多い。
今回の例でいうと、もしisをつけてしまっても不具合は起きないはずだが、is_oo、is_oo?、oo?みたいに規則がバラバラだと、読む人が分かりづらいと感じることもあるだろうし、そもそもバラバラなこと自体が気持ち悪い。知っておいた方が悩む時間が減るというメリットもありそう。
rubocopで指摘してくれる箇所みたいなので、rubocopを入れているとこういう知識を増やしていけるという点はいいなと改めて思った。
また、Rubyコアライブラリのブールメソッドのスタイル (empty? など) と矛盾している
と書いてあるのを見て、確かに迷ったらコアリブラリを直接みてそれに合わせるのがいいなとも思った。
参考
https://rubystyle.guide/#bool-methods-prefix
https://docs.rubocop.org/rubocop/cops_naming.html#namingpredicatename