Help us understand the problem. What is going on with this article?

Ruby 引数の順番への依存を取り除く方法

More than 1 year has passed since last update.

クラスの初期化時に引数を渡す順番を固定しないようにする方法でなるほどなーと思ったので共有してみます。(レベルとしては初歩中の初歩)

引数への順番の依存

順番に依存する場合の例

dependency.rb
Class Hoge
  attr_reader :foo, :bar, :fuga

  def initialize(foo, bar, fuga)
    @foo  = foo
    @bar  = bar
    @fuga = fuga
  end
  ...
end

#インスタンス生成時の引数を渡す順番が固定されている
Hoge.new(foo, bar, fuga)

対応策

固定されたパラメーターの代わりにハッシュを受け取るようにする

not_dependency.rb
Class Hoge
  attr_reader :foo, :bar, :fuga

  def initialize(args)
    @foo  = args[:foo]
    @bar  = args[:bar]
    @fuga = args[:fuga]
  end
  ...
end

#インスタンス生成時の引数を渡す順番はなんでもOK
Hoge.new(foo: foo, bar: bar, fuga: fuga)

追記(2017/08/02)

Ruby2.0からはキーワード引数が導入されたため、以下のように記述することができます。

キーワード引数を使う

not_dependency_2.0.rb
Class Hoge
  attr_reader :foo, :bar, :fuga

  #Ruby2.1からデフォルト値は省略可能
  def initialize(foo:, bar:, fuga:)
    @foo  = foo
    @bar  = bar
    @fuga = fuga
  end
  ...
end

#インスタンス生成時の引数を渡す順番はなんでもOK
Hoge.new(foo: foo, bar: bar, fuga: fuga)

さらに、キーワード引数を使用することで、

  • (デフォルト値がなければ)必要な引数がないときにエラーになる
  • 間違った引数を渡したときにエラーになる

ため必要な引数が過不足なく渡ることが保証できるそうです。

まとめ

引数の順番をいちいち意識しなくていいのは便利。
引数が多い場合は使ってみると良いかも。

参考書籍

オブジェクト指向設計実践ガイド(技術評論社)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした