写点什么

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

  • 2007-10-27
  • 本文字数:974 字

    阅读完需:约 3 分钟

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

class WidgetsControllerCreateActionTest < Test::Unit::TestCase<br></br> def setup<br></br> # usual rails controller test setup here<br></br> @user = mock('user')<br></br> User.stubs(:find).returns(@user)<br></br> end<p> def test_should_create_new_widget_for_parent_user_using_posted_widget_params</p><br></br> widgets_proxy = mock('association proxy')<br></br> @user.stubs(:widgets).returns(widgets_proxy)<br></br> # Demeter's Law Violation here by using the widget_proxy through User object<br></br> widgets_proxy.expects(:create).with(:name => 'my funky widget')<br></br> post :create, :widget => {:name => 'my funky widget'}<br></br> end解决方案是在你所有的模型中增加一个委托方法。但那会很快变得枯燥,这也是为什么 Luke 引入 Demeter’s Revenge(迪米特之复仇)插件的原因,这个插件会给你的has_manyhas_and_belongs_to_many关联建立一组遵循迪米特法则的方法。

# given a User that has_many Widgets you'll be able to use:<br></br>user.build_widget(params) # => user.widgets.build(params)<br></br>user.create_widget(params) # => user.widgets.create(params)<br></br># ...但是法则不是为了被违反才被制定的吗?事实上如果一个插件能够自动完成一个所谓的“法则”,难道不会让法则成为摆设吗?

查看英文原文: Respect Demeter’s Law through Rails Plugin - - - - - -

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

2007-10-27 01:271138

评论

发布
暂无评论
发现更多内容

Tugraph Analytics图计算快速上手之紧密中心度算法

TuGraphAnalytics

cc 图计算 紧密中心度

2023年8款最佳云数据库综合比较

Geek_cbbf33

《可观测性成熟度模型白皮书》正式发布,龙蜥致力打造更好用户体验

OpenAnolis小助手

开源 云原生 可观测性 白皮书 龙蜥社区

HarmonyOS 管理页面跳转及浏览记录导航

HarmonyOS开发者

HarmonyOS

2023数字化转型发展大会暨首届数字原生大会在京召开

信通院IOMM数字化转型团队

数字化转型 IOMM 数字化转型峰会

OpenHarmony Meetup常州站招募令

OpenHarmony开发者

OpenHarmony

Python程序设计实例 | 学生管理数据库系统的开发

TiAmo

Python sqlite 数据库

云原生DevOps思考

薛猫

DevOps 云原生 kubernetes 运维

Mysql中的InnoDB和MyISAM

程序员万金游

Java MySQL 程序员 后端

国产自主研发,完全可控 IDE!

桑小榆呀

推进史

CodeArts Check代码检查服务用户声音反馈集锦(3)

云计算 代码质量 华为云 代码检查

面对IT部门和业务部门跨网文件交换的不同需求,怎样才能兼顾呢?

镭速

跨网文件交换

公司需要同步大量数据,如何缓解传输压力提高同步效率?

镭速

数据同步 数据同步工具 数据实时同步

OpenHarmony AI框架开发指导

OpenHarmony开发者

OpenHarmony

程序编译运行时,提示找不到某些组件

矩视智能

机器视觉

钟燕清 | AI+开源时代,金融行业的机遇与挑战

开源雨林

穿越人海遇见你:精细化运营神器Mobpush是如何实现智能化精准投放的

MobTech袤博科技

人工智能 大数据 智能投放 智能推送

优化Java代码效率和算法设计,提升性能

互联网工科生

Java 并发编程 性能测试 数据结构和算法

实时云渲染,元宇宙核心支持技术之一

3DCAT实时渲染

元宇宙 实时云渲染

PAI BladeLLM推理引擎: 超长上下文、更高性能

阿里云大数据AI技术

阿里云

JavaScript 循环:拥有最佳性能的最佳实践

树上有只程序猿

JavaScript break continue

通过Rails插件遵守迪米特法则_Ruby_Sebastien Auvray_InfoQ精选文章