ume

Ruby インスタンスメソッドとクラスメソッドの使い分け

結論

インスタンス毎に異なるデータを持たせたい場合はインスタンスメソッド、全てのインスタンスに共通に持たせたい場合がクラスメソッド(もしこの見分け方で例外ができた場合その時にまた学ぶとする)

給料計算のプログラムの例

前提
  • 全従業員は同じ基本給

  • ボーナスは人ごとに変わる

class Employee
  @@base_salary = 50000  # クラス変数で基本給を設定

  def initialize(name)
    @name = name
  end

  # インスタンスメソッドで給与計算
  def calculate_salary
    @@base_salary + bonus  # ボーナスを加算
  end

  private

  # インスタンスごとに異なるボーナスを計算するプライベートメソッド
  def bonus
    rand(10000)  # ランダムにボーナスを生成
  end

  # クラスメソッドで基本給を変更する
  def self.change_base_salary(new_base_salary)
    @@base_salary = new_base_salary
  end
end

# インスタンスの作成
employee1 = Employee.new("Alice")
employee2 = Employee.new("Bob")

# 給与計算の呼び出し
puts "#{employee1.calculate_salary} 円"  # 個別のボーナスが加算されて表示
puts "#{employee2.calculate_salary} 円"  # 別の個別のボーナスが加算されて表示

# 基本給の変更
Employee.change_base_salary(55000)

# 給与計算の呼び出し(基本給が変更されているため、全社員に影響)
puts "#{employee1.calculate_salary} 円"
puts "#{employee2.calculate_salary} 円"

ボーナスは人(インスタンス)ごとに変わるのでインスタンスメソッド 基本給は全従業員(全インスタンス)に共通しているのでクラスメソッドを使用する