僕がRuby学習で躓いたポイントを備忘録として残しておきます。
もし間違いがあったら指摘をして頂けると助かります。
・インスタンスを作った時の引数がinitializeメソッドの引数とリンクします
classVendingMachine
definitialize(manufacturer_name)
@manufacturer_name=manufacturer_name
@deposit_coin=0
end
end
vending_machine=VendingMachine.new('サントリー')
putsvending_machine.press_button
#manufacturer_nameとサントリーがリンクします
・メソッドの定義のところと、呼び出す側のところの両方で
「deposit_coin()」 と書かれている時、()の中がリンクすると考えます。
定義するところと呼び出す側の両方に同じメソッドを書いて、引数を作れば勝手にリンクされます。
・メソッドに引数として英単語を付けたら、その引数は変数として扱うことができます。deposit_coin(amount)など。
・単一責任の原則
→他のクラスの変数を参照するのはOKですが、担当領域を超えた変数を扱ったり、書き換えたりすることは良くないです。
例えば、自動販売機のプログラムを作る場合、
「自販機クラス」はコイン投入機能、ボタン押したら商品出てくる機能の担当。
「アイテムクラス」は商品の名前と価格のデータを保持する担当。
のような形で分けることが望ましいです。
・単一責任の原則に基づく設計では、外部からのアクセスを必要としないインスタンス変数については、セッターを定義しないことが望ましいです。
・アクセサはインスタンス変数にアクセスするための公開メソッドです。
→読み出すのがゲッターメソッド。書き込むのがセッターメソッド。アクセサメソッドはその総称です。
・attr_readerはゲッターを設定するために使います。
・チャットGPTについてです。GPT3よりもGPT4の方が生徒が躓いている場所を察する能力が増していると感じます。
イメージ的には普通の家庭教師と優秀な家庭教師の違いに似ています。
何が分からないかも分からない状態を脱する時間の時短になると思いました。
→逆に言えば自力でいろいろ試しながらコードのアンチパターンを蓄えることをしなくなってしまうデメリットもあるのかなと思いました。遠回りをしない分だけ理解が浅くなってしまうリスクがありそうです。
・initializeメソッドで定義する引数の数と、初期化するインスタンス変数の数は一致する必要はありません。引数が1つでも、複数のインスタンス変数を初期化することができます。
・クラスを分ける分けないの判断は、将来的に新しい機能が加わる可能性があるなら分けておくべきです。
・インスタンス変数の初期値は、何かしらの数字を持つ場合は定義しておく必要があります。
例えば何かの商品のクラスを作成する時に、在庫数が初めから30と分かっていたら初期値を30にしても良いです。
・Rubyではクラス名はキャメルケースが一般的です。スネークケースは使いません。
・新しいサブクラスを作る時に引数が1つでも変わる場合はinitializeメソッドをオーバーライドする必要があります。
・case文は、ある値に対して複数の条件を比較する際に特に便利です。if文との使い分けができると良いです。
・vscodeでrubyのファイルを作る一番早い方法
vscodeの「ファイル」→「新しいファイル」から作成して、拡張子rbを名前に入れて保存するだけでできます。
保存先は気をつけましょう。
・例外処理について。
1つのbeginブロックに対して複数のrescueを入れることができます。
また、1つのrescueの中で複数のエラークラスを指定して処理することもできます。
どちらの方法を選ぶかは、エラー処理がそれぞれのエラークラスに対して異なるか、共通の処理があるかによって決定されます。
①エラー処理がそれぞれのエラークラスに対して異なる → 1つのbeginブロックに対して複数のrescue
②共通の処理がある → 1つのrescueの中で複数のエラークラスを指定して処理する
・rescueの中でif文を使うことは可能ですが、複数のエラークラスが関与する場合や、エラー処理が大幅に異なる場合は、複数のrescueブロックを使った方がコードが読みやすくなります。
以上、個人的な備忘録でした~