コントローラ編(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。原著者の許諾を得て翻訳・公開いたします。Guidiがこれまで選んできたアーキテクチャ設計や決定が大のお気に入りです。そこで私は、RailsとHanamiをコンポーネントごとに比較し、記事が長くなりすぎないようそれぞれ別記事を書くことに決めました。本シリーズの第1回目です。MVCデザインパターンになぞらえて今回のタイトルは「コントローラ」で始めることにします。それでは、RailsとHanamiそれぞれのフレームワークにおける実際のコントローラについて見ていきましょう。コントローラの基本Railsの場合Railsのコントローラは、(その前にルーターが扱った)リクエストを受け取って処理し、出力をリクエスト元(クライアント)に送信する役割を担うクラスです。コントローラ内にある複数のpublicインスタンスメソッドは、それぞれ異なるリクエストを処理します。次のコードをご覧ください。/users/1end上でお見せしたのはRESTfulなコントローラの例です。これはRailsで何かを行う場合のベストプラクティスのひとつであり、アプリのリソースへのアクセスを提供する場合は常にRESTfulにします。Hanamiの場合Hanamiのコントローラはモジュールになっており、複数のアクション(これらはクラスです)を束ねる役割だけを担います。アクションは、(こちらもその前にルーターが扱った)特定のリクエストを処理して出力をクライアントに送信する役目を担います。endend...上の2つのアクションで、何が行われているかはだいたい見当がつくかと思います。相違点Railsの場合、必要に応じて1つのコントローラクラスにいくつものpublicインスタンスメソッドを持ちます。Hanamiの場合、必要に応じて1つのコントローラモジュールにいくつものアクションクラスを持ちます。Hanamiのアクションクラスは、publicインスタンスメソッドである#callを定義するためだけに必要とされています。どちらがどうよいのか私の意見としては、Hanamiアーキテクチャの方がクリーン度が高いと思います。いうのも、1つのアクションが1つのクラスになっていることで、「1つのクラスの責務はひとつでなければならない」という単一責任の原則を満たせるからです。Railsのコントローラの問題として非常によく知られているのは、コントローラクラスがだんだん巨大化して読むのもひと目で理解するのもつらくなってしまうという問題です。「コントローラは薄く、モデルは厚くせよ」というRailsのベストプラクティスはご存知かと思いますが、コントローラが肥大化する心配がまったくないに越したことはないとは思いませんか?Hanamiの場合、アクションの肥大化はかなり簡単に回避できます。1つのクラスが1つのリクエストを扱うことが必須になっていますし、コントローラの複数のアクションでコードが重複したら、Ruby組み込みのソリューションであるモジュールが普通に使えます。繰り返し使われるコードを1つのモジュールに配置して、それを必要とするアクションクラスでincludeすればおしまいです。次の例をご覧ください。endendキリリと引き締まったコードですね。ビューテンプレートへの変数公開コントローラは、データをビュー層に公開する役割を担います。HanamiとRailsのやり方は非常に似通っていますが、わずかに異なる点があります。Railsの場合Railsでは、コントローラ内で宣言したインスタンス変数はすべてテンプレート(ビュー)からアクセスできるようになっています。Hanamiの場合Hanamiの場合、exposeというクラスメソッドを使わないとインスタンス変数を公開できません。次の例をご覧ください。endendまとめここまで読んだ方なら「RailsでやれることをHanamiでやろうとするとコード量が増える」とお思いかもしれませんし、実際そうかもしれません。Configuration)」に依存する部分が多くなっています。Railsで作業していると魔法のように感じられるのはそのためです。Hanamiの規約は少なく、意図を明確にする方向に開発者を強制します。私見ですが、コントローラのアクションを個別のクラスにするアイデアは実に素晴らしいと思います。1つのリクエストを受け取るときに何が起きるか、そこだけに注意を払えばよいのですから。このアーキテクチャは正しいように思えます。本シリーズの次回では、Railsのモデル(ActiveRecord)とHanamiのモデルドメイン(エンティティとリポジトリ)が対決します。Davydov氏がHanamiアプリのアーキテクチャをテーマに登壇します。ツイートよりHanamiのコントローラはホント良いと思っている派です。2018最近、RailsのControllerを保守しやすく書く方法として各エンドポイントのメソッドをActionモジュールとして切り出す独自実装を入れてたんだけど、Hanamiが同じような実装だった。独自実装が有名FWの思想に近くてちょっと嬉しい。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。