0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】インスタンスメソッドからクラスメソッドへ変更

Last updated at Posted at 2020-05-11

#はじめに
本来、クラスメソッドとして定義するべき所をインスタンスメソッドで定義してしまっていたので、変更を行った。

#インスタンスメソッド(例)

・インスタンスメソッドの定義
app/models/hoge_fuga.rb

class HogeFuga
  def method_name
    puts "インスタンスメソッドが呼び出される"
  end
end

・インスタンスメソッドの呼び出し
app/controllers/piyo_controller.rb

class PiyoController < ApplicationController
  def piyo
    hogefuga = new.HogeFuga # インスタンス生成
    hogefuga.method_name #=> "インスタンスメソッドが呼び出される"
  end
end

インスタンスメソッドの場合は、
「newメソッド」で、インスタンスを作ってから、
インスタンス名.method_nameですね。

#クラスメソッド(例)
・クラスメソッドの定義

app/models/hoge_fuga.rb

class HogeFuga
  def self.method_name
    puts "クラスメソッドが呼び出される"
  end
end

クラスメソッドの定義はメソッド名の前に「self.」を付けます

・クラスメソッドの呼び出し
app/controllers/piyo_controller.rb

class PiyoController < ApplicationController
  def piyo
    HogeFuga.method_name #=> "クラスメソッドが呼び出される"
  end
end

#クラスメソッドにすべき場合

  • まず、initializeメソッドで初期化を行う処理が含まれていない場合。

##initializeメソッド(例)

class Phone
  attr_accessor :name, :version

  def initialize(name, version)
    self.name = name
    self.version = version
  end

  def suggestion
    puts "#{self.name}#{self.version}を使ってみませんか?"
  end
end

phone = Phone.new("iPhone", "X")
phone.suggestion
#=> iPhoneXを使ってみませんか?

このような初期化の処理がない場合に加えて、

  • インスタンスごとに固有の処理が行われない場合

上記のような場合は、インスタンスを生み出す必要のあるクラスではないと判断してクラスメソッドを使った方が、分かりやすい。

逆にそれ以外は、基本的にインスタンスメソッドを使えないか、ということを先に考えた方が良い。

また、クラスメソッドはクラス全体に関する情報を処理する場合、
インスタンスメソッドは生み出したインスタンスに関する情報を処理する場合、
に使うといったイメージだと思いました。

例えば、上の例で生成したPhone(携帯電話)の数を数えるというメソッドを作る場合、そのメソッドはそれぞれのインスタンスに関するものではなく、Phoneクラス全体に関するものなので、クラスメソッドとします。

#hogeやfugaについてちゃんと検索してみた
・メタ構文変数という名前があり他にも、foo,barなど様々ある。
・ファミリーという概念があり、foo,bar,baz等一つの塊ごとに使う。

##参考にさせて頂いた記事

##終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?