[英]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.