Rails初心者から中級者になったと感じたきっかけ
エンジニア(プログラマー)をやっていると基本的には徐々にレベルアップしていきます。
しかしある点で閾値を越えて、レベルが一気に上がると感じる瞬間があります。
皆さんどうでしょうか?
自分の場合は
クラスメソッドとインスタンスメソッドの違いをはっきり理解したことがそのきっかけでした。
これまでぼんやりとモデルにメソッドを追加していたものがかなり自信を持ってメソッドを追加出来るようになりました。
今回はクラスメソッドとインスタンスメソッドの違いを簡単に紹介して、他にも初級者から中級者に上がるようなパターンを考えてみたいと思います。
クラスメソッドとインスタンスメソッドの違い
本当にその名の通りなんですが、
クラス全体で使えるのがクラスメソッド
あるクラスのインスタンスで使えるのがインスタンスメソッド
具体例を書くと、rubyでは
class Dog #クラスメソッド def self.choge end #インスタンスメソッド def ihoge end end
このように書きます。とりあえずクラスはDog(犬)です。
クラスメソッドは self.メソッド名 という書き方をします。
メソッド内のselfの違い
これはこちらの記事が参考になります。
インスタンスメソッド内での self の値を調べた - (゚∀゚)o彡 sasata299's blog
クラスメソッド内ではオブジェクト、インスタンスメソッド内ではインスタンスとなります。
(解説していけば解説していくほどそのまんまだな)
呼び出し方の違い
呼び出し方は
#クラスメソッド Dog.choge #インスタンスメソッド dog = Dog.new dog.ihoge
のようになります。クラスメソッドはクラスからそのまま呼び出し、インスタンスメソッドはクラスのインスタンスから呼び出します。
使い方の違い
ここがある意味今回の記事一番のポイントかと思います。
説明するとこれまで同様、そのまんまの説明になるので、上記のDogを利用した具体例から。
クラスメソッドの場合
- Dogのうち一番年齢の高いDogを取り出すメソッド
- Dogのうちオスのみを取り出すメソッド
例えばこんな感じ
class Dog < ActiveRecord::Base # 一番年齢の高いDog def self.get_oldest self.order("age DESC").limit(1) end # オスのみを取り出す def self.get_male self.where(:sex => "male") end end
要は「クラス全体の中から何かを取り出す」場合などに利用されます。
インスタンスメソッドの場合
- とあるDogの年齢、性別をHashで取り出すメソッド
- とあるDogの親のDogを取り出すメソッド(親が子のIDを持っているケース)
class Dog < ActiveRecord::Base # 年齢、性別 def get_profile { :age => self.age, :sex => self.sex } end # 親を取り出す def get_parent Dog.where(:child => self.id) end end
こちらは「あるインスタンスの何かを取り出す」場合などに利用されます。インスタンスメソッドの場合は更新系もよく出てくるかと思います。
とりあえずここまででクラスメソッドとインスタンスメソッドの違いはなんとなくわかっていただけたかと。