【rails】moduleとclassの使い分ける基準は?

rails

controllerを新しく定義する際に、moduleにするべきか、classにするべきか悩む時がよくあります。きっとそれぞれに優位性があるんだろうなとは思ってましたが、深く調べてきませんでした。

本記事では、railsのmoduleとclassの違いをしっかり理解するため、どういう違いがあるかを調べてみました。

moduleとclassの違い

結論から。違いは下記になります。

  • classはインスタンスが生成できる。
  • classは継承できる
  • moduleはincludeできる。

classはインスタンスが生成できる

インスタンスとは、設計図(class)をもとに作成した実態のことをいいます。たとえば、車というclassがあったときに、「赤い」「7人乗り」「燃費がいい」という情報をあたえると「赤い7人乗りの燃費がいい車」が完成します。これがインスタンスというわけです。

わかりやすい例として、controllerの挙動がインスタンスの例としていいかなと思います。下記だと、

class Book < ApplicationController
  def new
    @book = Book.new
  end

  def create
    @book = Book.new(book_params)
    @book.save
  end
end

Book.newとすることで、新しくBookのモデルのインスタンスを作成することができます。

classは継承できる

classは継承することで親クラスのメソッドを使用することができるようになります。これはApplicationControllerが分かりやすい例かと思います。

rails g controllerとかでコントローラを作成すると< ApplicationControllerがコントローラ名の後についてきます。

class TestController < ApplicationController

Application Controllerに書いた処理がコントローラ全体で使えるようになるのは、上記のようにApplicationControllerを継承しているからです。

moduleはincludeできる

moduleはincludeすることで、includeしたファイルのメソッドを使用できるようになります。

class Book < ApplicationController
  include HogeModule
  def class_method
    // HogeModuleのメソッド
    module_method
  end
end

module HogeModule
  def module_method
    put 'モジュールメソッドです'
  end
end

> Book.class_method
 => モジュールメソッドです

ちなみに、moduleも、extendを使用することでmoduleもclassメソッドとして使用することができる。

class A
  extend B
  def test
  end
end

module B
  def test_b
    put 'test_bです'
  end
end

> A.test_b
 => test_bです

結論

●moduleを使用する場合

  • とある場面で使うメソッドをファイルごとに管理して使いやすくしたい時

●classを使用する場合

  • インスタンスを使用したい場合
  • CRUDなど、apiを作成したい場合

とりあえず、ファットコントローラ、ファットモデルになった際は、特にこだわりがなければ、moduleを使っておけば問題ないと思います。インスタンスとして使用したかったり、ルーティングを定義したい場合は必然的にclass化すると思います。

コメント

タイトルとURLをコピーしました