我有一个模型,它将被调用大约 50 次,以使用 rake 任务创建 50 个文件。
大约 90% 的代码可以重用,但我需要重写一些方法。我正在考虑只是从原始表中继承,但这可能会导致大约 40-50 个模型,这感觉不对:
class Dog
def bark
"woof"
end
end
class Wolf << Dog
def bark
"growl"
end
end
在每个模型中,我可能需要覆盖大约 3-4 种方法。
我的另一个想法是使用这篇文章中的模块 + 扩展 + 超级装饰器: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 个模块并在创建时扩展适当的模块。
那么哪个是最好的选择,或者在这种情况下有更好的模式吗?
从你描述依赖关系的方式来看,这听起来像是策略模式的完美情况,而不是子类化或混合。
通过子类化或混合,您将指示特定可能会调用基本方法,并且它可能会扩展基本 API。此外,私有方法应始终被视为潜在的代码异味。如果具体是一个策略对象(例如,带有模块方法的模块),其基础具有实例并调用方法,那么它提供了您实际拥有的依赖项的最清晰的规范。
另请参阅:http://en.wikipedia.org/wiki/Composition_over_inheritance、http://c2.com/cgi/wiki?StrategyPattern