12/08/2018, 13:25

Ruby Access Control

Truy cập các phương thức trong Ruby Để thay đổi trạng thái của một đối tượng trong lập trình hướng đối tượng ta phải thông qua các phương thức (method) mà đối tượng này cung cấp. Vậy việc truy cập các method trong Ruby như thế nào? Ruby cung cấp 3 mức độ bảo vệ cho các phương thức của mình ...

Truy cập các phương thức trong Ruby

Để thay đổi trạng thái của một đối tượng trong lập trình hướng đối tượng ta phải thông qua các phương thức (method) mà đối tượng này cung cấp. Vậy việc truy cập các method trong Ruby như thế nào?

Ruby cung cấp 3 mức độ bảo vệ cho các phương thức của mình

  • public: phương thức này có thể gọi từ bất cứ đâu, có thể coi như không có kiểm soát hay giới hạn truy cập.

  • protected: phương thức này có thể được gọi từ một đối tượng của lớp này hoặc một đối tượng là con của lớp này.

  • private: phương thức này chỉ được gọi từ chính nó (đối tượng gọi và đối tượng nhận là một).

Dưới đây là một số ví dụ về quyền truy cập các method trong Ruby

1. Truy cập từ một đối tượng khác lớp (đối tượng gọi phương thức và đối tượng nhật phương thức thuộc 2 lớp khác nhau)

class AccessControll
  def test_public
    puts "public access OK"
  end

  protected

  def test_protected
    puts "protected access OK"
  end

  private

  def test_private
    puts "private access OK"
  end
end

class Test
  def test
    aceess_controll = AccessControll.new
    aceess_controll.test_public # public access OK
    aceess_controll.test_protected # NoMethodError
    aceess_controll.test_private # NoMethodError
  end
end
Test.new.test

Trong ví dụ trên chúng ta kiểm tra bằng các gọi đến các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng thuộc lớp Test. Vì đối tượng gọi đến các phương thức trên không thuộc lớp AccessControll nên chỉ gọi được các phương thức public của đối tượng nhận, còn những phương thức là protected và private thì không thể truy cập được.

2. Truy cập từ một đối tượng khác thuộc cùng một lớp (2 đối tượng gọi và nhận phương thức thuộc cùng một lớp)

class AccessControll
  def test other
    other.test_public # public access OK
    other.test_protected # protected access OK
    other.test_private # NoMethodError
  end

  def test_public
    puts "public access OK"
  end

  protected

  def test_protected
    puts "protected access OK"
  end

  private

  def test_private
    puts "private access OK"
  end
end

AccessControll.new.test AccessControll.new

Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng khác cũng thuộc lớp này. Vì đối tượng gọi phương thức có lớp giống với đối tượng nhận phương thức nên có thể gọi các phương thức public và proctected của đối tượng nhận, còn phương thức private thì không truy cập được.

3. Truy cập từ một đối tượng thuộc lớp con (đối tượng gọi có lớp là lớp con của đối tượng nhận)

class AccessControll
  def test_public
    puts "public access OK"
  end

  protected

  def test_protected
    puts "protected access OK"
  end

  private

  def test_private
    puts "private access OK"
  end
end

class Children < AccessControll
  def test other
    other.test_public # public access OK
    other.test_protected # protected access OK
    other.test_private # NoMethodError
  end
end

Children.new.test AccessControll.new

Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng khác thuộc lớp con của lớp này. Vì đối tượng gọi phương thức có lớp là lớp con so với lớp của đối tượng nhận phương thức nên có thể gọi các phương thức public và proctected của đối tượng nhận, còn phương thức private thì không truy cập được.

4. Truy cập từ một đối tượng thuộc lớp cha (đối tượng gọi có lớp là lớp cha của đối tượng nhận)

class Parent
  def test other
    other.test_public # public access OK
    other.test_protected # protected access OK
    other.test_private # NoMethodError
  end
end

class AccessControll < Parent
  def test_public
    puts "public access OK"
  end

  protected

  def test_protected
    puts "protected access OK"
  end

  private

  def test_private
    puts "private access OK"
  end
end

Parent.new.test AccessControll.new

Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng khác thuộc lớp cha của lớp này. Vì đối tượng gọi phương thức có lớp là lớp cha so với lớp của đối tượng nhận phương thức nên có thể gọi các phương thức public của đối tượng nhận, còn phương thức protected và private thì không truy cập được.

5. Truy cập từ cùng một đối tượng (đối tượng gọi phương thức và đối tượng nhận phương thức là 1 đối tượng duy nhất)

class AccessControll
  def test
    test_public # public access OK
    test_protected # protected access OK
    test_private # private access OK
  end

  def test_public
    puts "public access OK"
  end

  protected

  def test_protected
    puts "protected access OK"
  end

  private

  def test_private
    puts "private access OK"
  end
end
AccessControll.new.test

Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ chính nó. Vì đối tượng gọi và đối tượng nhận phương thức là một nên có thể gọi đến tất cả các phương thức public, protected và private.

Hy vọng qua các ví dụ trên có thể giúp các bạn hiểu thêm về quyền truy cập đến các phương thức trong Ruby. Cảm ơn đã theo dõi bài viết!

0