写点什么

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

评论

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

MapReduce中shuffle阶段的数据压缩机制

大数据技术指南

大数据 hadoop 3月日更

RUOYI 框架教程 0 | 我和RuoYi框架

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

【遇见Doris】寒冷冬日的一次温暖相聚 · Doris开发者沙龙

ApacheDoris

【遇见Doris】

[C++总结记录]构造函数与析构函数调用时机

图解AI

c++

RUOYI 框架教程 3 | 操作小技巧,快看看你掌握了多少!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

【遇见Doris】Apache Doris 在百度商业大规模微服务全链路监控的实践

ApacheDoris

【遇见Doris】

【Doris全面解析】存储层设计介绍2——写入流程、删除流程分析

ApacheDoris

[C++总结记录]构造函数初始化注意点

图解AI

c++

golang设置时区的多种方式

happlyfox

学习 3月日更 Go 语言

Doris简史 - 为分析而生的11年

ApacheDoris

打通混合云网络孤岛,EBN助力企业灵活构建云骨干网

UCloud技术

多云架构 混合云

【遇见Doris】Apache Doris在一点资讯自媒体平台的应用

ApacheDoris

【遇见Doris】

【遇见Doris】Apache Doris Parquet文件读取的设计与实现

ApacheDoris

【遇见Doris】

RUOYI框架教程1 |小白都能学会的3分钟搭建框架教程

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

RUOYI 框架教程 2 |小白都能学会的 3 分钟搭建框架教程

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

[C++总结记录]对象内存占用情况及this指针注意点

图解AI

c++

K8s 原生 Serverless 实践:ASK 与 Knative

Serverless Devs

阿里云 Serverless Kubernetes 云原生

【遇见Doris】4.13线下开发者沙龙分享--Doris主创团队

ApacheDoris

【遇见Doris】4.13线下开发者沙龙分享--搜狐团队

ApacheDoris

【遇见Doris】

[C++总结记录]函数相关细节注意点

图解AI

c++

【Doris全面解析】存储层设计介绍1——存储结构设计解析

ApacheDoris

Apache Doris(incubating) 0.12.0版本正式发布

ApacheDoris

[C++总结记录]struct与class注意点

图解AI

c++

【遇见Doris】Apache Doris在京东双十一大促中的实践

ApacheDoris

【遇见Doirs】

EGG Network构建千万级应用的聚合型永动金融公链 EFTalk

币圈那点事

遇见Doris:Apache Doris (incubating)0.10.0开发者沙龙

ApacheDoris

【遇见Doris】4.13线下开发者沙龙分享--微博团队

ApacheDoris

【遇见Doris】

【遇见Doris】Apache Doris 在京东广告平台的应用

ApacheDoris

【遇见Doris】

[C++总结记录]构造函数与析构函数注意点

图解AI

【遇见Doris】Spark Doris Sink的设计和实现

ApacheDoris

【遇见Doris】

【遇见Doris】 Apache Doris 基于 Bitmap的精确去重和用户行为分析

ApacheDoris

【遇见Doris】

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