2025 AI基础设施风向标,不看必后悔!#AI基础设施峰会 了解详情
写点什么

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

评论

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

为什么@Value可以获取配置中心的值?年薪超过80万!

JVM调优资料

Java 程序员 后端

【共识专栏】共识的分类(下)

趣链科技

区块链 共识机制 共识算法 共识分类

五分钟搞懂MySQL主从复制原理,附带学习经验

JVM调优资料

Java 程序员 后端

字节三面+微信四面+PayPal四面,大厂面经分享

Java 程序员 架构 面试 计算机

synchronized 加锁 this 和 class 的区别!

王磊

Java 并发 8月日更

SpringBoot使用Junit5

Rubble

springboot JUnit 8月日更

DBA:这有一份对接NBU备份故障排除指南,请查收!

华为云开发者联盟

故障 DWS 备份 NBU NetBackup

Nginx 内存池似懂非懂?一文带你看清高性能服务器内存池

Linux服务器开发

nginx Linux服务器开发 Linux后台开发 高性能服务器 内存池

为什么spring能最好地改变Java?成功跳槽阿里!

JVM调优资料

Java 程序员 后端

为什么大公司一定要使用微服务?神操作!

JVM调优资料

Java 程序员 后端

MySQL不能没有字符串函数,就像西方不能失去耶路撒冷

北游学Java

Java MySQL 数据库

Java线程安全-JVM角度解析

程序员阿杜

Java JVM 多线程 并发 8月日更

【Vue2.x 源码学习】第二十三篇 - 依赖收集 - 视图更新部分

Brave

源码 vue2 8月日更

Apache ShardingSphere 元数据加载剖析

SphereEx

数据库 开源

图片风格迁移:基于实例缓解细节丢失、人脸风格化失败问题

华为云开发者联盟

神经网络 风格 实例 风格迁移 图像翻译

开发者进阶宝典,HarmonyOS 职业认证全奉上

科技汇

书单 | 7月畅销新书情报,看谁是最大黑马

博文视点Broadview

Hudi自带工具DeltaStreamer的实时入湖最佳实践

华为云开发者联盟

大数据 Hudi

是谁,在暗中观察

skow

Java 后端 Java设计模式 8月日更

三面拼多多,一篇文章帮你解答

JVM调优资料

Java 程序员 后端

肝到头秃!阿里爆款的顶配版Spring Security笔记

Java spring 程序员 架构 计算机

中高级Java面试中你不得不会的知识点,附详细答案

JVM调优资料

Java 程序员 后端

五面阿里拿下飞猪事业部offer,帮你突破瓶颈

JVM调优资料

Java 程序员 后端

京东面试真题解析,帮你解决95%以上的问题!

JVM调优资料

Java 程序员 后端

CIS Kubernetes 基线测试

greatersecurity

中高级Java大厂高频面试题,已开源下载

JVM调优资料

Java 程序员 后端

中国首位 K8s ingress-nginx reviewer 同时提名成为 Apache APISIX committer

API7.ai 技术团队

开源 Kubernetes 采访 APISIX

五年Java开发者小米、阿里面经,附相关架构及资料

JVM调优资料

Java 程序员 后端

多数元素

Memorys

Java 面试 算法

学会这十招,轻松搜索github优质项目

Java架构师迁哥

模块九毕设

c

架构实战营

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