Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách ủy quyền các phương thức trong Ruby &Ruby on Rails

Bài viết này nói về ủy quyền phương thức trong Ruby.

Bạn sẽ tìm hiểu cách sử dụng delegate , Forwardable mô-đun &SimpleDelegator lớp học.

Tại sao chúng ta cần ủy quyền ?

Trong Lập trình hướng đối tượng, có hai cách để các lớp làm việc cùng nhau.

Họ là :

  • Kế thừa
  • Thành phần

Với kế thừa, bạn tạo cấu trúc phân cấp lớp, trong đó lớp cha chia sẻ các phương thức, hằng số và định nghĩa biến cá thể với bất kỳ lớp nào kế thừa từ đó.

Ví dụ :

Trong Ruby, mọi đối tượng kế thừa từ Object theo mặc định.

Đó là lý do tại sao bạn có quyền truy cập vào các phương pháp như puts , class &object_id .

Với thành phần, một lớp tạo (hoặc được cung cấp) các đối tượng từ một lớp khác… sau đó nó sử dụng các đối tượng này để ủy quyền công việc cho chúng.

Ví dụ :

Máy tính được tạo ra từ nhiều bộ phận (đối tượng) và mỗi bộ phận biết cách làm tốt một việc.

Nếu bạn muốn hiển thị nội dung nào đó trên màn hình, máy tính sẽ thông báo cho cạc đồ họa hiển thị những gì, nhưng không cho biết cách thực hiện.

Đó là thành phần !

Nhưng điều gì sẽ xảy ra nếu bạn là máy tính và bạn muốn cấp quyền truy cập vào các phương thức cạc đồ họa?

Bạn phải xây dựng một số loại “cầu nối” giữa chúng.

Hãy xem cách thực hiện điều đó.

Ủy quyền phương thức Ruby - Ví dụ

Chúng tôi có hai lớp:

  • Computer
  • Memory

Đưa ra mã sau :

class Computer
  def initialize
    @memory = Memory.new
  end
end

class Memory
  def initialize
    @data = []
  end

  def write(data)
    @data << data
  end

  def read(index)
    @data[index]
  end
end

computer = Computer.new

Chúng tôi muốn chỉ có thể truy cập bộ nhớ thông qua Computer .

Điều này có thể vì nhiều lý do :

  • Bạn chỉ có 1 đơn vị bộ nhớ, có nghĩa là bạn chỉ muốn 1 đối tượng bộ nhớ. Bằng cách tập trung quyền truy cập vào một đối tượng, bạn có thể đạt được điều đó.
  • Bạn muốn kiểm soát ai có thể truy cập bộ nhớ (các ứng dụng khác nhau) và những phần bộ nhớ họ có thể sử dụng.
  • Bạn muốn ghi lại mọi quyền truy cập bộ nhớ cho mục đích bảo mật hoặc gỡ lỗi.

Bây giờ, nếu bạn cố gắng làm điều này :

computer.write("rubyguides")

Nó sẽ không thành công với NoMethodError vì không có write trên Computer .

undefined method `write' for #<Computer:0x000055c2e8f7d310> (NoMethodError)

Computer lớp không biết ý bạn là gì khi write .

Trừ khi ...

Bạn tạo một write phương pháp!

Đây là cách thực hiện :

class Computer
  def initialize
    @memory = Memory.new
  end

  def write(data)
    @memory.write(data)
  end

  def read(index)
    @memory.read(index)
  end
end

Chúng tôi đang chuyển các yêu cầu tới @memory đối tượng.

Đó là ủy quyền phương pháp.

Lưu ý :Điều này làm cho các phương pháp này trở thành một phần của giao diện công khai của bạn (chúng có sẵn cho mọi người) và bạn không phải lúc nào cũng muốn điều đó.

Có một số loại phím tắt cho ủy quyền phương pháp không ?

Vâng!

Hãy cùng xem ...

Cách sử dụng Mô-đun có thể chuyển tiếp

Bây giờ :

Bạn có thể sử dụng Forwardable mô-đun đi kèm với Ruby để xác định các phương thức người ủy quyền.

Nó hoạt động như thế này :

require 'forwardable'

class Computer
  extend Forwardable

  def_delegators :@memory, :read, :write

  def initialize
    @memory = Memory.new
  end
end

Điều này cho phép bạn xóa các phương thức chúng tôi đã tạo trước đó và nó sẽ hoạt động tương tự.

Forwardable sẽ chăm sóc các đối số của phương thức (bao gồm cả các khối!) Cho bạn, vì vậy bạn không phải lo lắng về điều đó.

Điều đó không phải là tốt đẹp? 🙂

Cách sử dụng Phương pháp Ủy quyền Rails

Nếu bạn đang sử dụng Rails hoặc đá quý ActiveSupport của chính nó, thì bạn đã truy cập vào delegate phương pháp.

Đây là cách nó hoạt động :

class Computer
  delegate :read, :write, to: :@memory

  def initialize
    @memory = Memory.new
  end
end

delegate phương thức nhận tiền tố prefix đối số, cho phép bạn thêm tiền tố vào tên phương thức.

Ví dụ :

class Computer
  delegate :read, :write, prefix: "memory", to: :@memory

  def initialize
    @memory = Memory.new
  end
end

Dẫn đến hai phương pháp :

  • memory_read
  • memory_write

Cách ủy quyền mọi thứ với SimpleDelegator

Những kỹ thuật bạn vừa học này được sử dụng để chuyển tiếp hoặc ủy quyền các phương thức cụ thể.

Nhưng nếu bạn muốn bọc một đối tượng và hiển thị tất cả các phương thức của nó ...

Bạn có thể sử dụng SimpleDelegator lớp học!

Đây là cách thực hiện :

require 'delegate'

class CoolArray < SimpleDelegator
end

cool = CoolArray.new([])

cool << "ruby"
cool << "gems"

p cool

Bây giờ CoolArray hoạt động giống như đối tượng bạn chuyển cho new .

Tại sao điều này lại hữu ích?

Bạn có thể thêm các phương thức mới vào đối tượng này mà không cần phải thay đổi lớp ban đầu.

Hướng dẫn bằng Video

Tóm tắt

Bạn đã học về thành phần đối tượng trong Ruby và cách ủy quyền các phương thức bằng các kỹ thuật khác nhau!

Nếu bạn thích bài viết này, hãy chia sẻ nó với những người bạn Ruby của bạn.

Cảm ơn vì đã đọc 🙂