はじめに
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枚のメモ)に作用します。
メソッドが対象とするものの違いでクラスメソッドとインスタンスメソッドが分けられることが分かりました。
では、もっと具体的な判断基準はないのかということで、私は以下のように教えていただきました。
Memoクラスを例にとるならば、 クラスメソッドはMemoという概念が持つにふさわしいかどうか、インスタンスメソッドはメモ1枚1枚に作用するものかどうかで判断することができます。
つまり、create
メソッドはMemoという概念がそもそも持っている「メモとして文字を書き留めて残す」という意味であり、delete
メソッドは「残されたメモ1枚を削除する」という意味があります。
したがって、create
メソッドはクラスメソッドに、delete
メソッドはインスタンスメソッドとなると考えられます。
最後に
この課題でご指摘いただくまで、クラスメソッドとインスタンスメソッドの使い分けを全く意識していませんでした💦
まだまだRuby知らないことばかりなのだと実感しました。 色々な書籍を読んで、Rubyに対する理解を深めていきたいです💪
参考
【Ruby入門】クラスメソッドとインスタンスメソッドの使い方まとめ
インスタンスメソッドとクラスメソッドはどのようにして使い分けるべきか?(Rubyの場合)
FJORD BOOT CAMPの「Sinatra を使ってWebアプリケーションの基本を理解する」プラクティス