カテゴリー
サインイン 新規登録

間違いや改善の指摘

内容の技術的な誤り・誤字脱字やミスのご報告・解説やトピックの追記/改善のご要望は教材をさらに良くしていく上でとても貴重なご意見になります。

少しでも気になった点があれば、ご遠慮なく投稿いただけると幸いです🙏

実際には誤りではなく勘違いであっても、ご報告いただけることで教材のブラッシュアップにつながります。

質問ポリシー①

教材受講者みなさんのスムーズな問題解決のために、心がけていただきたいことがあります。

教材の内容に関する質問を投稿しましょう

教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。

その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。

1-5

パラメータに任意の初期値を設定

こちらでは、より柔軟にパラメータの初期値を設定できるよう、initializeメソッドをさらに改善していきます。

ここまでの内容で、initializeメソッドを使うことによってコードはだいぶシンプルになったのですが、まだ不便なところがあります。それは、決まった値しかパラメータに設定できないところです。

現在は、initializeメソッドの中に以下のように値が固定されています。

rb
123456
Copied!
def initialize @name = "テリー" @hp = 500 @offense = 150 @defense = 100 end

これを、各インスタンスごとに柔軟に値を設定できるようmain.rbを書き換えてみましょう。その際は、new演算子に引数を渡して値を設定します。

rb
123456789101112131415161718192021222324252627282930313233343536
Copied!
class Brave # new演算子から渡された引数を受け取る def initialize(name, hp, offense, defense) @name = name @hp = hp @offense = offense @defense = defense end def name @name end def hp @hp end def offense @offense end def defense @defense end end brave = Brave.new("テリー", 500, 150, 100) puts <<~TEXT NAME:#{brave.name} HP:#{brave.hp} OFFENSE:#{brave.offense} DEFENSE:#{brave.defense} TEXT

こうすることにより、インスタンスごとにパラメータを自由に設定できるようになりました。

例えば、3人の勇者を作成しても、各勇者ごとに違ったパラメータを設定できるようになります。

rb
123
Copied!
brave = Brave.new("テリー", 500, 150, 100) brave2 = Brave.new("マロン", 200, 150, 20) brave3 = Brave.new("プリン", 100, 300, 10)

これでだいぶ柔軟に勇者を作成することができるようになりました。しかし、これでもまだまだ改善できる点はあります。

まず、今はinitializeメソッドの引数としてnamehpoffensedefenseの3つを設定しているのですが、引数を見ただけではどのパラメータに値を渡しているのかがわかりません。そこで、main.rbinitializeメソッドを編集してもっとわかりやすくしていきましょう。そのときに使用するのがキーワード引数です。

rb
123456789101112131415161718192021222324252627282930313233343536
Copied!
class Brave # new演算子から渡された引数を受け取る def initialize(name:, hp:, offense:, defense:) @name = name @hp = hp @offense = offense @defense = defense end def name @name end def hp @hp end def offense @offense end def defense @defense end end brave = Brave.new(name: "テリー", hp: 500, offense: 150, defense: 100) puts <<~TEXT NAME:#{brave.name} HP:#{brave.hp} OFFENSE:#{brave.offense} DEFENSE:#{brave.defense} TEXT

上のコードのようにすると、どのパラメータにどういう値を渡しているのかが一目瞭然です。そのため、コードの可読性が上がりグッと読みやすくなります。

ただ、こちらももう少し改善することができます。今のままではnew演算子で渡す引数の数が増えるとinitializeメソッドの引数も増やす必要があり、変更箇所が多くなってしまいます。なので、以下のようにmain.rbinitializeメソッドの引数を変更し、ハッシュとして値を受け取れるようにしましょう。こうすることで、new演算子で渡す引数の数が増えても変更箇所が少なくて済みます。

rb
12345678910111213141516171819202122232425262728293031323334353637
Copied!
class Brave # paramsで一括で受け取る def initialize(params) # 各パラメータをハッシュで取得 @name = params[:name] @hp = params[:hp] @offense = params[:offense] @defense = params[:defense] end def name @name end def hp @hp end def offense @offense end def defense @defense end end brave = Brave.new(name: "テリー", hp: 500, offense: 150, defense: 100) puts <<~TEXT NAME:#{brave.name} HP:#{brave.hp} OFFENSE:#{brave.offense} DEFENSE:#{brave.defense} TEXT

これでinitializeメソッドの引数の記述をだいぶスッキリさせることができました。ここで最後にもうひと押し。initializeに渡す引数はnew演算子においてhp: 500, offense: 150, defense: 100というようなハッシュの形式(キーとバリューの組み合わせ)となっています。そのため、main.rbinitializeに渡せる引数はハッシュのみになるよう限定してあげましょう。そうすることで、ハッシュ以外の値を引数で渡した場合エラーとなってくれるので、予期せぬバグが発生しにくくなります。

rb
123456789101112131415161718192021222324252627282930313233
Copied!
class Brave # 引数に**を記述:ハッシュしか受け取れなくなる def initialize(**params) @name = params[:name] @hp = params[:hp] @offense = params[:offense] @defense = params[:defense] end def name @name end def hp @hp end def offense @offense end def defense @defense end end brave = Brave.new(name: "テリー", hp: 500, offense: 150, defense: 100) puts "NAME:#{brave.name}" puts "HP:#{brave.hp}" puts "OFFENSE:#{brave.offense}" puts "DEFENSE:#{brave.defense}"

以上でだいぶ柔軟に初期値を設定できるようになりました。次のパートからはセッター、ゲッターの記述をよりシンプルにする方法を学んでいきます。