クラスの初期化時に引数を渡す順番を固定しないようにする方法でなるほどなーと思ったので共有してみます。(レベルとしては初歩中の初歩)
引数への順番の依存
順番に依存する場合の例
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)
さらに、キーワード引数を使用することで、
- (デフォルト値がなければ)必要な引数がないときにエラーになる
- 間違った引数を渡したときにエラーになる
ため必要な引数が過不足なく渡ることが保証できるそうです。
まとめ
引数の順番をいちいち意識しなくていいのは便利。
引数が多い場合は使ってみると良いかも。
参考書籍
オブジェクト指向設計実践ガイド(技術評論社)