はじめに
初めましてこんにちは、ほげがめのてー(@sss__727)と申します。
Webエンジニアを目指して2025年4月からオンラインプログラミングスクールRUNTEQにてRuby on Railsを学習しています。
完全未経験の状態から学習を始めたので、入学当時は初めて学ぶ単語一つひとつに戸惑い、焦りを感じながら進めていました。
そんな私が出会った理解の仕方をここでまとめておこうと思います。
(※理解において不足点や間違いがありましたらご指摘いただけますと幸いです。)
結論
結論からお話しします。
タイトルにもあるように、答えは 「自分の好きなもの/身近なものに例えてみる」。
参考書や技術記事の例えだとどうしても腹落ちしないのは、自分事として捉えづらいからだと考えました。
その例を実際私が発表したアウトプット資料とともにご紹介します。
「今更聞けないインスタンスメソッド」
技術書曰く
- インスタンスとは?
〜クラスに基づいて生成された実体
- インスタンスメソッド
〜クラスのインスタンスに対して定義されたメソッド。
特定のインスタンスに関連する操作やデータを扱うために使用される。
※メソッドとは、なにかしらの処理をまとめ、その一連の処理に名前をつけたもの。
=処理、指令
いや、こんなことは参考書読めばわかんねん!!! (わかるとは言っていない) ←この状況が多かったです。
そこで、自分の好きなもの=プロ野球チームのオリックス・バファローズに例えてみることにしました。
例えてみよう!
- インスタンス:「クラスに基づいて生成された実体」
→クラスの設計に沿って作られたデータ
→クラスにおける実働部隊
→クラスは枠組みでしかない
ex)
-
クラス→オリックス・バファローズ
オリックス・バファローズというクラス自体は何もしない(野球の試合でボールを投げたりしない)が、名前を見ただけで「プロ野球チーム」だとわかる。 -
インスタンス→所属している人。(ここではわかりやすくプレイヤーとします。)
インスタンスは、クラスの設計に沿って作られた実働部隊。
=実際に試合をする人たち。
一人の情報がすでにインスタンスとなります。
コードで書くと以下のようになります。
class OrixBuffaloes
def initialize(name,number,position)
@name = name
@number = number
@position = position
end
def info
"#{@name}, #{@number}番, #{@position}"
end
end
player = OrixBuffaloes.new("宮城大弥", 13, "ピッチャー")
puts player.info
出力結果: 宮城大弥, 13番, ピッチャー
ふむふむ。なるほど……?
「いやしかし、で、だから何?『宮城大弥』で呼び出したんだから『宮城大弥』で出力されるに決まってるやん」(当時の私談)
インスタンス変数を使用する意味はなんだ!?
(※ここではinitializeメソッドの説明は省きます)
インスタンス変数を使うことで、データをいろんな場面で引用したり書き換えられたりする!
例えば、オリックスのHPには選手名鑑があります。
他にも試合結果ページやグッズショップもあり、そこで選手ごとのユニホームやタオルなど様々な種類のグッズがあります。
ここで、インスタンスメソッドがない世界では、選手情報を一人ひとり直打ちしなければならず、例えば背番号が変更された時に一つひとつ手直ししなければならなかったり、その過程で修正漏れが起きたり、表示がずれたりと細かい問題がおきる可能性がありますよね。
しかし、これをインスタンスメソッドがある世界では、
player = Player.find(13)
で探せるわけですね。(便宜上、プレイヤーIDを背番号と同じ番号として扱っています)
また、実際宮城選手は2025年シーズン、背番号を13からエースナンバーの18に変更しました。
この場合も
player = Player.find(13)
player.update(number: 18)
とすれば、背番号が変更されて選手名鑑やグッズサイト全てにおいて
# (先ほどのインスタンスメソッドのコードを前提に)
puts player.info
出力結果: 宮城大弥, 18番, ピッチャー
と変更されるんですね。こりゃ便利だ。
補足ですが、DBとの差は……?
しかし、これだとDBが全てやってくれるのでは?という疑問が湧きました。
DBはあくまで「データの置き場所」で、そのデータをどう扱うか・どう表示するかを決めて呼び出しているのがインスタンスメソッドだったんですね〜。
じゃあクラスメソッドは何ができるのか?
class OrixBuffaloes
def self.uniform_color
"ネイビー"
end
end
これでユニホームの色が変わりました。
チーム全体の変更がある場合はクラスで行い、一人ひとりのデータの呼び出しや更新を行う場合はインスタンスを用いる、と私は理解できました。
結果
抽象的概念が具体的な出来事へと変化したため、「具体と抽象」のどちらも行き来することで理解を深められました。
また、推しに例えたことで「こういうときはどうだろう?」という、最初の疑問より先の疑問まで湧いてきたのです。
そして「ユニホームや背番号の例までは理解できたけれど、場内アナウンスでは例えられないのか?ここを例えられていない=まだ理解しきれていないのでは?」と、途中で理解を放棄せずに学習を終えられました。
コツ
この学習法のコツは、一番手こずっている部分でトライしてみることです。
当時の私が一番難解に思ったのがインスタンスメソッドでした。
そのため、これを大好きなオリックスに例えたとき、初めて腹落ちしましたし、これを糧に他の学習にも励むことができました。
ある程度理解できている部分を例えるのもいいですが、それは別に例えなくても頭に入っていると思います。
そのため、あえて難しい山を自分の好きなジャンルと掛け合わせることで中和させていくことをオススメします!
私はインスタンスメソッドの他に、命名規則をプロ野球チームの名前や他の固有名詞の英単語などと対比しながら覚えたり、RubyとRuby on Railsを音楽記号とオーケストラに例えて理解したりしました。
まとめ
私にとって、プログラミング学習は楽しいことです。
それでも理解できない日々が続くと頭を悩ませ心も萎えさせると思います。
これを読んでくださった方も自分なりに楽しんでさらに学習に励む一助となりましたら、この上のない幸いです。
以上、ほげがめのてーでした。