【问题标题】:Reducing cyclomatic complexity of object oriented python code降低面向对象的python代码的圈复杂度
【发布时间】:2018-11-14 20:05:58
【问题描述】:

我正在尝试降低代码的 cylomatic 复杂性,因为根据 pylama 我的定义是“太复杂”并且建议 solution 包括使用字典映射调用函数。

所以我在我的面向对象代码上尝试了它,但惨遭失败。

class trial:
    def __init__(self):
        self.a = 'a'
        self.b = 'b'

    def a(self):
        return self.a

    def b(self):
        return self.b

    def select_one(self, option):
        map_func = {
        1 : self.a,
        2 : self.b
        }
        return map_func[option]()

t = trial()
print(t.select_one(1))

如果这是不可能的,还有哪些其他可能的解决方案来降低圈复杂度。

【问题讨论】:

  • 您应该在__init__ 中一劳永逸地定义map_func,这样就不会每次都重做,否则字典的意义何在
  • 除此之外我认为没有复杂性...
  • 你也有相同的函数和字符串。请改变它。这可能就是为什么它不适合你
  • 为什么会降低圈复杂度?您引入了一个工厂函数,该函数调用您自己可以通过名称调用的其他两个函数之一?另外:使用dict.get() 或在提供给映射器的“alosdfböoads”上惨死。这几乎是代码混淆——谁知道 1 或 2 会做什么?
  • @PatrickArtner 这只是一个例子,我会将我的选项从 1,2 更改为更明智的选项,我之前的(太复杂的代码有)一个带有 if else 阶梯的单一方法来选择一个选项。

标签: python python-3.x cyclomatic-complexity


【解决方案1】:

首先,字典应该在__init__ 中定义,或者每次输入select_one 函数时都有O(n) 复杂度(每次都会构建字典,这会使链接中的示例错误)

其次,您的方法与您的属性同名。改变那个:

class trial:
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        self.map_func = {
        1 : self.f_a,
        2 : self.f_b
        }

    def f_a(self):
        return self.a

    def f_b(self):
        return self.b

    def select_one(self, option):
        return self.map_func[option]()

t = trial()
print(t.select_one(1))

【讨论】:

  • 你的代码抛出错误Traceback (most recent call last): File "function_call_dict.py", line 20, in <module> print(t.select_one(1)) return map_func[option]() TypeError: 'str' object is not callable
  • 很奇怪,因为我按原样测试了它。你确定你完全复制了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多