LoginSignup
56
53

More than 5 years have passed since last update.

【Rails・Ruby】 オブジェクト指向

Last updated at Posted at 2015-10-10

オブジェクト

オブジェクトとは、現実世界に存在するあらゆく「もの」や「概念」のことである。
例)人間 / 車 / クラス など

また、実際にコードに当てはめて考えた場合、以下のuserがオブジェクトとなる。

class Test
def index
    user = User.all
    user.find(1)
end
end

クラス

クラスとは、共通の性質を併せ持つオブジェクトをまとめた抽象概念である。

 例)
 オブジェクト : Aさん / Bさん
 クラス : 3年4組 / 男性 / 運動部

また、railsの場合、以下classで定義されている全体がクラスということになる。

class Test
def class_test
end 
end

クラスメソッド

クラスに直接働きかけるメソッドのこと。また、 class << クラス名 or self で括った中のものがクラスメソッドとなり、それ以外はすべてインスタンスメソッド扱いになる。

class << self
def class_test
end
end

インスタンス

クラスを型とした場合、インスタンスはその実際の値であったり、データのことを指す。例えば、クラスのインスタンスはオブジェクトである。

インスタンスメソッド

インスタンスに働きかけるメソッド
以下の場合、配列のインスタンスに対してindexメソッドを働かせている

['1','2','3'].index(1)

インスタンス変数

  • クラスから生成されるオブジェクトごとに固有のものである。
class Test
def new
    @test = Test.new
end
end

レシーバ

あるオブジェクトに対して、メソッドを実行しようとした場合、そのメソッドの働きかけるオブジェクトのことをレシーバという。以下のコードの場合だと、配列部分がレシーバとなる。

['1','2','3'].index(1)

self

  • メソッドを実行したときに、そのメソッドを実行しているオブジェクトを参照することができる。
  • レシーバとの違いは、レシーバはメソッドの働きかける先のオブジェクトの呼び方で、selfは働きかける先のオブジェクトに実際にコード上で参照することである。
  • メソッドを呼び出したとき、すべてのインスタンス変数は、selfのインスタンス変数となる。また、selfを明示せずメソッドを呼び出した場合、すべてselfに対するメソッドになるし、レシーバを他のオブジェクトを指定して、呼び出した場合、そのオブジェクトのメソッドとなる。
class Test < ActiveRecord::Base
def class_test
end
# class_testはインスタンスメソッド

def self.class_test
end
# self.class_testはクラスメソッド
end
class Test < ActiveRecord::Base
def class_test
end
# インスタンスメソッド

def self.class_test
end
# クラスメソッド

def test
    self.class_test
    # インスタンスメソッドのclass_testが呼び出される
    class_test
    # インスタンスメソッドのclass_testが呼び出される
    self.class.class_test
    # クラスメソッドのclass_testが呼び出される
end
end

〜例3のcontrollerと例4のmodelの関係が対応している時〜

class Test < AppricationController
def index
    @instance_test = Text.class_method(test_id)
end
end
class Text < ActiveRecord::Base
def self.class_method(test_id)
    where(id: test_id)
end
end

上記のようにcontroller内のコードを仮にmodelに分割した場合、model内のclass_methodはクラスメソッドになるので、Testクラスのメソッドという扱いになる。よって、controller側で使用したい場合は、クラスを指定したうえ(今回だと、Test)で、メソッド名を書くことで(class_method)動かすことができる。

private関数

  • privateメソッドを呼び出す時は、レシーバを指定することができない
  • 自分(self)以外のオブジェクトのメソッドを呼び出すときには、オブジェクトをレシーバとして明示する必要がある
class Test
def new
    self.private_test
end

private

    def private_test
        p 'private test is success!!'
    end
end

上記のような場合は、private関数内のメソッドを呼び出すことはできない。

56
53
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
56
53