LoginSignup
2
0

Rubyにおける真偽値で終わるメソッドの命名について

Last updated at Posted at 2023-06-18

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?)。ブール値を返さないメソッドは疑問符で終わるべきではありません。

ソース:https://rubystyle.guide/#bool-methods-qmark

# 例
# 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? など) と矛盾しています。

ソース:https://rubystyle.guide/#bool-methods-prefix

# 例
# 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

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0