wwwave's Tech Blog

株式会社ウェイブのエンジニアブログです。 ここではエンジニアの目線から会社の話や技術的な話をしていきたいと思います。

Rubyにおけるクラス、インスタンスについて

ウェイブに新卒入社してから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です。

f:id:k-shirato:20190131191132j:plain

そして、クラス(設計図)が呼び出すことのできるメソッドをクラスメソッドと言います。
今回の例だと、self.create_time(作成時間)です。
メソッド名の頭にself.がついているのが目印です。

Robot.create_time
=> 新しいロボットを10分で作成可能

設計図があると、その設計図を元に何かが作成できそうです。
そうです、その何かがインスタンスとなります。

インスタンスとは

クラスからインスタンスを生成することをインスタンス化と言います。
インスタンス化にはnewメソッドを使用します。

# インスタンス生成
robot1 = Robot.new("ロボット1号")

f:id:k-shirato:20190131194010j:plain

インスタンスが生成された際に呼ばれるのが、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日以内」かどうかの識別をしております。
インスタンスメソッドを使用するケースとしては、特定のインスタンスに対して働きかける際に使用するケースが多いかと思います。

おわりに

クラス、インスタンスについて調べると、かなり奥が深いです。
自分自身、まだまだ学習することは多いと感じております。
ただ、オブジェクト指向言語の学習において、クラス、インスタンスのイメージを掴むことが、最初の一歩かと思います。

また、弊社ではもくもく会を開催しております!
プログラミング初心者大歓迎のため、少しでも興味がある方はぜひご参加ください!!!!