50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

评论

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

“专业敏捷教练课程” 7月6-7日 · CSP-SM认证上海线下面授周末班【晋升高阶享多重福利】

ShineScrum

敏捷教练 专业敏捷教练 敏捷教练认证

深度剖析集团型企业在新质生产力和数字化转型过程中面临的身份管理问题(二)

芯盾时代

iam 统一管理 统一身份 统一身份管理平台

Altair RapidMiner,将数据科学、深度学习等多种功能同时集成的一站式数据分析平台

Altair RapidMiner

机器学习 大模型 #人工智能 #数据分析

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

阿里巴巴云原生

阿里云 RocketMQ 云原生

前端生成海报图技术选型与问题解决

vivo互联网技术

html2canvas 海报图生成 painter

Linux设备驱动系列(14) —— 使用全局工作队列

Linux内核拾遗

Linux内核 中断 工作队列

读书笔记《一如既往》

酱紫的小白兔

PingCAP 与沙利文联合发布《中国企业全球化运营白皮书》

先锋IT

业务转型,你的团队该如何应对?

凌晞

团队管理 数字化业务转型IT路线图

What’s new in Apache/dubbo-getty 1.5.0

apache/dubbo-go

dubbo

从仿真到生成式仿真,大模型助力工业智能化发展

Altair RapidMiner

#人工智能 仿真技术 制造业数字化 #大模型

小游戏应该如何创建一个元服务项目

FN0

鸿蒙卡片 元服务

天润融通,荣获2024中国AI应用层创新企业

天润融通

人工智能 天润融通

GitHub爆火标星127k!这份字节Python背记手册到底有什么魔力?

没脾气

Python 程序员 自学编程 python教程 python自学

惊了!字节大佬总结的这份《零基础学python神级笔记全彩版》真的太强了

没脾气

Python 程序员 自学编程 架构师 自学python

神仙级python入门教程(非常详细),从零基础入门到精通,建议收藏

没脾气

Python

Pika 主从数据同步状态指标 “repl_connect_status” 简介

apache/dubbo-go

redis Pika

【YashanDB知识库】outline固化执行计划

YashanDB

yashandb 崖山数据库

广东人仁康一项技术通过国家科技成果评价达到国际先进水平平

极客天地

案例研究|为什么 CDG 会选择从 DataDog 迁移至观测云?

观测云

可观测性

跨越云端,华为云技术专家分享高效跨云迁移实践

华为云开发者联盟

云原生 华为云 数据迁移 华为云开发者联盟 企业号2024年6月PK榜

Coremail私有云邮箱:筑牢企业数据安全防线

科技热闻

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