Standard gemを試してみた

testdouble/standard: 🌟 Ruby Style Guide, with linter & automatic code fixer

Rubyに「ほどよい」Linterを用意したい

実はだいぶ前から Ruby に「ほどよい」Linter がないものかと思っていた。Rubocop は避けたかった。設定が面倒だし、よさげな設定を探して歩くのもイヤだ。あと話題になった当初の評判がよくなかったのもある。

JavaScript については Flycheck入れてみた (2019-09-16) | あーありがち の頃だから3年近く前かな、この時期に

JavaScript Standard Style

にしている。今となってはなんとなく Standard っぽいかどうかを身体が覚えて何も考えずにそんな感じのコードになる。考えることが減ってよいと思っている。

翻って Ruby については Rubocop を避けた結果

troessner/reek: Code smell detector for Ruby

を入れたり入れてなかったりしていた。個人的には細かいところにあまり文句を言ってこないから割とよいかなと思っていたけど、

  • インスタンス変数を使わないのならクラスになってる必要なくない? UtilityFunction
  • なんでこんなに行数長いの? TooManyStatements

をちょいちょい踏み抜くので、これの ignore 設定を書くのがダルいなと思っていた。

実際に試してみた

さすがにいい加減決めちまおうと思って存在は知っていたけど評判を聞くことがほとんどなかった

testdouble/standard: 🌟 Ruby Style Guide, with linter & automatic code fixer

を実際に導入してみた。

結果、

  • 文字列を double quote にしろと修正される。量は多いけど、まぁ「はいはい」と従うだけ
  • 一方で、予想していたよりはあまり細かい指摘はない
    • 特に block の do/end, {} を変に統一するようなものがなかったのは嬉しい
  • =begin / =end が使えないのは割とイヤだけど、ゆうて慣れそう
  • 普通に安全性やパフォーマンスに関する指摘をもらえるのはありがたい
  • if 式などのインデントはつらい

最後のルールは Layout :: RuboCop Docs のことで、イヤだったのは

var = if cond
        true
      else
        false
      end

みたいなやつをダメって言ってるんだけど、さすがにこれは気持ち悪いなーと思ったら

var =
  if cond
    true
  else
    false
  end

で回避できた。じゃーいっか。

すでに数年 JavaScript Standard に「合わせる」のに慣れてたためか、昔よりずっと「基準があるありがたさ」の方が感情的には優っている。もちろん Standard gem がいろいろなものを参考にしたうえで、妥協点として優れたポイントを見出してくれているということもあると思う。

少なくともこれで「すでに経験が豊富で強いこだわりがあるわけではない newbie が迷わずにコードを書けそう」と感じられた。これが収穫としていちばん大きいと思う。

うん、悪くないんじゃないかな。

※ Reek については知らないコードに対して実行することでにおいを嗅ぐのに使う程度でよさそう。

Rubocop については

RubocopでRubyコードのスタイルを強制せず、バグだけ検出 - スタディサプリ Product Team Blog

みたいな運用もアリかなと思うけど、できるだけ手間を掛けないという意味だと Standard gem でまぁいいんじゃないかなという気持ち。とりあえず身の回りのコードはこれに寄せていこうと思う。

More