产品战略专家梁宁确认出席AICon北京站,分享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:27886

评论

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

校招前端二面经典面试题(附答案)

hellocoder2029

JavaScript 前端

js对象和原型、原型链的关系

hellocoder2029

JavaScript 前端

IDM下载器软件2024中文版

茶色酒

idm下载

架构实战营模块二作业

null

考研失败,加入国企当程序员,真香!

程序员晚枫

程序员 找工作 考研 国企

js异步编程的三种模式

hellocoder2029

JavaScript 前端

vue实战-深入响应式数据原理

yyds2026

Vue 前端

得物供应链复杂业务实时数仓建设之路

得物技术

数据库 大数据 技术架构

极客时间运维进阶训练营第八周作业

忙着长大#

有哪些前端面试题是面试官必考的

coder2028

JavaScript 前端

我用ChatGPT写互联网职场黑话!

FN0

openai ChatGPT

在MWC 2023,华为创新解决方案点亮F5.5G时代的每一处光

脑极体

MWC

FL Studio推出全新21中文版水果工具

茶色酒

FL Studio 21

vue实战-完全掌握Vue自定义指令

yyds2026

Vue 前端

融云「百幄」系列产品,两组套件、三类价值赋能政企八大业务场景

融云 RongCloud

产品 办公 百幄

webpack配置完全指南

Geek_02d948

JavaScript 前端

前端监控稳定性数据分析实践 | 得物技术

得物技术

前端 前端监控 客服业务

美团前端常考面试题(必备)

Geek_02d948

JavaScript 前端

三天吃透Redis面试八股文

程序员大彬

redis java

基于 docker-compose 部署 SkyWalking包含halo和jenkins案例

忙着长大#

Skywalking

一文读懂NodeJs知识体系和原理浅析

coder2028

阿里前端二面常见面试题汇总

coder2028

JavaScript 前端

微信 + ChatGPT = 自己的智能助手 | 社区征文

IT蜗壳-Tango

ChatGPT

2023前端vue面试题(边面边更)

yyds2026

Vue 前端

webpack高级配置

Geek_02d948

JavaScript 前端

社招中级前端笔试面试题总结

Geek_02d948

JavaScript 前端

nodejs实现jwt

coder2028

JavaScript 前端

美团前端经典vue面试题总结

yyds2026

Vue 前端

从0到1,亿级消息推送的稳定性保障 | 得物技术

得物技术

稳定性 消息推送

文心一言的蝴蝶振翅,云计算的飓风狂飙

脑极体

云计算

ChatGPT到底有多贵?| 社区征文

AIWeker

人工智能 openai GPT ChatGPT

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