LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-31

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

引数への順番の依存

順番に依存する場合の例

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)

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

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

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

まとめ

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

参考書籍

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

2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2