得墨meter耳定律及其使用方法
得墨meter耳定律是有趣的编程原理。 这是我所知道的唯一一个近似数学的定义:
对象O的任何方法m只能调用以下类型的对象的方法:
- O本身
- m的参数
- 在m内创建/实例化的任何对象
- O的直接组成对象
- 全局变量,可由O访问,范围为m
如果您没有意识到,此列表不允许您调用任何允许的方法返回的任何方法。 它本质上禁止链接方法调用。 我会稍作一些例外。
为什么?
得墨meter耳定律的目的是什么? 它试图防止什么? Demeter定律旨在减少耦合并增加封装。 通过遵循迪米特法则,你让这个类Ø并不需要知道的比什么M做其他的米源东西。 为了减少与m的耦合, O除了m的存在外,不应该对m的返回有任何了解。
我可能没有最好的解释。 走出去看看别人如何解释这不是一个坏主意。 这篇文章的真正目的是描述遵守法律的方式,一种反模式以及一些例外情况。
反模式
我们将从反模式开始。 我称其为“分层私有方法”,这是我第一次想到“绕过Demeter法则”,但我很快发现,尽管从技术上讲它遵循所给出的规则,但并未遵循该法则的原因。
反模式就是这样。 假设您最初有以下代码要修改以遵循Demeter:
public void m(Parameter parameter)
{ReturnValue result = parameter.method();result.method();
}
要解决此问题,请将其更改为:
public void m(Parameter parameter)
{otherMethod(parameter.method());
}private void otherMethod(ReturnValue rv)
{rv.method();
}
如您所见,每种方法仍然遵循法律,但是类仍然是耦合的。 每当您从内部调用O的另一个方法时,都应考虑该调用方法中的代码是m的一部分,以便仍然遵循Demeter定律的精神。
层数
那么,您应该怎么做才能修复代码? 在这种情况下,您可以将私有方法调用转换为对新类的调用:
public class NewClass
{public void extractedMethod(ReturnValue rv){rv.method();}
}
所以m现在看起来像这样:
public void m(Parameter parameter)
{NewClass helper = new NewClass();helper.extractedMethod(parameter.method());
}
现在,这似乎是一个完全的浪费,创建一个新类,该类实际上是私有方法的替代品。 但是,实际上,有很多人认为每个私有方法都应该成为一个新类。 虽然我同意我们的私有方法确实显示出超越它们所包含的类范围的趋势。 每当您看到私有方法时,请考虑从中提取一个类。
但是,这是打电话给那个班级的最好方法吗? 到目前为止,您应该已经了解了依赖注入(如果不这样做,请进行查找;它非常简单,但是很重要)。 如果移到类的调用非常复杂,以至于需要进行自己的测试,则应以自己认为最合适的方式应用DI。 如果没有,请考虑一下。 但是,除非您希望有多个实现,否则可能没有充分的理由立即执行此操作。
例外1:数据结构
当m是数据结构上的方法或返回数据结构时,可以忽略Demeter定律。 数据结构是一类,其整体目的基于存储/表示数据。 这包括原始类型包装器,String,“ java bean”等。 可以理解的是,如果数据的定义发生变化,则数据的用户必须适应这种变化。 如果您调用的方法(违反了得墨meter耳法则)只是返回公共内部数据(数据本身可能是私有的,但使用公共获取程序),则没有充分的理由不允许这样做。
遵循以下准则,不可变对象也可能是违反法律的一部分:“错误”方法调用1)返回公共内部数据(如之前)或2)返回与自身类型相同的新对象。
数字2是安全的,因为方法调用等效于增加数字。 如果整数不具备使用运算符的能力,则假设对象是不可变的,则增量将与数字2( n = n.increment()
)完全相同。
例外2:构建器模式和其他Fluent API
当API设计为流利的(因此通常是链接的)时,没有充分的理由要成为严格的Demeter追随者而失去可读性。 例如,如果您不允许自己链接方法,那么Java 8的Stream
API将一文不值。
奥托罗
希望您现在对Demeter定律的目的和用法有更好的了解。 现在开始编程! 玩得开心!
翻译自: https://www.javacodegeeks.com/2015/03/law-of-demeter-and-how-to-work-with-it.html
得墨meter耳定律及其使用方法相关推荐
- html5中meter讲解_Java中的得墨meter耳定律–最少知识原理–实际示例
html5中meter讲解 得墨meter耳定律(也称为最少知识定律)是一种编码原理,它表示模块不应该知道其操作的对象的内部细节. 如果代码取决于特定对象的内部细节,则很有可能一旦该对象的内部发生更改 ...
- Java中的得墨meter耳定律–最少知识原理–实际示例
得墨meter耳定律(也称为最少知识定律)是一种编码原理,它表示模块不应该知道其操作的对象的内部细节. 如果代码依赖于特定对象的内部细节,则很有可能一旦该对象的内部发生更改,它就会被破坏. 由于封装是 ...
- 【设计模式】七大设计原则--------迪米特法则(得墨忒耳定律)(最少知识定律)
文章目录 1.介绍 2.示例 3.改进 1.介绍 得墨忒耳,是希腊神话的农业女神. 得墨忒耳定律主要内容为: (1)每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元: (2)每个 ...
- 得墨忒耳定律 (Law of Demeter,缩写LoD)
前言 这篇文章中,我想谈一谈得墨忒耳定律(Law of Demeter,缩写LoD).我觉得这个主题对于写出一手简洁.精心设计和易于维护的代码,是极其重要的. 根据我的经验,看到这条规则被打破,往往意 ...
- C#版得墨忒耳定律(迪米特法则)
最近在度娘搜代码优化,看到了Edison Zhou写的<代码整洁之道>(Clean Code)- 读书笔记,里面有个整理很清楚的思维导图,发现有得墨忒耳定律,就想到面试题里的简单经典的问题 ...
- 得墨忒耳定律(Law of Demeter)
得墨忒耳定律(Law of Demeter,缩写LoD)也叫做"最少知识原则",是一种开发软件的设计原理,特别是面向对象的程序设计,得墨忒耳定律是松耦合的一种特殊情况.该指导原则是 ...
- 使用函数的得墨忒耳法则来解耦
编写"羞怯"的代码: 包含两层意思,一个是不向别人暴露你自己,不会没必要的向其他模块暴露任何事情:另一个是不与太多人打交道,不依赖于其他模块实现的模块. 不与太多人打交道,说的就是 ...
- 函数的得墨忒耳法则(转)
函数的得墨忒耳法则 分类: 设计模式与重构 2011-03-21 20:08 58人阅读 评论(0) 收藏 举报 得墨忒耳定律也叫做"最少了解原理",是一种软件设计原理,尤其是应用 ...
- 得墨忒耳法则(迪米特法则)
使用函数的得墨忒耳法则来解耦 编写"羞怯"的代码: 包含两层意思,一个是不向别人暴露你自己,不会没必要的向其他模块暴露任何事情:另一个是不与太多人打交道,不依赖于其他模块实现的模块 ...
最新文章
- html 移动端关于长按图片弹出保存问题
- 求无序数组的第二小的元素
- 如何使用Ubuntu打电话
- 找出那个数字出现3次的数字
- java变量不声明可以直接使用吗_我们可以在不使用Java进行初始化的情况下声明最终变量吗?...
- 程序员谈谈我的职场观(二)
- 去哪儿网查不到历史订单_去哪儿网 数据清洗
- 苹果官网买的认证翻新机可靠吗?
- 关于Android工程师转成vue的三两事儿(4)--webpack
- php导航栏代码子菜单找不到,php – 下拉导航菜单,显示每个类别的最新帖子
- R+工业级GBDT︱微软开源 的LightGBM(R包已经开放)
- MFC没改啥就断言错误
- word论文排版插件_Word自动排版软件
- 一键GHOST v2019.08.12优盘教程
- 运算符优先级及记忆口诀
- 十天干、十二地支的发音及含义
- 第五人格显示服务器维护中请稍后登录怎么办,第五人格账号登录失败怎么办
- 如何定制allure报告的logo
- tcpip命令全面汇总
- 引入静态路由_网络工程师提高篇 | 路由重发布你了解多少?从原理到配置,瑞哥带你学习一波!...
热门文章
- 齿轮泵泵体的加工工艺与专用夹具设计(论文+CAD图纸+工序卡)
- js验证身份证号码包括最后一位字母
- 三菱fx2n做从站的modbus通讯_三菱PLC控制变频器的方法
- 键值对,可用的国际长途电话区号(中英文名)
- vue.js组件的练习_由Vue.js开发的电阻器颜色练习网站
- 这款实现 C++、Java、Python 代码互译的工具,很强!
- Android log查看器
- 深度学习基础知识_数学基础(学习笔记)
- 台式计算机提示内存不足怎么办,台式电脑提示内存不足的解决办法
- 不安装oracle数据库客户端,使用sqlplus