System.out.println是否违反了德米特定律?

时间:2011-01-01 21:16:07

标签: java law-of-demeter

System.out.println是否违反了德米特定律?

如果没有,为什么?

5 个答案:

答案 0 :(得分: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. 系统的直接组件对象
  6. 一个全局变量,可由系统访问,在println()
  7. 的范围内

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

答案 1 :(得分:1)

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

  • 您应该避免使用System.out.println(..)。请使用记录器(log4j,logback,slf4j)。
  • 你不应该依赖(并测试)任何用于登录控制台的目的。 (这与后来聚合记录信息的复杂日志记录系统无关)

答案 2 :(得分:0)

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


编辑:

如果您的意思是呼叫本身,而不是呼叫中发生的事情,那么我会说是的,因为它将您的程序紧密地耦合到System.out字段。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

没有

System.out是一个全局变量。

  

更正式地说,Demeter法则的功能需要一种方法   对象O的m只能调用以下类型的方法   对象:[2]

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

- Wikipedia

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