Rubyは1つのことを実行するにも様々な書き方ができることが特徴の言語です。これは他の言語からRubyへ移ってくる際に学習コストを下げて参入障壁を下げる効果もありますが、複数名でソースコードを共有してプロダクトを開発する場合は、このメリットがデメリットに転じるケースがあります。

複数名でコードを共有するときに各々が思い思いの書き方をした場合、他の開発者が書いたコードを参考にするために読む場合や、コードレビューを実施するタイミングで自分の書き方に再解釈し直すプロセスを経る必要があり、可読性が下がってしまいます。最悪の場合はコード内容の誤認を誘発するケースがあります。これにより、コードレビューやプルリク承認時のコード確認に時間がかかったり見落としが起きることが起きてきます。

そこで、そういった可読性や誤認識といったところから来る開発効率の低下を防ぐため、一定のコーディング規約を定めてそれを遵守することが、全体的な効率化や品質向上につながります。

その一定のコーディング規約としてよく利用されるのが、下記のルールです。

昔からあるRuby Style Guideに加え、昨今ではRailsやRSpecに対する標準ルール的なものも規定されつつあります。

「いやいや、テストコードまで縛られるのはちょっと・・・」と思う方もいるかもしれませんが、テストコード自体の正当性もプルリクやレビューの時に確認するものですし、もしそこがしっかり書けていなかった場合、その後の試験に対する信頼性を揺るがすことにもなりかねません。そのため、実はプロダクトコードよりも試験コードを重要視している人もいます。

・・・とは言っても、毎回全てのコードを目で見て、人手でチェックすることは非現実的なため、昨今ではツールを使ってコーディング規約の遵守状況のチェックをします。

ツールとしてはrubocopを使ってプロジェクトの全体を評価するといったことがデファクトスタンダードになってきていますが、これで評価できるのは上記のRuby Style GuideRails Style Guideの一部のみとなっています。

「ではRSpec Style Guideに対応しているか確認するには、すべて人がチェックする必要があるのか?」

答えは、Noです。

これについても既にツールが出てきていて、rubocopを拡張する形で実現されています。

これはGemfileに追加してbundle installした後、.rubocop.ymlに追記するか、rubocopコマンド実行時に引数で指定するかの2パターンで実行することができます。もちろんポリシーの有効・無効や、オプションの指定は.rubocop.ymlに合わせて記載することができます。

今回は.rubocop.ymlに追記する方法を紹介します。

  1. あなたのRailsプロジェクトにあるGemfileに下記を追記します。(rubocopのバージョンは、各プロジェクトで使用するバージョンを決めて固定してください)
     group :development do
       gem 'rubocop', '0.60.0'
       gem 'rubocop-rspec'
     end
    
  2. .rubocop.ymlを規定の設定から取得します
     cp $(bundle show rubocop)/config/default.yml .rubocop.yml
    
  3. その後、.rubocop.ymlの最初に下記を追記します
     require: rubocop-rspec
        
    
  4. 後はいつも通りrubocopを実行します
     bundle exec rubocop -R -D -c .rubocop.yml
    

これでRSpecも含めたコーディング規約チェックができます。

このうちプロジェクトで不要なチェックがあった場合、.rubocop.ymlで無効化します。 最初から作るプロジェクトの場合はそのままでも問題ないかもしれませんが、今回実験したプロジェクトでは.rubocop.yml下記のような設定を施しています。

RSpec/NestedGroups:
  Enabled: false

RSpec/ContextWording:
  Enabled: false

RSpec/ExampleWording:
  Enabled: false

RSpec/MessageChain:
  Enabled: false

RSpec/NamedSubject:
  Enabled: false

RSpec/MultipleExpectations:
  Enabled: false

RSpec/ExampleLength:
  Max: 10

ただ、この設定はあくまでも現段階の一例でしかなく、プロジェクトメンバーの力量によって値をチューニングしながら適用していく必要があります。

今年は色々あってrubocopのサンプルをいくつか作ったので、もしよければ活用してみてください。

https://github.com/tk-hamaguchi/docs/tree/master/rubocop%E3%81%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF

Istioでリクエストパスを使ったHTTPルーティングを設定する

Istioにはリクエストパスごとに割り振るサービスを設定することができます。例えば、/api/v1/hoge はAのサービスに、/api/v2/fuga はBのサービスに割り振るといった設定です。これらの機能について、前回の記事『 helmパッケージ化されたアプリをKube...… Continue reading