簡體   English   中英

設計Ruby API時的類與模塊?

[英]Class vs Module in designing Ruby API?

當我閱讀有關Ruby元編程的更多信息時,大多數時候我們發現至少有兩種解決方案來解決問題。 請看下面兩個例子:

class Base
  def self.has_many(*args)
    # ...
  end
end

class Student < Base
  has_many :books
end

另一種風格:

module Base
  def self.included(klass)
    klass.extend ClassMethods
  end

  module ClassMethods
    def has_many(*args)
      # ...
    end
  end
end

class Student
  include Base

  has_many :books
end

但是當我們設計api時,我們必須決定使用哪一個,但我想問一下大多數人已經在他們的庫中實現的想法和一些最佳實踐。

如果您的API提供了將由客戶端擴展的基本功能,那么您應該更喜歡繼承

如果您的API將使用自己的基本功能擴展各種客戶端,那么您應該進行合成

你有很多圍繞這個問題的理論。

我傾向於喜歡組合,因為它使行為更加可重用,但是如果你看看Rails,每次你想要數據庫中的對象時,你都必須繼承ActiveRecord :: Base類。 如果你看一下DataMapper,它就是相反的,因為它們只需要你包含DataMapper :: Resource。

繼承與組合(通過模塊)是一個很大的主題,您必須問自己的問題將歸結為:如何實現我提供的組件與另一個用戶現有代碼庫之間更大的解耦?

Ruby僅支持單繼承。 因此,如果API客戶端必須繼承您的基類,則它們將無法繼承其他類。 使用模塊包含,您可以使代碼如下:

class Student < Person
  include Base
  has_many :books
end

因此,您可以“繼承”Person和Base。

但是,經典的繼承語法看起來更自然,更少“神奇”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM