什么是德米特法则?

2024-06-28

让我们从维基百科开始:

更正式地说,函数的德米特定律要求有一种方法m一个物体的O只能调用以下类型对象的方法:

  1. O itself
  2. m的参数
  3. m 内创建/实例化的任何对象
  4. O 的直接组件对象
  5. 全局变量,可通过 O 访问,范围为 m

Rule 1:

public class ClassOne {

    public void method1() {
        method2();
    }

    public void method2() {

    }
}

Rule 2:

public class ClassOne {

    public void method1(ClassTwo classTwo) {
        classTwo.method2();
    }
}

class ClassTwo {

    public void method2() {

    }
}

规则 3:

public class ClassOne {

    public void method1() {
        ClassTwo classTwo = new ClassTwo();
        classTwo.method2();
    }
}

class ClassTwo {

    public void method2() {

    }
}

规则 4(感谢@juharr):

public class ClassOne {

    private ClassTwo classTwo;

    public void method1() {
        classTwo = new ClassTwo();
        classTwo.method2();
    }
}

class ClassTwo {

    public void method2() {

    }
}

Rule 5:

?

谁能帮我解决规则 5 吗?


德米特法则不是暗示链接是不好的吗?

User.getName().getLastName();

这导致高耦合。


“只说,不问”不是类似的原则吗?

这就是一切吗?我是不是搞错了什么?你怎么能遵守德墨忒尔法则呢?


“告诉不要问”有点不同。

Demeter:不要为了得到什么而去做最后的事情。

TDA:不要从另一个对象检索“信息”然后对此做出决定。简单的例子:

if (someList.size() == 0) { bla

vs.

if (someList.isEmpty()) { bla

在这两种情况下,您都在调用其他对象的方法;但有一个关键的区别:第一个调用向您公开了另一个对象的“内部”状态;然后你就可以做出一些决定。鉴于,在“TDA”改进的第二个版本中;您将“状态评估”留在该其他对象中;从而以某种方式减少耦合。

但仅供记录:第二个例子still根据该列表的状态做出决定。从这个角度来说,这只是一个slightly比选项 1 更好的版本。理想情况下,您不需要此类检查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是德米特法则? 的相关文章

随机推荐

  • 使用 R 绘图将目录添加到 PDF

    我正在 R 中创建大量绘图并将它们保存为 PDF 使用 grDevices pdf 有没有一种简单的方法可以在创建 PDF 时将 元数据 目录添加到 PDF 中 我并不是想添加一个单独的页面 而是添加一个 TOC 像 Preview app
  • 尝试将实例强制转换为 PersistenceCapable 失败。确保它已得到增强

    我第一次尝试 OpenJPA 2 0 1 并得到 79 WARN main openjpa Runtime The configuration property named openjpa Id was not recognized and
  • Docker 镜像占用大量空间?

    docker ps aq 仅显示 7 9 张图像 var lib docker graph 显示了 n 张图像 当我创建文件时 由于系统已满错误 出现写入错误 我尝试创建符号链接 但我无法移动所有 docker 的东西 删除 var lib
  • 在一个模型中对多个地址进行地理编码

    我正在尝试使用地理编码器对模型中的 2 个地址进行地理编码 但我无法让 gem 按我想要的方式工作 这是我应用于我的模型的代码 class Sender lt ActiveRecord Base validates presence of
  • Excel VBA 日期格式

    我有一个包含多个日期的电子表格 这些通常出现在mm dd yyyy or mm dd yyyy hh mm 问题是日期并不总是正确输入 我想进行检查以确保它们是代码中的日期 我最初的想法是使用IsDate检查或CDate但这似乎不起作用 它
  • ctrl-] 不适用于 tcl 代码导航

    I am new to Tcl Tk I am using Vim to code and browsing The syntax highlighting for Tcl Tk is working fine The jump into
  • 如何在 MATLAB 中定位子图?

    我在设置子图的位置时遇到问题 我在循环内使用子图 但是当我尝试对子图进行特殊定位时 它不起作用 这是我的代码 h subplot 2 2 3 set h position 0 15 0 15 0 4 0 4 plot d3 S3 Color
  • WCF/WebService:可互操作的异常处理

    我知道 WCF 会将异常转换为错误并将其作为 SOAP 消息发送回来 但我想知道这是否真正具有互操作性 我想我很难弄清楚这种可能的情况 客户端 Java 调用 WCF 服务 登录服务 服务器检查授权是否正确 用户授权失败 服务器抛出 Una
  • 使用地理位置按钮检索当前位置和邮政编码

    我想放置一个Geolocation button靠近我的UISearchBar 点击后 它应该返回 zip 例如 20043 我将使用 ZIP 中的值来获取我附近的建筑物列表 如果有人可以帮助我使用位置按钮 以及实现仅返回 ZIP 的方法是
  • 使用 Autofac WcfIntegration 时如何处理构造函数异常

    当 WCF 服务的构造函数接受依赖项时 有没有办法处理该构造函数抛出的异常 并且IoC 容器 本例中为 AutoFac 对依赖项的实例化导致了异常 考虑具有以下构造函数的 WCF 服务 public InformationService I
  • Matlab——处理对象

    有一个句柄类Foo classdef Foo lt handle properties SetAccess public GetAccess public x end methods function obj foo x construct
  • java轻量级调试器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个轻量级的 java 调试器 无论是在 IDE 中还是独立的 命令行或 GUI 中 我正在使用 ant 和 vim 并且尝试过
  • 在导出之前将对象分配给变量作为模块默认警告

    import axios from axios const baseUrl http localhost 3001 persons const getAll gt return axios get baseUrl const create
  • C++ 模板专门化以提供额外的成员函数?

    如何以非内联方式为专用模板提供额外的成员函数 IE template
  • Eslint 错误:不要嵌套三元表达式

    我正在使用 React js 开发一个项目 并且使用 eslint 时出现此错误 不要嵌套三元表达式 这是我的代码 const MyApp gt return lt gt var1 var2
  • 是否可以加载没有图像名称的图像?

    是否可以加载没有图像名称的图像 像这样 img src http www example com 只使用 URL 的原因是因为 URL 上每次都会有其他图像 因此图像名称是动态的 是的 当然了 请记住 文件系统和 HTTP 请求 响应之间存
  • 在 Spark 中访问数组列

    Spark DataFrame 包含类型为 Array Double 的列 当我尝试将其返回到 map 函数时 它会抛出 ClassCastException 异常 以下 Scala 代码生成异常 case class Dummy x Ar
  • PowerShell:导入不带标题的 CSV 并删除部分重复行

    我有一个日志文件 其格式为 CSV 没有标题 第一列基本上是所记录问题的唯一标识符 对于同一问题标识符 可能有多行具有不同的详细信息 我想删除第一列重复的行 因为此时我不需要其他数据 目前我对 PowerShell 已经有了相当基本的了解
  • Spring @Before 更改每个用户登录名

    我有一个 Aspect 类 它执行 Before 方法并拦截用户登录时带有某些 Id 的所有查询 但问题是 每次用户登录时 所有登录用户的 Before 方法的 Id 都会发生变化 只需更改当前用户即可 简单的过程 当用户登录时 Aspec
  • 什么是德米特法则?

    让我们从维基百科开始 更正式地说 函数的德米特定律要求有一种方法m一个物体的O只能调用以下类型对象的方法 O itself m的参数 m 内创建 实例化的任何对象 O 的直接组件对象 全局变量 可通过 O 访问 范围为 m Rule 1 p