C函数只调用一次和圈复杂度

时间:2010-05-21 14:01:25

标签: c function cyclomatic-complexity

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

在我看来,尽管函数被调用一次,但是以小块形式打破一个大函数对于代码的易读性(在这种情况下)更好。

你怎么了?你怎么做类似的情况?

4 个答案:

答案 0 :(得分:7)

将一个大功能分解成更小的,大多是独立的块是一个非常好的主意。它使代码更具可读性,控制流程更加清晰。

如果这些函数是静态的并且只调用一次,编译器可能会在没有被询问的情况下为你内联它们,所以不必担心运行时成本。

答案 1 :(得分:3)

只有一次调用函数没什么不好 它们保持你的代码整洁,你不会丢失任何东西,只需添加函数调用,对于你只调用一次的函数没有真正的性能损失。

答案 2 :(得分:2)

超越内联,有很多函数只被调用一次。

假设我们有这样的结构:

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()并立即了解我们想要实现的目标。

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

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

答案 3 :(得分:0)

正如已经说过的,将一个大功能分成几个较小的功能有很多优点。可读性(具有适当的命名),局部变量的分组(函数中使用的临时变量更接近,提供更好的缓存行为),可能会发生其中一个函数可以在其他地方重用,之前不可见的事情。