在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

评论

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

B 端 SaaS 产品自动化事件设计 - 规则表达式

龙国富

自动化 SaaS 正则 B端 规则表达式

架构训练营模块 2 作业

小马

「架构实战营」

微信朋友圈高性能复杂度

鱼恨水

PiFlow 发布企业级分布式关系型数据库 OceanBase 组件

OceanBase 数据库

oceanbase OceanBase 开源

微信朋友圈的高性能复杂度分析

Geek_bc9c8d

模块二作业:微信朋友圈高性能复杂度分析

杨波

「架构实战营」

Test

haibin369

Linux驱动开发-编写PCF8591(ADC)芯片驱动

DS小龙哥

4月月更

分布式session之RedisSession的探索

Rubble

redis 4月日更 4月月更

架构实战营-模块二作业

,lazy

#架构实战营 「架构实战营」

一文了解垃圾回收算法中的引用计数算法

宇宙之一粟

垃圾回收算法 引用计数 4月月更

阿里二面:携程配置中心Apollo服务端是如何感知配置变化的

root

直播预告|MobTech携手中国信通院共话数据治理建设实践

MobTech袤博科技

数据安全 火山引擎 信通院 MobTech袤博科技

使用和风天气 API 10分钟搭建天气预报数据看板

蒋川

API 天气api

Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库

xuri

golang Excel Apache POI Go 语言 Excelize

《手写Mybatis》第4章:Mapper XML的解析和注册使用

小傅哥

小傅哥 mybatis 工厂模式 建造者

十年磨一剑,墨菲安全正式发布开源项目murphysec

墨菲安全

开源安全

快速尝鲜:RabbitMQ 搭建完就得用起来

阿Q说代码

RabbitMQ springboot 4月月更 消息确认机制

模块二:微信朋友圈高性能复杂度分析

jiaoxn

「架构实战营」

Go服务错误堆栈收集降频策略

SFLYQ

后端 高并发 Go 语言 日志采集

微信朋友券的高性能复杂度

CityAnimal

架构实战营 #架构实战营 「架构实战营」

架构实战营作业 - 模块二

haibin369

「架构实战营」

自己动手写Docker系列 -- 5.5实现容器停止

Go Docker 4月月更

为啥JS/TS里都会有"use strict"

华为云开发者联盟

js ts 严格模式 use strcit 使用严格

spring-cloud 链路追踪

Rubble

4月日更

华为云GaussDB(for Influx)揭秘第五期:最佳实践之子查询

华为云开发者联盟

数据库 华为云 GaussDB(for Influx) 子查询 InfluxQL

微信朋友圈的高性能复杂度

大眼喵

「架构实战营」

分析微信朋友圈的高性能复杂度

Kevin

「架构实战营」

[Day11]-[动态规划]让字符串成为回文串的最少插入次数

方勇(gopher)

LeetCode 数据结构和算法

微信朋友圈架构复杂度分析

Trent

10个商品图策略,引导亚马逊卖家提升客户购物体验

龙国富

电商 商品 亚马逊 客户体验

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