本記事は ギルドワークスAdvent Calendar 10日目の記事です。
はじめに
ギルドワークスでは、Ruby on Railsで記述したプロジェクトが多く存在します。
その中で定番のGemfile構成(ライブラリ構成)があります。毎回全く同じ構成というよりは、都度新しいものを吟味しながら取り込もうとしていますが、1年ほど前から利用している active interaction が面白かったので紹介します。
active interactionとは
active interaction は、 GoFのcommandパターン をベースに、ビジネスロジックを実装するためのクラス構成を与えるgemです。
普段だと、 contorller や model に書いていたり、あるいはそれぞれの ActiveSupport::Concern で書いているロジックになっているものだと思われます。それを、active interactionのBaseクラスを継承したクラスをつくることで、見通しがよくなります。(ギルドワークスでは新たな service層として置いていることが多いです。
どのように使うか
呼び出し側
呼び出し側=controller側では、定義したクラスの「 run() 」メソッドを呼び出します。「 run() 」の引数には、ActionContollerのoaramsをほぼそのまま渡すか、対象となるモデルの情報を載せたりします。以下、Accountモデルの更新(Update)の例です。(サイトのものを改変しています。
def update # 引数inputs(hash) の整理 inputs = { account: Account..find by id(params[:id]) }.reverse_merge(params[:account]) outcome = UpdateAccount.run(inputs) if outcome.valid? redirect_to(outcome.result) else @account = outcome render(:edit) endend
呼ばれる側
呼ばれる側は、 ActiveInteraction::Base を継承したクラスを実装します。
呼び出し側は「 run() 」でしたが、実装するメソッドは「 execute() 」です。
class UpdateAccount < ActiveInteraction::Base object :account string :first name, :last name, default: nil validates :first name, presence: true, if: :first name? validates :last name, presence: true, if: :last name?
def execute account.first name = first name if first name? account.last name = last name if last name?
unless account.save errors.merge!(account.errors) end account endend
クラスの先頭に書いてあるobjectやstringは、inputsで渡ってくる引数の宣言です。ここに記載している引数は、デフォルトで存在チェックなどを実施します。Rubyはあまり型を意識することはない動的型付け言語ですが、静的型付け言語のような宣言的記述をするのが特徴です。
validates は、 ActiveRecord::Model と同じものが利用できます。これもひとつ実装の見通しがよくなっている理由かと思います。
executeが実際の処理内容です。
run()が呼ばれてexecute()が実行されるの時点で、既に「指定したattributesの存在チェック」と「記述したvalidatesの実施」が実行されます。ため、executeにはいわゆるガード節を最低限にでき、本来のロジックの記述に集中できます。
まとめ
以上、簡単にActiveInteractionの使い方を紹介しました。
これを利用することで宣言的に引数を記述でき、呼び出し側と呼ばれる側、双方の記述を簡素化できます。
こういったgem(ライブラリ)を利用することで、実装の見通しをよくし、「正しくつくる」ようにできればと思っています。
Photo on Foter.com
この記事もどうですか?
-
リファクタリング第二版で追加された「不吉な臭い」
本記事は、 ギルドワークスAdventCalendar 17日目の記事です。 とうとうリファクタリング第二版が発売です! 先月末に、とうとうリファクタリングの第二版が、原著にて発売されました!もともと1999年に発売された本ですから、およそ…
- アジャイル開発
-
チームメンバーに自分を見せている?〜「ジョハリの窓」の紹介〜
「チームの成熟度」はプロジェクトの成功に必要なことの1つ プロジェクトがうまく進み、プロジェクトの目標に近づく要因の1つに チームの成熟度 があります。ここでは「メンバーそれぞれがお互いのことをどれほど知っていて、理解しあっているか?」をチ…
-
越境と正しいものを正しくつくる、9つのお話。
この記事は、 ギルドワークス アドベントカレンダー の17日目の記事です。 手元のディレクトリの数によると、2017年は 31回 の講演やワークショップを行っておりました。デブサミに始まり、クライアント企業様向けプライベートセッション、コミ…
- DRR
- 正しいものを正しく作る
- アジャイル開発
- 仮説検証