2013-04-02 45 views
8

之前已經提出過類似這樣的問題,但是我特別提出了使用組合作爲使用模塊mixin的替代方法。什麼時候使用ruby模塊vs使用類組合?

class Helper 
    def do_somthing 
    end 
end 

如果我需要'使用'一個類但不繼承它,我會簡單地撰寫它並使用它。

class MyStuff 
    def initialize 
    helper = Helper.new 
    helper.do_something 
    end 
end 

我爲什麼想創建一個模塊是:

module Helper 
    def do_something 
    end 
end 

class MyStuff 
    include Helper 
end 

我看到的唯一的區別是不會有很多Helper對象躺在身邊,如果我使用的模塊。但是我沒有看到有更多物體躺在較小的物體上。

此外,我不知道我是否需要在未來繼承它。那麼,如何決定我的庫的用戶是否想要使用模塊mixin,或者想要使用組合?

+1

'require'不是你在這裏需要的。你需要'include'。 – Linuxios

+0

thnx。修正 – codeObserver

+0

當然。樂意效勞。 – Linuxios

回答

14

HelperMyStuff類之間的關係是所有權之一時,請使用組成。這被稱爲「has-a」的關係。例如,假設您有Person類和Car類。你會使用成分,因爲一個人有一輛車:

class Person 
    def initialize 
    @car = Car.new 
    end 
end 

class Car 
    def accelerate 
    # implementation 
    end 
end 

Helper「行爲像」MyStuff,使用模塊混入。在這種情況下,的角色MyStuff。這與「is-a」關係有點不同,這意味着您應該使用傳統繼承。例如,假設我們有一個Person類和一個Sleeper模塊。一個人有時會擔任睡眠者的角色,但其他對象也如此 - 例如Dog,Frog或甚至Computer。其他類別中的每一個都代表可以入睡的東西。

module Sleeper 
    def go_to_sleep 
    # implementation 
    end 
end 

class Person 
    include Sleeper 
end 

class Computer 
    include Sleeper 
end 

桑迪梅斯的實用Object-Oriented Design in Ruby是這些主題的優秀資源。

0

模塊mixin更像是多重繼承,所以請遵循通常的繼承vs組合規則 - is-a或has-a。順便說一句,它是include Helper,而不是require 'Helper'

0

有幾件事我可以分享:

  • 如果您需要共享在不同的類和模塊共同行爲,你應該讓成模塊,這樣以後你可以include模塊哪裏你喜歡。它也將幫助測試,因爲它已經幹了。

  • 在責任的情況下,您可以將它變成新的模塊,以使其明確理解並提高代碼庫的可讀性。這將有助於減少應易於遵循和維護的主要類的大小。

有一件事你可能會注意到include增加功能,以您的instance哪裏extend確實給Class本身。

1

這是「Duck Typing」的問題。如果你想讓你的課程像Helper一樣行事,你可以做include。無論您是要encapsulateHelper的行爲,正確的選擇是require

混合Enumerable在,你給你的類通過實施唯一的each方法的巨大負荷的方法。包裝Array您可以隱藏其他人的迭代並僅將其用於保存數據。反之亦然。

+0

你能解釋一下嗎? *'通過實現唯一的每個方法'* –

+1

您的課程是實現**只有一個**('each')方法並混合使用'Enumerable'以產生......嗯......迭代的所有樂趣。 – mudasobwa

+0

我的不好!沒有得到你 –

相關問題