プログラミング備忘録

プログラミングの学習状況をメモしています

10日目

今日の学習

Ruby

クラス

クラスの用語や定義、なぜそうするのかの理解を深めるために、単語を一つ一つ流さずに見ていく。

クラス定義をテンプレートで覚えてしまったせいで、何でattr_accessorを使っているのか?メソッドはなぜ設定しているのか?という点を曖昧にしたままであったのが良くなかった。

インスタンス変数

以下、こちらの記事から引用。

Rubyのインスタンス変数を使用例をもとに現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

インスタンス変数とは、インスタンス毎に別々の値を保持できる変数

そして、

インスタンス変数はオブジェクトの外からアクセスできないため、クラスにメソッドを定義する必要性があります。
その定義したメソッドを通じて、インスタンス変数にアクセスするということとなります。

クラス(設計図)から作成されたインスタンス(オブジェクト)ごとに、情報を保持できる変数ですよ〜ということになる。

インスタンスごとに情報を保持したいなら、インスタンス変数を作る。作り方は、@変数名とする。

クラスの中ではなんとなく@をつければいいんだな、と考えてしまっていたので、酷い解釈の仕方だったと思う。

車Aの色は赤色、車Bの色は青色にしたいとして、車クラスから作成するときは、車ごとに色を変えたいので、@colorとする...といった具合か。

これまでに習った教材にも、当たり前のように上記のことは書いてあるのだが、いかに自分が雰囲気で学習を進めていたかがよく分かった...。お恥ずかしい限りである。

initialize

さらに、なぜクラスにメソッドを定義するのかについても理解できた。

このメソッドとして利用するのが、initializeメソッドという理解で大丈夫だろうか。

initializeメソッドについて、再び記事からの引用。

インスタンス生成の時に初期値として入れる値を定義したメソッド

まずはinitializeメソッドにて、引数を利用してインスタンス変数を受け取る。

そして、受け取った後にクラス内のメソッドに渡すことによって、各インスタンスに応じた処理になる。

アクセサ

attr_accessorについて理解するには、そもそもセッターとゲッターが存在する理由を知っておかなければならない。

外部から@変数に値を代入するものがセッター、外部から変数に代入された値を取り出すものがゲッター

これがないと、そもそもインスタンス変数に値を代入したり、値を取り出すことができない。

全然関係ないが、セッター

def name=(name)
  @name = name
end

と、name=(name)の辺りが普段のメソッドでは見かけない形になっていて気持ちが悪い。

【Ruby】 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト

こちらの記事によると、

メソッド名の末尾に=(イコール)をつけると、代入式のようにメソッドを呼び出すことが出来ます。

ということらしい。?????メソッドを呼び出しながら代入するときにイコールをつけるんだろうか。

とにかく、アクセサは外部からアクセスするために必要不可欠なものである。クラス外で使用するために必要だ。

しかし、アクセサメソッドが必要な場合、そうでない場合の差があまり分からない。

要は、インスタンス変数を含んでいるinitializeメソッド以外のメソッドを経由していればOKなのだろうか?

まとめ

おぼろげながらも、昨日よりは確実にオブジェクト指向まわりを理解できたように思う。

  • インスタンス変数とは、インスタンス毎に別々の値を保持できる変数。@変数名で作成
  • インスタンス変数には、クラスで定義したメソッドを通じて外部からアクセスする
  • initializeメソッドにて、インスタンス生成の時に初期値として入れる値を定義
    キーワード引数を使用する事で、どのような引数を渡しているのか明白にする)
  • アクセサを用いて、外部からインスタンス変数にアクセスする
  • attr_accessorメソッドでは、文字列かシンボルを用いて読み取りたいインスタンス変数名を指定
  • 書き換えられたくないものはattr_readerのみで定義をする

そして、先日作成したクイズのプログラムを改めて見てみると、attr_accessorを使っているにも関わらず、下の方に改めてゲッターを設定するというとんでもない無駄行為に及んでいることが分かった。すげー恥ずかしい。

attr_accessorも、一行にまとめられるのに3行にまたがって書いてあるし……。気づいていないだけで、他にも改善点がありそう。

そして、昨日できなかった課題も、求められている出力結果を出せるようになった!よかった。

リファクタリング case文

case文を作成し、case文の中で変数を定義していたが、case文自体を変数に代入できるという方法を、やんばるエキスパートのあやね様に教えていただいた。

case user.age
when 0..5
  fee = @entry_fee[:infant]
when 6..12
  fee = @entry_fee[:children]
when 13..64
  fee = @entry_fee[:adult]
when 65..120
  fee = @entry_fee[:senior]
end

このように、入場者の年齢によって、入場料金を決めたい。

変数feeが何度も出てくるが、case文自体をfeeに代入することにより、大幅に見やすくなった。

fee = case user.age
when 0..5
  @entry_fee[:infant]
when 6..12
  @entry_fee[:children]
when 13..64
  @entry_fee[:adult]
when 65..120
  @entry_fee[:senior]
end

どのようにして無駄な部分を省くか、重複を避けられるか、非常に勉強になった。

Ruby on Rails

デバッグツール(binding.pry)

pry-byebugの基本的な使い方を学習。

Railsは、

ルーティング → コントローラ → ビュー

という流れで処理をしていることをしっかり理解する。

デバッグの練習をしてみたが、binding.pryを用いて原因を絞っていくのが難しい。

処理の流れを理解できておらず、この段階ではこの情報が入っていないとおかしい、と論理的に考えられていないからだろう。

あとは、複数形であるかどうか、ルーティングはどうなっているのかの理解を徹底しなければならないと強く感じた。

www.youtube.com

やんばるエキスパートにてメンターをして下さっているたけ様の動画。一つずつ丁寧に解説されていて、非常に分かりやすかった。

エラー文をコピペして検索をよくやってしまっていたので、英単語ひとつひとつとしっかり向き合っていく。

学習メモ

  • ハッシュの値は変数[:キー]の形で取り出す
  • form_withでのリクエスト先は、modelの部分で自動生成している