BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

通过Rails插件遵守迪米特法则

| 作者 Sebastien Auvray 关注 0 他的粉丝 ,译者 孙向晖 关注 2 他的粉丝 发布于 2007年10月28日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

迪米特法则(Law of Demeter),或者最少知识原则(Principle of Least Knowledge),是软件开发中的一个设计准则。其基本观点是给定的一个对象,应该对除它之外的任何事物(包括它的子组件)的结构、属性和行为知道得越少越好。Dan Manges希望来阐述这个概念以及在Ruby中应用它的方式,特别是通过使用Forwardable模块。Luke Redpath在书写单元测试时使用mock和stub不小心违反了迪米特法则:

class WidgetsControllerCreateActionTest < Test::Unit::TestCase
def setup
# usual rails controller test setup here
@user = mock('user')
User.stubs(:find).returns(@user)
end

def test_should_create_new_widget_for_parent_user_using_posted_widget_params
widgets_proxy = mock('association proxy')
@user.stubs(:widgets).returns(widgets_proxy)
# Demeter's Law Violation here by using the widget_proxy through User object
widgets_proxy.expects(:create).with(:name => 'my funky widget')
post :create, :widget => {:name => 'my funky widget'}
end

解决方案是在你所有的模型中增加一个委托方法。但那会很快变得枯燥,这也是为什么Luke引入Demeter's Revenge(迪米特之复仇)插件的原因,这个插件会给你的has_manyhas_and_belongs_to_many关联建立一组遵循迪米特法则的方法。

# given a User that has_many Widgets you'll be able to use:
user.build_widget(params) # => user.widgets.build(params)
user.create_widget(params) # => user.widgets.create(params)
# ...

但是法则不是为了被违反才被制定的吗?事实上如果一个插件能够自动完成一个所谓的“法则”,难道不会让法则成为摆设吗?

查看英文原文:Respect Demeter's Law through Rails Plugin
译者简介:孙向晖,儿子小名“豆豆”,常被人称为“豆豆他爹”。1998年开始步入IT行业,现任浪潮软件质保中心副主任。专注于研究和实践MDA/UP/UML/SCM等相关技术在团队中的大规模应用,对产品化的软件项目管理、需求管理和配置管理略有心得。他的博客为http://blog.csdn.net/xiaosun/。参与InfoQ中文站内容建设,请邮件至china-editorial[at]infoq.com

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT