我目前正在学习delegate和德米特定律,我似乎找不到一个好的例子来说明在什么情况下使用delegate实际上是有用的。
我想找一个与我的项目相关的例子,因为我必须做一个演讲。我发现的唯一一行可能违反德米特定律的代码如下:
@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唯一的问题是,我认为这个论点是有缺陷的。如果我要更改一个模型的名称,我还必须在许多其他地方重构代码,这些地方甚至不会违反德米特定律。很难相信这就是得墨特定律在这个例子中所能做到的全部。
有没有人能帮我理解一下。
发布于 2013-10-17 12:41:52
使用delegate的好处是可以抽象出如何完成某件事的实现。在您的示例中,这并不是关于允许您将promotions的名称更改为promos。它是关于非常有目的地向“外部世界”或对象的API公开的内容。与Game通信的对象不需要知道您正在使用另一个ActiveRecord模型来检索相关的Promotions。它可能会增加不必要的耦合。
对于您的情况,您可能希望从调用者的角度更多地考虑这一点,以及它应该向Game发送什么消息。也许它应该只是调用Game.cross_promotions,而不是进入Game来调用另一个对象上的方法,无论它是否被委托。
https://stackoverflow.com/questions/19417174
复制相似问题