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

Lập trình siêu hình Ruby:Ví dụ trong thế giới thực

Bạn có thể đã đọc về lập trình siêu ứng dụng Ruby trước đây.

Nhưng…

Có thể hơi khó hiểu nếu bạn không có một vài ví dụ cụ thể.

Đó là lý do tại sao trong bài viết này :

Chúng ta sẽ xem xét một số dự án nguồn mở phổ biến sử dụng lập trình siêu ứng dụng Ruby.

Các dự án như :

  • Đường ray
  • Sinatra
  • Đá quý kẹp giấy

Tất cả chúng đều sử dụng một số hình thức lập trình siêu hình .

Hãy xem qua mã và tìm hiểu chính xác những gì họ đang làm!

Ví dụ về đường ray

Rails sử dụng nhiều lập trình ẩn, vì vậy đây là một nơi tốt để bắt đầu tìm kiếm.

Ví dụ :

Khi bạn muốn kiểm tra môi trường hiện tại trong ứng dụng Rails của mình, bạn làm như sau.

Rails.env.production?

Nhưng env là gì ? Và nó hoạt động như thế nào?

Câu trả lời có trong StringInquirer lớp, là lớp con của String . Lớp này sử dụng method_missing để bạn có thể gọi env.production? thay vì env == production .

Đây là mã trông như thế nào :

def method_missing(method_name, *arguments)
  if method_name[-1] == '?'
    self == method_name[0..-2]
  else
    super
  end
end

Điều này đang nói :

“Nếu tên phương thức kết thúc bằng dấu chấm hỏi thì hãy thực hiện so sánh, nếu không, hãy tiếp tục đi lên chuỗi tổ tiên”.

Bạn có thể tìm thấy mã gốc tại đây.

Ủy quyền Sinatra

Nếu bạn đã sử dụng Sinatra trước đó, bạn có thể biết rằng có hai cách để xác định các tuyến đường của bạn:

  • Bằng cách sử dụng get / post trực tiếp, bên ngoài bất kỳ lớp nào.
  • Bằng cách xác định một lớp kế thừa từ Sinatra::Application .

Các phương thức Sinatra DSL (Ngôn ngữ dành riêng cho miền) được định nghĩa bên trong Sinatra::Application , vậy làm cách nào bạn có thể sử dụng chúng bên ngoài lớp học này?

Chà, có hai điều đang xảy ra ở đây :

  • Lập trình siêu thị
  • Phần mở rộng mô-đun

Sinatra định nghĩa một Sinatra::Delegator mô-đun bên trong base.rb, được sử dụng để ủy quyền các cuộc gọi phương thức tới một target .

Mục tiêu được đặt thành Sinatra::Application theo mặc định.

Đây là phiên bản đơn giản hóa của delegate phương thức lớp, được định nghĩa trong Sinatra::Delegator :

def self.delegate(*methods)
  methods.each do |method_name|
   define_method(method_name) do |*args, &block|
     Delegator.target.send(method_name, *args, &block)
   end
  end
end

delegate :get, :patch, :put, :post, :delete

Mã này đang tạo một tập hợp các phương thức (với define_method ) sẽ chuyển tiếp các cuộc gọi phương thức tới Sinatra::Application (giá trị mặc định cho Delegator.target ).

Sau đó, main đối tượng được mở rộng với các phương thức được định nghĩa trong Sinatra::Delegator , làm cho Sinatra DSL khả dụng bên ngoài Sinatra::Application lớp học.

Cần lưu ý rằng Ruby có hai lớp tích hợp để ủy quyền phương thức, trong trường hợp bạn cần chúng:Delegator &Forwardable.

Viên ngọc kẹp giấy

Kẹp giấy là một viên ngọc quý cho phép ứng dụng của bạn xử lý việc tải lên tệp. Các tệp được liên kết với ActiveRecord mô hình.

Bạn có thể xác định tệp đính kèm trên một mô hình bằng cách sử dụng has_attached_file phương pháp.

Như thế này :

class User
  has_attached_file :avatar, :styles => { :normal => "100x100#" }
end

Phương thức này được định nghĩa trên paperclip.rb và nó sử dụng lập trình siêu ứng dụng để xác định một phương thức trên Mô hình.

Phương pháp này có thể được sử dụng để truy cập phần đính kèm tệp (là một bản sao của Paperclip::Attachment lớp).

Ví dụ:nếu tệp đính kèm là :avatar , Paperclip sẽ xác định một avatar trên mô hình.

Đây là define_instance_getter phương pháp, chịu trách nhiệm về điều đó:

# @name  => The name of the attachment
# @klass => The ActiveRecord model where this method is being defined

def define_instance_getter
  name    = @name
  options = @options

  @klass.send :define_method, @name do |*args|
    ivar = "@attachment_#{name}"
    attachment = instance_variable_get(ivar)

    if attachment.nil?
      attachment = Attachment.new(name, self, options)
      instance_variable_set(ivar, attachment)
    end
  end
end

Từ mã này, chúng ta có thể thấy rằng đối tượng đính kèm được lưu trữ trong @attachment_#{name} biến phiên bản.

Trong ví dụ của chúng tôi, đó sẽ là @attachment_avatar .

Sau đó, nó sẽ kiểm tra xem tệp đính kèm này đã tồn tại chưa và nếu chưa, nó sẽ tạo một Attachment mới đối tượng và đặt biến phiên bản.

Đây là mã nguồn ban đầu.

Kết luận

Như bạn đã thấy, lập trình siêu hình là một kỹ thuật rất mạnh mẽ và linh hoạt, nhưng bất cứ khi nào bạn muốn tiếp cận nó, hãy nhớ câu trích dẫn có nội dung:“Với sức mạnh to lớn đi kèm với trách nhiệm lớn”.

Nếu bạn thích bài đăng này, đừng quên đăng ký nhận bản tin của tôi 🙂