koheitakahashiのブログ

2020.07.01にプログラマーとして生を受けた私が学んだことや、日常について徒然に書いていきます。

クラスメソッドとインスタンスメソッドの違いは?

はじめに

FJORD BOOT CAMPのSinatraでメモアプリを作成する課題のレビューを先生にしていただいたのですが、そこで、教えていただいたクラスメソッドとインスタンスメソッドの違いを忘れないようにまとめたいと思います。

Memoクラスで見る違い

メソッドを実行するということは、メソッドが対象に作用するということです。 つまり、クラスメソッドはクラスに対してメソッドが作用し、インスタンスメソッドはクラスから生成されたインスタンスに対してメソッドが作用します。

今回の課題で、私はMemoクラスを作成しました。Memeクラスの簡単なコードは以下になります。 メモクラスはメモを新しく作るcreateメソッドと、メモを削除するdeleteメソッドを持ちます。

class Memo
  def self.create(title: title, body: body)
    contents = { id: SecureRandom.uuid, title: title, body: body }
    File.open("memos/#{contents[:id]}.json", "w") { |file| file.puts JSON.pretty_generate(contents) }
  end

  def delete(id: id)
    File.delete("memos/#{id}.json")
  end
end

ここで、各メソッドは誰に作用しているかを分かりやすくするため図にしてみました。

createメソッドはMemoクラスに作用して、インスタンス(新しい1枚のメモ)を生成します。 一方で、deleteメソッドはmemoというMemoクラスからnewメソッドで生成されたインスタンス(1枚のメモ)に作用します。

f:id:NMP300:20191016194214j:plain
クラスメソッドとインスタンスメソッドの対象の違い

メソッドが対象とするものの違いでクラスメソッドとインスタンスメソッドが分けられることが分かりました。

では、もっと具体的な判断基準はないのかということで、私は以下のように教えていただきました。

Memoクラスを例にとるならば、 クラスメソッドはMemoという概念が持つにふさわしいかどうか、インスタンスメソッドはメモ1枚1枚に作用するものかどうかで判断することができます。

つまり、createメソッドはMemoという概念がそもそも持っている「メモとして文字を書き留めて残す」という意味であり、deleteメソッドは「残されたメモ1枚を削除する」という意味があります。 したがって、createメソッドはクラスメソッドに、deleteメソッドはインスタンスメソッドとなると考えられます。

最後に

この課題でご指摘いただくまで、クラスメソッドとインスタンスメソッドの使い分けを全く意識していませんでした💦

まだまだRuby知らないことばかりなのだと実感しました。 色々な書籍を読んで、Rubyに対する理解を深めていきたいです💪

参考

【Ruby入門】クラスメソッドとインスタンスメソッドの使い方まとめ

インスタンスメソッドとクラスメソッドはどのようにして使い分けるべきか?(Rubyの場合)

FJORD BOOT CAMPの「Sinatra を使ってWebアプリケーションの基本を理解する」プラクティス