首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails: Demeter委托和法律的有用示例

Rails: Demeter委托和法律的有用示例
EN

Software Engineering用户
提问于 2013-10-16 04:56:39
回答 1查看 958关注 0票数 2

我目前正在学习delegate和德米特定律。我理解德米特定律,但我似乎找不到一个很好的例子,说明使用delegate来避免违法实际上是有用的。

我想找一个与我的项目相关的例子,因为我必须做一个演示。我发现有可能违反德米特定律的唯一一行代码是:

@game.promotions.find_by_promo_type("cross")

模型Game has_many Promotions,它正在跨另一个模型执行基于促销属性promo_typefind调用。根据我的理解,这违反了德米特定律,我应该实现以下解决方案。

代码语言:javascript
复制
class Game < ActiveRecord::Base
   has_many :promotions

   delegate :find_by_promo_type, :to => :promotion
end

你能给我举个例子吗?除了“德米特定律这么说”之外,这实际上是有用的。

我唯一能想到的是,出于某种原因,我想将promotions的名称更改为promos,那么解决方案将是有用的,因为我只需要做以下更改,而:find_by_promo_type仍然适用于Game

代码语言:javascript
复制
class Game < ActiveRecord::Base
   has_many :promos

   delegate :find_by_promo_type, :to => :promos
end

唯一的问题是,我相信这个论点是有缺陷的。如果我要更改一个模型的名称,我也将不得不重构代码在许多其他地方,甚至不违反德米特定律。很难相信,这是德米特定律在这个例子中所能完成的。

谁能帮我理解一下。

EN

回答 1

Software Engineering用户

发布于 2013-10-16 09:57:12

比方说,你想要缓存或记录这个促销,只有当你通过游戏访问它的时候。你已经违反了德米特定律,你不可能轻易做到这一点。在添加代码之前,您必须找到对.promotions.find_by_promo_type的每一个引用,并标识应用于游戏的引用并将它们更改为.find_promotion_by_promo_type

如果您已经在代码中委派了它,那么您只需用一个完整的方法来替换它(如果有必要的话,可以重命名它)。

也就是说,德米特定律确实应该被称为德米特的指导方针。记住这是一个很好的原则,但是,正如您所发现的,它可以为常见的更新添加维护,如果您做了99%肯定永远不会做的更改,则可以避免一个重大问题。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/214557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档