我目前正在学习委托
和德米特法则,但我似乎找不到一个使用委托
的好例子。
我希望能够找到与我的项目相关的示例,因为我必须做一个演讲。我发现唯一可能违反德米特法则的代码行是:
@game.promotions.find_by_promo_type("cross")
模型Game
has_many
Promotions
并且跨越另一个模型来执行基于promo_type
属性的find
调用。根据我的理解,这是违反德米特法则的,我应该通过使用委托
来修复它,如下所示:
class Game < ActiveRecord::Base
has_many :promotions
delegate :find_by_promo_type, :to => :promotion
end
除了“迪米特法则说这样做是有用的”之外,你能给我举个例子吗?
我唯一能想到的情况是,如果我想把“promotions”的名称更改为“promos”,那么解决方法是有用的,因为我只需要进行以下更改::find_by_promo_type
仍将适用于 Game
。
class Game < ActiveRecord::Base
has_many :promos
delegate :find_by_promo_type, :to => :promos
end
唯一的问题是,我认为这个论点是有缺陷的。如果我要更改模型的名称,我还必须重构许多其他地方的代码,即使它们没有违反Demeter法则。很难相信这就是Demeter法则在此示例中所能实现的全部。
有人可以帮助我理解吗?