得墨忒耳和Python法则

时间:2010-10-21 09:21:24

标签: python

是否有工具可以检查Python代码是否符合Demeter法则?

我在pychecker中发现了Demeter,但似乎该工具理解这个法律与我的期望不同:http://en.wikipedia.org/wiki/Law_of_Demeter

维基百科的定义:函数的Demeter定律要求对象O的方法M只能调用以下类型对象的方法:

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

3 个答案:

答案 0 :(得分:1)

在您提供的链接中解释此法律的方式过于模糊和主观,无法通过任何自动化工具进行有效检查。您需要考虑导致遵守此法律的代码的特定规则。然后你可以检查这些规则。

答案 1 :(得分:0)

  Demeter法则...对象O的方法M只能调用以下类型对象的方法:

  1. O本身 - 即self个变量。很容易看到。
  2. M的参数 - 即参数给出的局部变量。也就是说,在locals()
  3. 在M内创建/实例化的任何对象 - 即局部变量。也就是说,在locals()
  4. O的直接组件对象 - 即self变量。
  5. 一个全局变量,可由O访问,在M的范围内 - 即,在global语句中命名的变量或对本地命名空间中找不到的全局变量的隐式引用。也就是说globals()
  6. 嗯....函数没有其他变量可用,有吗?由于名称空间的工作方式,我认为没有任何违反此法律的可能性。

    您是否有一个破坏其中一条规则的Python代码示例?

    您如何访问另一个名称空间?

答案 2 :(得分:0)

你可能会破坏这样的法律:

class SomeClass:
    def someMethod(self):
        self.getSomeOtherClass().someOtherMethod() # this breaks the law
    def getSomeOtherClass(self):
        class_ = SomeOtherClass()
        return class_

还是不?