写点什么

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

评论

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

EDAS 让 Spring Cloud Gateway 生产可用的二三策

阿里巴巴云原生

阿里云 云原生 EDAS

全球首款容器计算产品重磅发布,激活上云用云新范式

阿里巴巴云原生

阿里云 云原生 ACS

软件开发

Geek_8da502

C 语言中布尔值的用法和案例解析

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

淘宝API接口:助力电商应用快速开发

tbapi

淘宝商品详情数据接口 淘宝商品列表数据接口 淘宝API 关键词搜索淘宝商品列表 关键词搜索淘宝商品接口

华为用户专享:冬至特辑带来沉浸式影音娱乐体验

最新动态

阿里云 ARMS 应用监控重磅支持 Java 21

阿里巴巴云原生

Java 阿里云 云原生

零代码助力服装行业数字化转型

明道云

Autogen4j: the Java version of Microsoft AutoGen

HamaWhite

agent openai LLM

云工作流 CloudFlow 重磅发布,流程式开发让云上应用构建更简单

阿里巴巴云原生

阿里云 云原生

SAE 2.0,让容器化应用开发更简单

阿里巴巴云原生

阿里云 Serverless 云原生

拼多多新店玩直通车(拼多多新店直通车拉爆流量)

tbapi

拼多多 拼多多商品详情数据接口 拼多多直通车 拼多多API

拼多多数据宝贝(掌握拼多多数据分析方法)

tbapi

拼多多 拼多多商品详情接口 拼多多API接口 拼多多商品采集方法

华为天气发起‘暖冬计划’,暖人更暖心

最新动态

联想算力基础设施的“火种台”,让千行万企智能化不再凛冽

脑极体

AI 算力

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

阿里巴巴云原生

阿里云 开源 云原生

一款外置MOS开关降压型 LED 恒流控制器应用方案

芯动大师

慢调用链诊断利器-ARMS 代码热点

阿里巴巴云原生

阿里云 云原生 可观测

面对大促场景来临,如何从容进行性能测试

阿里巴巴云原生

阿里云 云原生 压测

通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

阿里巴巴云原生

阿里云 云原生

Hago 的 Spark on ACK 实践

阿里巴巴云原生

阿里云 云原生

质量核心

玄兴梦影

质量 质量指标

Confluent 与阿里云将携手拓展亚太市场,提供消息流平台服务

阿里巴巴云原生

阿里云 云原生

边缘智变:深度学习引领下的新一代计算范式

小王撤了

边缘计算

2024年度AI大模型趋势解读

AI 大模型

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