NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

评论

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

在线HTML转MarkDown工具

入门小站

工具

整合重复的初始化逻辑

喵叔

7月日更

风险投资

stars

架构实战营 毕业总结

竹林七贤

Vue进阶(三十):element-ui 表单验证

No Silver Bullet

Vue 7月日更 表单校验

架构训练营 模块三

小卷儿

完善数字人民币发行应用机制 打造可靠金融基础设施

CECBC

从简历被拒到收割 9 个大厂 offer,我用了 3 个月成功破茧成蝶

Java 编程 程序员 架构 计算机

架构实战营 - 模块 3 - 外包学生管理系统架构文档

雪中亮

架构实战营 #架构实战营

深入了解Spring之Environment

邱学喆

Profile Environment PropertySource PropertySources

偶获阿里大佬纯手码“887”页 Java 面试手册,突击学习一个月,成功跳槽阿里!

Java 编程 架构 面试 IT

全网首发 20+ 互联网公司“Java 面试考点大全”,应有尽有

Java 编程 面试 IT 计算机

模块三作业

俊杰

基于深度学习的实时噪声抑制——深度学习落地移动端的范例

声网

人工智能 算法 移动端

仅仅上线一小时,下载量就破10W!阿里内部Java性能优化实战手册

Java 编程 程序员 面试 IT

Vue进阶(三):Axios 应用详解

No Silver Bullet

Vue axios 7月日更

CRUD 程序员勿进!JDK源码剖析手册与并发编程图册,完美诠释高并发

Java 编程 程序员 IT 计算机

Linux之ps命令

入门小站

Linux

Vue进阶(九十七):对象动态添加属性和值

No Silver Bullet

Vue 7月日更 $set 动态赋值

极致性能一睹为快!阿里全新出品性能优化手册 从此拒绝系统瘫痪!

Java 编程 程序员 架构师 计算机

某宝付费的Redis核心原理深度实践PDF,竟在GitHub标星86k+霸榜

白亦杨

Java 编程 程序员 架构师 计算机

设计消息队列存储消息数据的MySQL表格

chenmin

使用MLlib进行机器学习(十-下)

数据与智能

spark 决策树 优化

趣说开源|开源路线图入门攻略

SphereEx

模块三

江南巴飞特

今天,2021可信云大会即将开幕!

浪潮云

云计算 云原生 可信云

阿里 P8 熬了一个月肝出这份 32W 字 Java 面试手册,在 Github 标星 31K+

Java 编程 架构 面试 IT

模块二

Winston

GitHub 如何创建 Access Token

HoneyMoose

墙裂推荐!四面阿里拿 offer 后,才发现师哥给的面试笔记有多强大

Java 架构 IT 计算机 知识

绝!阿里巴巴Java面试参考权威指南五月版最新开源

Java 阿里巴巴 架构 面试 IT

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