写点什么

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

评论

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

奋发向前展华章 秋光熠熠映朝阳 ——华秋2023年度关键词“发展”

华秋电子

每个程序员都应该知道的 8 大算法

不在线第一只蜗牛

c++ Python 算法

如何快速搭建AI数字人系统源码?

伤感汤姆布利柏

软件测试开发/全日制丨Python 常用第三方库 yaml 学习笔记

测试人

Python 软件测试 yaml 测试开发

HTTP 和 HTTPS 的比较

Liam

程序员 前端 https 后端 HTTP

工作会议:更适合中国宝宝体制的party

伤感汤姆布利柏

Kafka Streams概述

FunTester

垂直领域大模型——文档图像大模型的思考与探索

陈橘又青

人工智能 文档识别 智能文字识别技术

软件测试开发/全日制丨测试方案设计 学习笔记

测试人

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

OP链、ARB链、TRX波场链丨BNB币安链质押挖矿系统开发丨源码搭建

l8l259l3365

腾讯云大数据ES:结合AI大模型与向量检索的新一代云端检索分析引擎

腾讯云大数据

ES

PDF优化压缩软件 Recompress中文激活版

胖墩儿不胖y

Mac软件推荐 PDF压缩软件 好用的PDF处理工具

Curve Code Camp·金秋篇顺利结营

OpenCurve

开源 网易 分布式文件存储 开源社区 开发者福利

如何处理预防XSS漏洞攻击问题

德迅云安全杨德俊

CDN xss攻击 网站安全

XSKY SDS 产品率先获得 OceanBase V4 新版本认证

XSKY星辰天合

PCB阻抗设计12问,轻松带你搞懂阻抗!

华秋电子

「2023中国ToB行业年度榜单」重磅启动!

ToB行业头条

企业数字化转型:1个核心、2种力量、3个关键点、4大转型、5大平台

天津汇柏科技有限公司

数字化转型

【第七在线】智能商品计划可以帮助鞋服企业做什么?

第七在线

澜起科技推出支持7200 MT/s速率的DDR5第四子代RCD芯片

财见

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