8

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

如果不是,为什么?

4

5 回答 5

2

视景而定。

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() 范围内

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

于 2011-01-01T21:36:59.710 回答
1

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

  • 你应该避免使用System.out.println(..). 请改用记录器(log4j、logback、slf4j)。
  • 您不应该依赖(和测试)任何出于登录控制台的目的。(这不涉及后来汇总记录信息的复杂日志系统)
于 2011-01-01T21:27:38.710 回答
1

不。

System.out是一个全局变量。

更正式地说,函数的得墨忒耳定律要求对象 O 的方法 m 只能调用以下类型对象的方法:[2]

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

——维基百科

System.out根据第五条规则,您可以在任何上下文中调用全局变量的任何方法。

于 2015-10-08T08:06:16.947 回答
0

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


编辑:

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

于 2011-01-01T21:17:48.383 回答
0

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

于 2011-01-01T21:22:07.853 回答