50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

通过 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:271281

评论

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

FinClip 与 uniapp:轻应用平台与前端开发框架

王字 Wannz

小程序 uniapp 移动开发 finclip

圆桌会议:如何避免踩到移动研发中,效能提升那些坑

王字 Wannz

移动开发 迭代

延迟任务场景,该如何提高吞吐量和时效性

华为云开发者联盟

redis 延迟任务 低延迟 Redis 消费队列

FinClip 的 2021 与 2022

王字 Wannz

finclip 小程序容器 小程序开发 小程序管理平台

在线YAML转Properties工具

入门小站

工具

阿里云EMAS 1月产品动态

移动研发平台EMAS

阿里云 程序人生 移动开发 #EMAS

FinClip 与 mPaaS:轻应用平台与移动应用开发平台

王字 Wannz

小程序 移动开发 mPaaS finclip 小程序容器

架构实战营:模块七作业

Geek_93ffb0

「架构实战营」

Java如何实现消费数据隔离?

CRMEB

有奖调查| 2022 Apache Pulsar 怎么过,你们说了算

Apache Pulsar

开源 云原生 中间件 Apache Pulsar Apache Pulsar 社区

OCR技术用于在线身份认证的运营效果分析

OCR

大模型应用新范式:统一特征表示优化(UFO)

百度开发者中心

恒源云(GPUSHARE)_替代MLM的预训练任务,真的超简单吗?

恒源云

人工智能 自然语言处理 深度学习

利用鸿蒙JavaUI 框架的 WebView 加载本地冰墩墩网页

宇宙之一粟

鸿蒙开发 2月月更

IT人的笔记本——全面了解 Jupyter

dongge

jupyterlab

Linux之at命令

入门小站

Linux

新版上线|能力中心打造全新视角

钉钉开发者

钉钉能力中心 钉钉开放平台能力中心 钉钉开放平台 能力中心

“热搜”中的分布式数据库

OceanBase 数据库

oceanbase 客户案例 四川农信

开源商业模式促进金融业科技生态的发展

王字 Wannz

小程序 开源 IT 金融

2022年低代码的变化与趋势

BeeWorks

【网络安全】一款针对Flutter的逆向工程分析工具

H

网络安全 逆向分析

远程办公团队如何沟通?

王字 Wannz

远程办公 wrh 居家办公 线下办公 soho

分布式进阶(二十三):Nginx 服务器应用详解

No Silver Bullet

nginx https 正向代理与反向代理 SSL证书 2月月更

小程序框架与平台编译对比

王字 Wannz

小程序 百度智能小程序 头条小程序 finclip 小程序框架

2021盘点 | 云主机年度榜单出炉,Top5花落谁家?

博睿数据

我与音视频的故事 | 社区征文

Changing Lin

音视频

各项结果排名第一!百度内容技术架构团队在国际向量检索大赛BigANN中斩获佳绩

百度Geek说

百度 内容 前端 后端

手把手教你使用HarmonyOS本地模拟器

HarmonyOS开发者

HarmonyOS DevEco Studio

低代码OR零代码,企业如何选择自身所需的软件开发平台?

BeeWorks

【连接平台」企业告警信息通过机器人同步至钉钉群

钉钉开发者

连接器 钉钉应用开发 钉群

MySQL 是如何实现RC事务隔离级别的

华为云开发者联盟

MySQL ReadView 事务隔离 RC事务隔离 Read Committed

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