2012-05-31 56 views
1

我有一個模型將被調用約50次,以創建50個帶有rake任務的文件。Rails設計模式:大量子模型來覆蓋特定功能

代碼的約90%,可重複使用,但我需要重寫一些方法。我在想從原始表只是繼承,但是這可能會導致約40-50模型和感覺不對:

class Dog 
    def bark 
    "woof" 
    end 
end 

class Wolf << Dog 
    def bark 
    "growl" 
    end 
end 

有大概在3-4個方法我將需要在每個覆蓋模型。

其他想法,我必須是使用該模塊+從這篇文章EXTEND + SUPER DECORATOR:http://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in

class Dog 
    def bark 
    "woof" 
    end 
end 

module Wolf 
    def bark 
    "growl" 
    end 
end 

dog = Dog.new 
dog.extend(Wolf) 
dog.bark #growl 

然後有50個模塊,並在創建時擴展正確的一個。

那麼這將是最好的選擇,或者是有這種情況的一個更好的模式?

+0

什麼是你的問題? – Mischa

+0

最後添加了問題。 – cbron

+0

如果您需要幾個不同的方法實現集,那麼將其表示爲從一個公共基類繼承的幾個類並不一定是一個不好的方法。 但是,不瞭解更多關於您的具體情況的信息,很難推薦任何特定模式。通用模型需要從特定的和反之的經文中知道什麼?模型公開揭示具體方法嗎?是否需要公開任何模型的泛型方法? –

回答

1

從你描述的依賴關係的方式,其實這聽起來像是策略模式,而不是繼承或混合完美的境地。

通過繼承或混合,您將得到指示特定可能調用的方法的基礎,並且它可能會擴展基礎API。此外,私人方法應始終被視爲潛在的代碼味道。如果具體是一個策略對象(例如一個帶有模塊方法的模塊),該對象具有一個實例並調用方法,那麼它將提供您實際擁有的依賴關係的最清晰的規範。

參見:http://en.wikipedia.org/wiki/Composition_over_inheritancehttp://c2.com/cgi/wiki?StrategyPattern

+0

以前沒見過這種戰略模式。無論是那個還是那個mixin都應該適合我的情況。 – cbron

+0

我可以從經驗告訴你,在不需要絕對需要的情況下使用mixins或子類可能會花費大量時間進行維護。例如,如果其他人想要刪除或重命名基礎上的某個方法,則無法首先識別和審覈所有子類或混合類,以確保它們都不依賴於該方法,否則無法安全地執行此操作。這意味着無論是浪費時間,還是由於缺乏足夠的時間,跳過了一個有價值的代碼更改。使用構圖模式可以避免這個問題。原則:「比繼承更喜歡組合。」 –