1.模块不应该了解它所操作对象的内部情形。对象隐藏数据,暴露操作,这意味对象不应该通过存取器暴露其内部结构
因为这样更像是暴露而非隐藏其内部结构。
对象应该暴露行为,而不是数据。
迪米特法则
类C的方法f只应该调用一下对象的方法
C
由f创建的对象
作为参数传递给f的对象
c的实体持有的对象
方法不应该调用任何函数返回对象的方法,不要和陌生人说话
final String outtputDir = ctxt.getOptions().getScratchDir().getAbsoluePath()
上面的代码,模块知道ctxt对象包含有多个选项,每个选项有一个临时目录,而每个临时目录有一个绝对路径。
对于一个函数,这些知识真够丰富的。调用函数懂得如何在一大推不同对象间浏览。
这些代码是否违法迪米特法则,取决于ctxt,Options和ScrattchDIr是对象还是数据结构。如果是对象,则它们的
内部结构应该隐藏而不是暴露,而有关内部细节的知识就明显违反了。如果它们是数据结构结构,没有任何行为,
则它们自然会暴露其内结构,迪米特法则就不适用了。
隐藏结构
如果ctxt是对象,就应该要求它做点什么,不该要求它给出内部情形,那我们为何还要得到临时目录的绝对路径了?
ctxt应该隐藏其内部实行,观察模块其他代码,发现调用以上方法只是为了创建指定名称的临时变量
所以,直接要ctxt对象来做这件事情如何?
BuerdOutputStream bos = ctxt.createScratchFileStream(classFileName)
重点:对象是封装的,对外提供方法,而不是数据。而数据结构就是暴露数据的。