【问题标题】:C function only called once and cyclomatic complexityC函数只调用一次和圈复杂度
【发布时间】:2010-05-21 14:01:25
【问题描述】:

我认为这个问题更多的是关于风格: 我有一个算法,它的 CC 非常高(还有很多行!)。我想减少它,这很容易,因为有一些可以分组的代码。问题是,以这种方式做事我会有一个“大”函数调用“小”函数,这些函数只被调用一次。

在我看来,尽管函数被调用一次,但将大函数分成小块更利于代码的易读性(在这种情况下)。

你怎么看?遇到类似情况你怎么办?

【问题讨论】:

    标签: c function cyclomatic-complexity


    【解决方案1】:

    将一个大函数分解成更小的、大部分是独立的块是一个非常好的主意。让代码更易读,控制流更清晰。

    如果函数是静态的并且只调用一次,编译器可能会在不被询问的情况下为您内联它们,因此无需担心运行时成本。

    【讨论】:

    • 再想一想,即使不是静态的,函数仍然可以内联,当然,代价是一些代码重复。即使这没有发生,链接时代码生成可能仍然会进行内联。
    【解决方案2】:

    函数只被调用一次并没有什么不好。
    它们使您的代码保持整洁,并且您不会丢失任何东西,只是添加函数调用,不会对只调用一次的函数造成真正的性能影响。

    【讨论】:

      【解决方案3】:

      比内联更进一步,有很多函数只被调用一次。

      假设我们有这样的结构:

      typedef struct foo {
           char *foo;
           int bar;
           double foobar;
      } foo_t;
      

      我们写一些东西来初始化/分配它:

      foo_t *foome(void)
      {
          foo_t *ret;
      
          ret = (foo_t *) malloc(sizeof(struct foo));
      
          ...
          ...
      }
      

      但是当foome() 只在main() 中被调用一次时,为什么我们会遇到这么多麻烦呢?因为我们希望下一个必须处理我们程序的人能够查看main() 并立即了解我们要完成的工作。

      我宁愿看到有几十个一次性函数的代码,如果这意味着一个复杂的算法在单个(或关闭)屏幕中读起来就像一本书。当我不得不上下滚动 n 百行并试图保持我的位置时,我无法告诉你我的头有多痛。

      这可以节省理智并有助于环境,因为现在我不需要打印出所有 60 页算法并将它们排列在一张桌子上以便能够阅读:)

      【讨论】:

        【解决方案4】:

        如前所述,将一个大函数拆分为几个较小的函数有很多优点。可读性(使用正确的命名)、局部变量分组(函数中使用的临时变量更接近,从而提供更好的缓存行为),这些函数中的一个可能会在其他地方重用,这是以前不可见的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-13
          相关资源
          最近更新 更多