Ginza.rb 第35回 Trailblazer入門に参加してきた #ginzarb
Ginza.rb 第35回 先駆者の知見拝見!Trailblazer - Ginza.rb | Doorkeeper に参加してきました。
Ginza.rbは本当に良いコミュニティ。参加すると、いつも現状で考えられる一番正しい解と最新の情報をもらっています。
Trailblazerについては、去年2015年の9月に勉強会に参加して以来。
Trailblazer勉強会に参加してきた #trbtky - Shoken Startup Blog
2回目ということで、理解はより深まったつもり。わかりやすい発表スライドのおかげです。
発表者: @y_yagi
スライド: http://y-yagi.github.io/introduction_to_trailblazer/
感想
発表後のディスカッションで@netwillnetさんが言っていた。「Trailblazerは学習コストが高い。その学習コストをPayするのは、規模の大きなプロジェクト。だが、大きなプロジェクトではいきなりTrailblazerを入れるのはリスクというジレンマがある。」
別の参加者が、Trailblazerとは別のFW、Hanamiについてだが「エンジニア8人のプロジェクトだが、入れたい。Payできると思う」と言っていた。8人クラスになると足並みをそろえるのが大変のようだ。
TrailblazerやHanamiなど、RailsのMVCとは違う思想のFWの前提にあるのは、Rails辛い問題(詳細は@y_yagiさんのスライド)。fat controllerやfat modelへの回答の一つで、背景にはDDDがある。KitchHikeはエンジニア2人で作っている小規模なプロジェクトで、FWで縛らなくてもある程度の足並みはそろっている。だからといってDDDの知識やTrailblazerの思想が役に立たないかというと、そうではない。ベストプラクティスからの学びは多いし、何よりDDDという共通知識を前提に会話できるのが良い。DDDやTrailblazerは大規模プロジェクト用かもしれないが、小規模プロジェクトの良い指針となっているなと思いました。
明日からもコード書くぞー!
スライドの抜粋メモ
Trailblazerとは
- 通常のMVCとは異なる層を提供する
- Operation(サービスオブジェクト)、View Model(cells)、Form等
- 各処理を適切な層に記載する事で、view / controller / modelがfatになるのを防ぐ
- また、各層を疎結合にする事で各層毎でのテストをしやすくする
RAILS辛い問題
- 気付くとfat controller
- fat controllerを避けようとした結果、今度はmodelがfatになる
- viewにビジネスロジックが記載されている
- viewから直接DB参照してたり
- ビジネスロジックをどこに書けば良いのかわからない
- プロジェクト / 人毎にビジネスロジックを定義する場所がバラバラになる
CONTROLLER
個人的にここが一番大事だと思う。controllerを見るうちの9割はリクエストを追う時なので、ビジネスロジックは視界に入らないで欲しい。fat controllerだと、こんなのを見たいわけじゃない!という箇所が多くてリクエストを追うのが辛い。
- HTTPのエンドポイントとしての処理のみを書く
- リダイレクトやviewのrenderなど
- 当然ビジネスロジックは書かない
OPERATION (Railsに無い層)
- ビジネスロジックを定義する(service object)
- modelを保存する処理を定義するのはOperationだけ
- validation / callback / authorizationもOperationに含まれる
VIEWS
- パーツ毎にcell(view model)を使い、viewはシンプルな状態のままにしておくことが推奨されている
REPRESENTER
その他GEM
- roar: Parse and render REST API documents using representers. 内部で representerを使っている
- formular: f.selectなどを自分でカスタマイズできる。simple_formの類似。
FILE LAYOUT
Sample Project
https://github.com/apotonick/gemgem-trbrb
勉強会で仕入れた新しい情報メモ
- Rubyで作られてDDD指向のWebFW Hanami http://hanamirb.org/guides/
- AWS専用線アクセス体験ラボ http://dev.classmethod.jp/cloud/aws/direct-connect-handson-160511/
- 認可処理用のgem pundit
- View Modelのgem cells
- featureテスト(capybaraなど)を減らせる。featureテストはコストが高い。
- HAL, JSON APIというJSONの標準化フォーマットの2強
- Roda is a routing tree web toolkit, designed for building fast and maintainable web applications in ruby. https://github.com/jeremyevans/roda