ウェイブに新卒入社してから2年が経とうとしているKSです!
今回のテーマは、「Rubyにおけるクラス、インスタンス」についてです!
クラスやインスタンスについての説明や、簡単な具体例を交えてご説明致します。
また、本記事の内容は初心者向けで、あくまで一例のご紹介となります。
はじめに
私自身、入社してから初めてRuby on Railsについて学習しました。
学習する際、成長を感じたのが、クラス、インスタンスについてイメージを掴んだ時でした。
「その時、世界が変わった (; ゚ ロ゚)」
イメージを掴めると、「なんだ、そういうことか!」と思えます。
しかし、用語のイメージが掴めないままコーディングしてしまうと、可読性低く、メンテナンス性の悪いコードになってしまいます。
可読性の高いコードを書くことができると、チーム開発において、レビュアーの負担も減らすことができます。\_(・ω・`)ココ重要!
そのため、クラスやインスタンスについての理解を深めることはとても重要なことだと言えます。
前提知識
説明で使用するクラスは以下です。
class Robot # 初期化する際に呼ばれる def initialize(name) @name = name end # インスタンスメソッド def attack puts "#{@name}パンチ!!!!!" end # クラスメソッド def self.create_time puts "新しいロボットを10分で作成可能" end end
クラスとは
クラスについての説明は、設計図を用いて例えられることが多いかと思います。
今回の例だと、Robot
です。
そして、クラス(設計図)が呼び出すことのできるメソッドをクラスメソッドと言います。
今回の例だと、self.create_time
(作成時間)です。
メソッド名の頭にself.
がついているのが目印です。
Robot.create_time => 新しいロボットを10分で作成可能
設計図があると、その設計図を元に何かが作成できそうです。
そうです、その何かがインスタンス
となります。
インスタンスとは
クラスからインスタンスを生成することをインスタンス化と言います。
インスタンス化にはnew
メソッドを使用します。
# インスタンス生成 robot1 = Robot.new("ロボット1号")
インスタンスが生成された際に呼ばれるのが、initialize
メソッドです。
今回処理内容としては、引数として渡したロボット1号
をインスタンス変数の@name
に代入となります。
そして、インスタンス(ロボット1号)が呼び出すことのできるメソッドをインスタンスメソッド
と言います。
今回の例だと、attack
(攻撃)です。
このインスタンスメソッドは、インスタンス(ロボット1号)が使用することができるメソッドになります。
そのため、クラス(設計図)が呼ぶことはできません。
つまり、設計図は攻撃することができません(´・ω・`)
robot1.attack => ロボット1号パンチ!!!!! Robot.attack => NoMethodError: undefined method `attack' for Robot:Class
逆に、インスタンスはクラスメソッドを呼び出すことができません。
Robot.create_time => 新しいロボットを10分で作成可能 robot1.create_time => NoMethodError: undefined method `create_time' for #<Robot:0x0000555ba8eddc90 @name="ロボット1号">
各用語のイメージが湧いたでしょうか???
・ クラス:設計図
・ インスタンス:ロボット1号
・ クラスメソッド:設計図が使える機能
・ インスタンスメソッド:ロボット1号が使える機能
次は実際の使用例をご紹介致します!
使用例
- 今回はモデルクラスを用いて使用例をご紹介いたします!
Comicテーブル
カラム名 | 詳細 |
---|---|
id | |
name | コミック名 |
volume | 何巻か |
released_at | 発売日 |
Comicクラス
今回はモデルクラスを使用
class Comic < ApplicationRecord def new_release? self.released_at >= Time.zone.now.ago(5.days) end def self.find_high_school_girl self.where(name: "25歳の女子高生").order(released_at: "DESC").limit(5) end end
クラスメソッド
クラスメソッドですが、インスタンスメソッドと比べると使用率はかなり低めです。
今回の例だと、self.find_high_school_girl
メソッドになります。
このメソッドは、「漫画全体から名前が25歳の女子高生
かつ発売日が最新の5巻分
」のレコードを取得します。
クラスメソッドを使用するケースとしては、外部から特定のデータを取得する際に使用するケースが多いかと思います。
インスタンスメソッド
今回の例だと、new_release?
メソッドになります。
このメソッドは、「特定の漫画が発売されてから5日以内」かどうかの識別をしております。
インスタンスメソッドを使用するケースとしては、特定のインスタンスに対して働きかける際に使用するケースが多いかと思います。
おわりに
クラス、インスタンスについて調べると、かなり奥が深いです。
自分自身、まだまだ学習することは多いと感じております。
ただ、オブジェクト指向言語の学習において、クラス、インスタンスのイメージを掴むことが、最初の一歩かと思います。
また、弊社ではもくもく会を開催しております!
プログラミング初心者大歓迎のため、少しでも興味がある方はぜひご参加ください!!!!