是否System.out.println
违反得墨忒耳定律?
如果不是,为什么?
视景而定。
LoD:是的,因为它使用控制台。在 LoD 下,您不能假设访问。
LoD-F:是的,因为它使用了不止一个点。LoD-F 指出,在任何方法使用中,只有对象可能知道其自身的内部结构。IE
System.out.println()
需要了解系统结构(它具有 .out)才能到达 println(),
为了使系统不破坏 LoD-F,它必须是
System.println()
举例来说,打破正式规则, println() (方法)只能访问:
(我知道,这是一个反向引用,因为代码应该是调用它的方法,但它实际上是双向的。)
System.out
实际上是一个“全球状态”,是的,从技术上讲,它违反了“德米特法则”。但:
System.out.println(..)
. 请改用记录器(log4j、logback、slf4j)。不。
System.out
是一个全局变量。
更正式地说,函数的得墨忒耳定律要求对象 O 的方法 m 只能调用以下类型对象的方法:[2]
- O本身
- m的参数
- 在 m 中创建/实例化的任何对象
- O 的直接组件对象
- 一个全局变量,可由 O 访问,在 m <- This one的范围内
——维基百科
System.out
根据第五条规则,您可以在任何上下文中调用全局变量的任何方法。
我想说不是,因为它调用Object.toString()
并且不以任何方式与任何类紧密耦合;它只是告诉对象将自己转换为字符串。
编辑:
如果您指的是调用本身,而不是调用中发生的事情,那么我会说是的,因为它将您的程序与该System.out
领域紧密结合。
它违反了法律,因为它使用了“多个点”,并暴露了它正在使用另一个对象进行 println 调用的事实。