我有一个模型,它将被调用大约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个模块,并在创建时扩展适当的模块。
那么,哪一个是最好的选择,或者对于这种情况有更好的模式吗?
发布于 2012-06-01 09:37:32
从您描述依赖关系的方式来看,这实际上听起来像是策略模式的完美情况,而不是子类化或混合。
通过子类化或混合,您将指示特定对象可能调用基类的方法,并且它可能扩展基类API。此外,私有方法应该始终被视为潜在的代码气味。如果特定对象是一个策略对象(例如,具有模块方法的模块),基类拥有一个实例并调用其方法,那么这将为您实际拥有的依赖关系提供最清晰的规范。
另请参阅:http://en.wikipedia.org/wiki/Composition_over_inheritance,http://c2.com/cgi/wiki?StrategyPattern
https://stackoverflow.com/questions/10827323
复制相似问题