写点什么

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

评论

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

区块链系列教程之:比特币的问题

程序那些事

比特币 区块链 智能合约 以太坊

Git 的远端操作及解析(含思维导图)

多选参数

git GitHub gitlab

碎片化学习行不行

封不羁

JVM中的双亲委派机制你还没懂吗?

阿文

Java JVMTI JVM 深入理解JVM JVM原理

依赖倒置原则

John

极客大学架构师训练营

小白也有大厂梦,如何从零开始掌握高薪Java工程师必备技能?

无予且行

Java 架构 面试 后端 大厂

公司一直用Mybatis的原因原来在这!不得不竖起我的大拇指

小闫

Java mybatis mybatis-config.xml mybatis缓存

Java线程池最细的解释,看完后彻底征服面试官

小新

Java 架构 面试 线程 线程池

视读——沟通的艺术,看入人里,看出人外(开篇)

废材姑娘

读书笔记 视觉笔记

[1.3万字] 玩转前端二进制

阿宝哥

Java 大前端 base64 Blob

面试官:为什么需要happens-before规则和什么是指令重排序

无予且行

Java 编程 程序员 面试 happens-before

如果张东升是个程序员

程序员生活志

程序员 张东升

Hexo blog 创建指导手册

想飞的鱼

GitHub Hexo GitHub Pages Blog

架构师训练营学习总结

John

极客大学架构师训练营

架构训练营第五周 - 作业

无心水

极客大学架构师训练营

重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

小傅哥

Java 设计模式 小傅哥 重构 代码优化

刚去面试现场聊了一个多小时的Redis ,悄悄分享给大家!

Java小咖秀

nosql redis 面试

针对GPU单指令多数据流的编译优化算法

GPU

gpu 编译器 程序语言 if-conversion

三十张图助你看清红黑树的前世今生

淡蓝色

Java 程序员 数据结构 算法

现在面试这么难,背下题就能过的时代一去不复返了

小谈

Java 面试 JVM springboot SpringCloud

一致性哈希 -- java 实现

lei Shi

工业4.0|振动分析能做到预防性维护吗?

清水河路人甲

它们为什么这么快:从多进程到多线程再到I/O复用

Ya

多线程 进程 并发

道路千万条,安全只三条

石君

安全评估 安全设计

Raft探索历程--Part2

老胡爱分享

分布式系统 raft

有了多线程,为什么还要有协程?

八两

线程 进程 协程 GMP 进程线程区别

Java程序员的必修课之Spring理解透彻了吗?不会还咋去面试?

犬来八荒

Java spring 面试 后端 框架

GeekPwn 2020少年黑客马拉松大赛即将开启 谁将CARRY全场?

Geek_116789

架构训练营第五周 - 总结

无心水

极客大学架构师训练营

【Python】 any() 和 or 区别你真的知道吗?

Leetao

Python 数据结构 Python基础知识

从Servlet到Spring Boot

废材姑娘

Java Spring Boot

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