2016-02-16 49 views
2

我有一個外觀和功能同樣在這兩種情況下,無論是代碼:我應該使用什麼來共享功能,模塊或類?

class Bar 
    def baz 
    puts 3 
    end 
end 

class Foo < Bar 
end 

Foo.new.baz 
#=> 3 

或:

module Bar 
    def baz 
    puts 3 
    end 
end 

class Foo 
    include Bar 
end 

Foo.new.baz 
#=> 3 

我應該更喜歡設計由多個模型共享功能時使用?

+2

問問自己'Foo'真的*是一個'Baz'。如果是這樣,繼承可能沒問題。一般來說,你應該贊成[繼承繼承](https://en.wikipedia.org/wiki/Composition_over_inheritance)並選擇模塊方法。 – GolfWolf

+1

@ w0lf這是有道理的,我只是想明白這一點[在設計多個模型共享的功能時首選模塊。](https://github.com/thoughtbot/guides/tree/master/best-practices #ruby) –

+2

*在設計由多個模型共享的功能時,首選模塊類。*不代表模塊繼承。這意味着:如果您的模型具有複雜的邏輯,則最好將該邏輯單獨放入類中。男人的原因是,更容易孤立地測試一個類,然後測試包含在多個類中的相同模塊。 – spickermann

回答

1

如果你要使用BarFoo存在(或任何其他類),那麼你需要定義Bar作爲一個獨立的類,這意味着你需要通過Foo繼承Bar

如果您打算僅使用BarFoo(或任何其他類)添加功能或修改它們,則應將Bar定義爲模塊。另請注意,只有當您第一次創建Foo時,您才能繼承Bar,Foo,這意味着事後添加功能通常必須包含模塊而不是繼承類。

總之,如果Bar有主要存在,那麼讓Bar是一個類,並通過Foo繼承它。如果Foo主要存在,則定義模塊Bar,並將其包括到Foo中。

0

我經常使用模塊mixins來引入特殊的功能。可能是清理或過濾某些沒有繼承的模型的文本屬性中的禁止詞語。

如果你有真正的繼承,然後使用它。

相關問題