System.out.println是否违反了得墨忒耳定律?

发布于 2024-10-10 13:45:58 字数 69 浏览 3 评论 0原文

System.out.println 是否违反了得墨忒耳定律?

如果没有,为什么?

Does System.out.println violate the law of demeter?

If not, why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我也只是我 2024-10-17 13:45:58

取决于视图。

LoD:是的,因为它使用控制台。在 LoD 下,您无法承担访问权限。

LoD-F:是的,因为它使用了多个点。 LoD-F 规定,在任何方法使用中,只有对象可以知道其自身的内部结构。
IE

System.out.println() 

需要了解系统的结构(它有 .out)才能到达 println(),

为了系统不破坏 LoD-F,它必须

System.println()

以 println() (方法)为例来打破正式规则只能访问:

  1. 系统本身
  2. println() 的参数
  3. 在 println() 中创建/实例化的任何对象
  4. 系统的直接组件对象
  5. 可由系统访问的全局变量,在 println() 范围内

(我知道,这里是反向引用,如代码应该是调用它的方法,但它实际上是双向的。)

Depending on view.

LoD: Yes, because it uses the console. Under LoD you can't assume access.

LoD-F: Yes, because it uses more than one dot. The LoD-F states that in any method usage only the object may know the internal structure of itself.
IE

System.out.println() 

requires knowledge of the structure of system (that it has .out) to reach println(),

For System to not break LoD-F it would have to be

System.println()

To break the formal rules down with example, println() (the method) may only access:

  1. system itself
  2. println()'s parameters
  3. any objects created/instantiated within println()
  4. system's direct component objects
  5. a global variable, accessible by system, in the scope of println()

(I know, it's a reversed reference here as the code should be the method calling it, but it actually swings both ways.)

无语# 2024-10-17 13:45:58

System.out 实际上是一个“全局状态”,是的,从技术上讲它违反了“德米特定律”。但是:

  • 您应该避免使用 System.out.println(..) 。请改用记录器(log4j、logback、slf4j)。
  • 您不应该依赖(和测试)任何用于登录控制台的内容。 (这不涉及稍后聚合记录信息的复杂日志系统)

System.out is actually a "global state", and yes, technically it violates the "law of demeter". But:

  • you should avoid using System.out.println(..). Use a logger (log4j, logback, slf4j) instead.
  • you are not supposed to rely (and test) anything that's for the purpose of logging to a console. (this does not concern complex logging systems that later aggregate the logged information)
晒暮凉 2024-10-17 13:45:58

不。

System.out 是一个全局变量。

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

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

-- Wikipedia

根据第五条规则,你可以调用全局变量System.out 从任何上下文中。

No.

System.out is a global variable.

More formally, the Law of Demeter for functions requires that a method
m of an object O may only invoke the methods of the following kinds of
objects:[2]

  1. O itself
  2. m's parameters
  3. Any objects created/instantiated within m
  4. O's direct component objects
  5. A global variable, accessible by O, in the scope of m <- This one

-- Wikipedia

By the 5th rule, you can invoke any method of the global variable System.out from within any context.

稀香 2024-10-17 13:45:58

我想说不是真的,因为它调用 Object.toString() 并且不以任何方式与任何类紧密耦合;它只是告诉对象将自身转换为字符串。


编辑:

如果您指的是调用本身,而不是调用中发生的情况,那么我会说是的,因为它将您的程序与 System.out 字段紧密耦合。

I'd say not really, since it calls Object.toString() and doesn't tightly couple with any class in any way; it just tells the object to convert itself to a string.


Edit:

If you mean the call itself, rather than what happens in the call, then I'd say yes it does, because it tightly couples your program to the System.out field.

怀念你的温柔 2024-10-17 13:45:58

它违反了法律,因为它使用了“多个点”,并暴露了它正在使用另一个对象进行 println 调用的事实。

It breaks the law, since it uses "more than one dot", and exposes the fact that it is using another object for the println call.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文