Rubyにおいて引数が必要なメソッドを使う際に、引数についての知識や特定の固定された順番で渡す必要があり、依存関係が生まれます。この固定された順番の引数への依存に対して回避する方法をメモしておきます。
初期化の際に引数にハッシュを使う
固定されたパラメータの代わりにオプションのハッシュを受け取れるように実装します。
initializeメソッドは引数をただ1つのargsのみにしています。argsはハッシュであり、入力の全てが含まれます。そのため、引数の順番に対する依存が全て取り除かれ、初期化の際に使われる引数やデフォルト値の追加や削除がしやすくなります。
1 2 3 4 5 6 7 8 9 10 11 12 | class Character attr_accessor :hp, :offensive_power, :defense_power def initialize(args) @hp = args[:hp] @offensive_power = args[:offensive_power] @defense_power = args[:defense_power] end end character = Character.new(:hp => 100, :offensive_power => 20, :defense_power => 5) |
||メソッドでデフォルト値を設定する
||メソッドを使って明示的にデフォルト値を設定することができます。
注意点として、||メソッドはor演算子と同様の動作をするため、左辺の式がfalseまたはnilの場合右辺の結果を返します。
1 2 3 4 5 6 7 8 9 | ... def initialize(args) @hp = args[:hp] || 50 @offensive_power = args[:offensive_power] || 5 @defense_power = args[:defense_power] || 2 end ... |
例えば以下のような式の場合は、boolキーが存在しない時、または存在するが値がfalseまたはnilの場合でもtrueが設定されるようになってしまいます。
1 | @bool = args[:bool] || true |
fetchメソッドでデフォルト値を設定する
そのため、引数のfalseとnilの区別が必要な場合はfetchメソッドをデフォルト値の設定として使うのが良さそうです。fetchメソッドは対象のキーをみつけるのに失敗しても自動的にnilを返しません。
以下の例の場合、fetchメソッドを使うことでhpキーがargsハッシュにない場合のみ、デフォルト値の50が設定されるようになっています。||メソッドの違いは、hpに対してfalseやnilを設定することができます。
1 2 3 4 5 6 7 8 9 | ... def initialize(args) @hp = args.fetch(:hp, 50) @offensive_power = args.fetch(:offensive_power, 5) @defense_power = args.fetch(:defense_power, 2) end ... |