写点什么

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

评论

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

MobPush推送查询API

MobTech袤博科技

Birdwatcher 进阶使用指南

Zilliz

Milvus 向量数据库 birdwatcher

8个可以免费下载3D模型的网站,快收藏起来吧~

Finovy Cloud

3D软件 3ds Max

template竟能使一套C++代码支持多个客户?

老王同学

c++ template

如何在 Web 实现支持虚拟背景的视频会议

声网

Web 视频会议 RTE 虚拟背景

软件测试/测试开发丨实战演练基于加密接口测试测试用例设计

测试人

软件测试 自动化测试 测试开发

Fabarta 正式加入大数据技术标准推进委员会,共同推动大数据技术标准化进程

Fabarta

人工智能 图数据库 分布式图数据库 图智能

月内狂飙 50%的 ZBC ,连续登顶Solana 链交易量排行榜

股市老人

加密了100个小姐姐的PDF文档,1行代码搞定,网友:快男!

程序员晚枫

Python 加密 PDF 自动化办公

MIAOYUN与OpenCloudOS、TencentOS Server 3完成产品兼容互认证

MIAOYUN

容器云 云平台 产品兼容性互认 互认证 兼容性互认证

基于二代征信报告的信用评估模型实践

中关村科金

金融 征信 风控 对话式AI

性能测试入门实践路线图

老张

性能测试 稳定性保障

华为云开源OpenTiny项目中TinyVue组件库和TinyNG组件库的区别是什么?

英勇无比的消炎药

前端 开源、 OpenTiny UI组件库

传输体积下降 85%,融云 HTTP 压缩算法解析

融云 RongCloud

算法 音视频 传输 融云 通讯

博睿学院 | 本周四:ETL技术在数据标准化中的应用实践

博睿数据

ETL 智能运维 博睿数据 博睿学院

字节跳动CVPR 2023论文精选来啦(内含一批图像生成新研究)

字节跳动技术范儿

字节跳动 算法 计算机视觉 CVPR AIGC

如果用ChatGpt给OpenTiny官网设计页面会怎样?

英勇无比的消炎药

开源 前端 OpenTiny UI组件库

OpenTiny的设计理念是什么?

英勇无比的消炎药

开源 OpenTiny UI组件库

华为开源项目OpenTiny的TinyVue组件库适用于哪些地方?

英勇无比的消炎药

前端 开源、 OpenTiny UI组件库

大模型打开了一层技术天花板,催生新场景变革老场景

中关村科金

人工智能 企业服务 大模型 对话式AI

MobTech 秒验|本机号码一键登录会泄露隐私吗

MobTech袤博科技

低代码有哪些缺点?4千字深入解析

优秀

低代码 低代码缺点

CodeGeeX 130亿参数大模型的调优笔记:比FasterTransformer更快的解决方案

Openlab_cosmoplat

Python 开源社区

揭秘 Milvus 助力平台建设的终极奥义

Zilliz

Meetup Milvus 向量数据库

浙江宁波|2023年度宁波市甬江引才工程

科兴未来News

浙江宁波|2023年上半年宁波市镇海区高层次人才项目政策申报

科兴未来News

跨越AI大门,一本翻译蓝皮书、一场人机共译比赛投射出怎样的未来?

脑极体

百度 AI 翻译

flutter系列之:在flutter中使用相机拍摄照片

程序那些事

flutter 架构 大前端 程序那些事

论模式与反模式

凌晞

构架

在Goroutines中如何处理Error

Jack

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