我目前正在学习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-16 09:57:12
比方说,你想要缓存或记录这个促销,只有当你通过游戏访问它的时候。你已经违反了德米特定律,你不可能轻易做到这一点。在添加代码之前,您必须找到对.promotions.find_by_promo_type的每一个引用,并标识应用于游戏的引用并将它们更改为.find_promotion_by_promo_type。
如果您已经在代码中委派了它,那么您只需用一个完整的方法来替换它(如果有必要的话,可以重命名它)。
也就是说,德米特定律确实应该被称为德米特的指导方针。记住这是一个很好的原则,但是,正如您所发现的,它可以为常见的更新添加维护,如果您做了99%肯定永远不会做的更改,则可以避免一个重大问题。
https://softwareengineering.stackexchange.com/questions/214557
复制相似问题