1

我有一个模型,它会被调用大约 50 次来创建 50 个带有 rake 任务的文件。

大约 90% 的代码可以重用,但我需要重写一些方法。我正在考虑只是从原始表继承,但这可能会导致大约 40-50 个模型,这感觉不对:

class Dog 
  def bark
     "woof"
  end
end

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

我可能需要在每个模型中覆盖大约 3-4 种方法。

我的另一个想法是使用这篇文章中的 MODULE + EXTEND + SUPER DECORATOR:http ://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in Ie

class Dog
  def bark
   "woof"
  end
end

module Wolf
  def bark
   "growl"
  end
end

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

然后拥有 50 个模块并在创建时扩展适当的模块。

那么哪个是最好的选择,或者这种情况有更好的模式吗?

4

1 回答 1

1

从您描述依赖关系的方式来看,这实际上听起来像是策略模式的完美情况,而不是子类化或混合。

通过子类化或混入,您将表明特定可能调用基础的方法,并且它可能扩展基础 API。此外,私有方法应始终被视为潜在的代码异味。如果具体是一个策略对象(例如,具有模块方法的模块),基础有一个实例并调用其方法,那么它提供了您实际拥有的依赖关系的最清晰的规范。

另见:http : //en.wikipedia.org/wiki/Composition_over_inheritance,http://c2.com/cgi/wiki? StrategyPattern

于 2012-06-01T01:37:31.517 回答