AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

评论

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

AI力量:如何让测试更智能更高效

测吧(北京)科技有限公司

测试

绕过 MVCC 影响的 TiDB Delete 数据方法

TiDB 社区干货传送门

管理与运维 7.x 实践

TiKV 状态变化

TiDB 社区干货传送门

港美股招商一手票方是什么?

一个普通的写作

MYSQL 同步到ES 如何设计架构保持一致性

不在线第一只蜗牛

MySQL 数据库 架构

京东流水线——满足你对工作流编排的一切幻想

京东科技开发者

GPU云服务器与自建GPU服务器的对比

Ogcloud

gpu 云服务器 GPU云服务器

原理剖析:AutoMQ 如何基于裸设备实现高性能的 WAL

AutoMQ

大数据 kafka 云原生 AutoMQ

金三银四 | 测试开发岗求职攻略来袭,快来抢先一步!

测吧(北京)科技有限公司

测试

稳定性方法论:可灰度 & 可监控 & 可回滚

京东科技开发者

企业异地组网的挑战与解决方案

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

月活超 1.1 亿,用户超 4 亿,你也在用的「知乎」是如何在超大规模 TiDB 集群上玩转多云多活的?

TiDB 社区干货传送门

实践案例 社区活动 数据库前沿趋势 OLTP 场景实践

万字心路历程:从十年老架构决定重构开始

阿里巴巴云原生

阿里云 云原生 iLogtail

不再等待直接上答案,百度智能云推出数据库 Copilot

Baidu AICLOUD

数据库 大模型

OPPO案例 | Alluxio在Data&AI湖仓一体的实践

Alluxio

机器学习 模型训练 OPPO Alluxio #人工智能

【稳定性】从项目风险管理角度探讨系统稳定性

京东科技开发者

ETL的全量和增量模式

RestCloud

数据同步 ETL 增量同步 全量同步

Java jdbc 驱动 maxPerformance 配置避坑

TiDB 社区干货传送门

开发语言 应用适配 数据库连接

微隔离,做到真正零信任

德迅云安全杨德俊

外包服务 | 从人员外包到测试工具、测试平台,提供全方位的测试解决方案~

测吧(北京)科技有限公司

测试

技术领导力之路 - 正反馈

阿里技术

技术领导力 正反馈

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