はじめに
個人開発の学習用メモとして投稿します。
RuboCopとは、Rubyの静的コード解析及びコードフォーマットを実行するgemです。個人開発で自分がRuboCopを導入した際に遭遇した警告のいくつかをピックアップし、それに対してどう対応したかについて書いていきます。
Ruby初心者ゆえ理解が足りていないところもあると思いますので、誤り等あれば遠慮なくご指摘ください。
警告①「C: Naming/AccessorMethodName: Do not prefix reader method names with get_.」
メソッド名に接頭辞get_を付けるなという警告です。
例えば、年齢を表すインスタンス変数ageがあるとして、その年齢を取得するメソッドの名前は、"get_age"ではなく、"age"が推奨されます。他の言語だと、メソッド名にget_を付けるのは珍しくないと思いますが、Rubyでは、アクセサのメソッド名にget_を付けるのは推奨されません。
因みに、Rubyでは、引数のないメソッドの呼び出しは()を省略できるということもあり、自分のコードは次のように書いていました。
something = get_something
これだと警告に従って機械的にget_を削除すると、メソッド名と変数名が同じになってしまいます。。
この問題については、こちらの記事でも触れられています。
変数名を変えれば重複はしないものの、何となく無理矢理感が否めません。。
因みに、このルールを無効化したい場合は、.rubocop.ymlに次のように追記すれば良いとのことです。
Naming/AccessorMethodName:
# Enabled: false
ただ、このルールは、いわゆるアクセサに対するもののようです。
しかし、自分が書いたメソッドは、標準入力から値を取得するもので、いわゆるアクセサではありませんでした。
そのためルール自体を無効化してしまうのではなく、次のように.rubocop.ymlに追記し、このメソッドを使用しているファイルをRuboCopの対象から除外することにしました。
Naming/AccessorMethodName:
Exclude:
- 'filepath'
警告②「C: Naming/PredicateName: Rename is_xxx? to xxxx?」
メソッド名に接頭辞is_を付けるなという警告です。
例えば、平日かどうかを判定するメソッドがあるとして、そのメソッドの名前は、"is_weekday?"ではなく、"weekday?"が推奨されます。他の言語だと、メソッド名にis_を付けるのは珍しくないと思いますが、Rubyでは、真偽値を返すメソッドの名前にis_を付けるのは推奨されません。
他の言語で慣れているからか、接頭辞is_のメソッドに特に違和感はないのですが、郷に入っては郷に従えということで、メソッド名からis_を削除しました。
警告③「C: Naming/PredicateName: Rename has_xxx? to xxx?」
これも②と同様、メソッド名に接頭辞has_を付けるなという警告です。
例えば、トランプゲームで、プレーヤーがジョーカーを持っているかを判定するメソッドがあるとして、そのメソッドの名前は"has_joker?"ではなく、"joker?"が推奨されます。これも他の言語だと、メソッド名にhas_を付けるのは珍しくないと思いますが、Rubyでは、真偽値を返すメソッドの名前にhas_を付けるのは推奨されません。
ただ、これについては正直腹落ちしないところがありました。
例えば、呼び出しを考えると、警告②では、仮にレシーバーがselected_dayであったとすると次のようになると思います。
selected_day.weekday?
自分の感覚でも、これは選択した日が平日かどうかを判定していると直感的に理解できます。
これに対して、警告③では仮にレシーバーがplayer1であったとすると次のようになると思います。
player1.joker?
これはplayer1がジョーカーを持っているかどうかを判定していると直感的に理解できるでしょうか?
これに対して、次のようなものであれば、十分直感的に理解できます。
player1.has_joker?
Rubyのお作法といえば、それまでなのでしょうが、正直自分の感覚で言うと、"player1.joker?"だと、player1がジョーカーを持っているかではなく、player1自身がジョーカーかどうかを判定しているように思えてしまいます。
結局どうしたか
リファクタリングを重ねた結果、最終的には接頭辞has_のメソッド自体が不要になりました(無理矢理そうしたわけではありません)。
ただ、やはり何かを持っているかどうかを判定するメソッドの接頭辞has_を省略するのは、自分の感覚では可読性が下がっているように思えてしまいます。慣れれば名詞の後に名詞?が来ると、暗黙的にhas_が省略されているものとして、すんなり読めるようになるのでしょうか?
とりあえず今回はルールの無効化は行いませんでしたが、今後個人開発で何かを持っているかどうかを判定するメソッドが必要になった場合には、ルールの無効化も検討したいと思います。
因みに、このルールを無効化したい場合は、.rubocop.ymlに次のように追記すれば良いとのことです。
Naming/PredicateName:
Enabled: false
場合によっては、接頭辞is_とhave_は禁止するものの、has_は許可しても良いかも知れません。
※もちろんチーム開発の場合はチームのルールに従います。