Rails tips: Parameter Objectパターンでリファクタリング(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails tips: Parameter Objectパターンでリファクタリング(翻訳)

1つのメソッドにやたら多くのパラメータを渡さないようにするのに苦労することがあります。こんなときはParameter Objectパターンの出番です。Parameter Objectはパラメータを属性として持つ素朴なRubyオブジェクトであり、パラメータをいくつも渡す代わりに1つのオブジェクトインスタンスを引数として渡せます。このパターンのメリットがよくわかるサンプルのクラスを見てみましょう。

class Notificator
  def push_update(title, content, category)
    some_api_class.push(title: title, content: content, category: category)
  end
end

上では更新をAPIにプッシュするサンプルクラスが使われています。みてのとおり、このパラメータはAPIメッセージに関連しています。シンプルなクラスでParameter Objectを作成します。

class ApiMessage
  attr_reader :title, :content, :category

  def initialize(title:, content:, category:)
    @title = title
    @content = content
    @category = category
  end
end

それではNotificatorクラスを書き換えて、メソッドで必要な引数が1つで済むようにしてみましょう。

class Notificator
  def push_update(api_message)
    some_api_class.push(title: api_message.title, content: api_message.content, category: api_message.category)
  end
end

コードが読みやすくなり、テストもしやすくなりました。ここで重要なのは、Parameter Objectをごくシンプルなオブジェクトとしての利用にとどめていることです。さもないと、このリファクタリングパターンの意図が失われ、余計な機能と大量のコードを抱えた普通のクラスになってしまいます。


RSpec & TDDの電子書籍を無料でダウンロード

もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。

関連記事

Rails tips: Simple Factoryパターンによるリファクタリングの使いどころ(翻訳)

Railsで重要なパターンpart 1: Service Object(翻訳)

Railsで重要なパターンpart 2: Query Object(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ