フレームワークを最大限使うということ
バヅクリCTO合原です。
当社サービス開発は、
サーバーサイドアプリケーションにRails,
フロントエンドアプリケーションに、Nextjs
を使っています。
昨年終わりあたりから新メンバーがjoinしましたが、一部のメンバーは、Rails自体初めて‥ということなので、少しばかり私なりのRailsの使い方、考え方をこの場を借りてまとめたいと思います🤓
MVCアーキテクチャ
Railsといえば、👇で有名なアーキテクチャですね。
さて、MVCそれぞれの役割は何でしょうか?
MVCそれぞれの詳細については、Railsガイドを参照。
その上で、
リクエストを、適切なリソース(URL)へ誘導するのがルーティングの責務とした場合、
コントローラ(C)の責務は、リクエストの交通整理です。
例1
ルーティングから渡されたGETリクエストがDBデータを要求しているなら、適切なmodelへリクエストを投げてGETする。
例2
POSTリクエストが、新しいレコードの生成を要求しているなら、対象のmodelにcreateを要求する(POSTする)
つまり、コントローラで、過剰にデータの操作したり、
30行以上に渡る表示用データの生成処理をしたり、するべきではないのです。
ここで、modelの説明の前に、👆に出た表示‥viewについて。
View(V)の責務は出力
コントローラからモデルを経由して操作してきたデータをユーザーに見える形にしたり、使いたい形にして、出力すること。
画面描画に限らず、CSVダウンロード(出力)やjsonなどでの返却すべて、Railsでは、このviewにて担うのが本筋です。
たとえば、描画ではよく使いがちな、文字列データのFormat変換メソッドをhelperに用意すると、view でカジュアルに使えるようになるのは、Railsのお作法に則ったやり方の例です。
コントローラで、無理くりメソッドはやしている事例もありますが、本来的ではないのです。
view contextで使うべきものは、適切に配置すれば、簡単に呼び出せるようになっているのです。
さて、modelの役割は何でしょう?
巷の説明だと、データベースアクセス、操作と理解している方も少なくないかもしれません。
たしかに、RailsではActive Recordパターンをmodelに採用しているため、そう思う方もいるかもしれません。
先に結論から話をすると、
Model(M)が担うべき責務は、(C)にも、(V)にも、相当しない部分全て
です。(やや乱暴ではありますが😅)
つまり、データベース操作に限らないのです。
Railsの機能を、つかわずともmodels配下に作成したクラスは、どこからでも呼べるようになります。
さらに、1からrubyだけでクラスを作成して、エラー処理作らずとも、
Rails側で実装されているvalidatesやerrorsなどがincludeできるActiveModelを使用すれば、いとも簡単にActiveRecordライクなモデルも作成可能です。
つまり、Railsのいいとこ取りな独自クラスが簡単に作れるのです。
また、モデルが、一定のお作法に則って作れるということは、
テストしやすい、ということにも通ずる点です。
今回はそのメリットの詳細は割愛しますが、
このようにRailsのお作法に乗ると、スクラッチでゼロから作るよりもはるかに標準化しつつ、簡便にプロダクト開発ができます。
これがRailsの規約に従うことの真価かな、と私は考えています。
言い換えるならば、これが、
フレームワークを最大限使う
ということ。
本当は、デザインパターンの適用のしやすさなど、Railsだからこそ、
生まれるメリットはたくさんありますが、きりがないので、
この辺にしておきますw
まとめ
Railsをベースに話をしてきましたが、何もRailsに限った話ではなく、
各種フレームワークがどういった思想、設計で、何を目的に作られているのか、
そういった視点で検討し、ケースに応じて、導入すべきですし、
使う以上徹底的にフレームワークが、提供してくれている機能を有効利用するべき、
だと私は考えています。
なんとなく流行っているから、といった理由だけで技術選定、導入するのではなく、
目的に合わせて、フレームワークの選定をすると、強力な武器になります。
バヅクリでは、フレームワークだけでなく、新技術の導入を積極的に行っています。
昨年は、より柔軟なUI、UXの改善を目指して、社内管理サイトにNuxtjsを導入したり、法人管理画面にViteを導入したりと、チームで果敢に技術選定を行い、導入から本運用までを行っています。
プロダクト開発を通じての価値提供を最大化するために、イイモノは積極的に取り入れていくスタンスです😊📝
まだまだ、発展途上の当社では、
新しい技術を導入するだけでなく、
どういった視点で導入し、利用していくのか、
実際の業務を通じて、トライできる機会がたくさんあります!
そんな当社が気になる方は下記より、カジュ面でもいいですし、コメント頂けたら嬉しいです !
技術的な挑戦=会社の成長になる、ダイナミックな当社で力を発揮したい!エンジニアとして腕を上げたい方は一報お待ちしております!