我认为这个问题更多的是关于风格: 我的算法具有非常高的CC(以及很多行!)。我想减少它,因为有一些代码可以分组,所以很容易。问题是以这种方式做事我会有一个“大”函数调用“小”函数,只调用一次。
在我看来,尽管函数被调用一次,但是以小块形式打破一个大函数对于代码的易读性(在这种情况下)更好。
你怎么了?你怎么做类似的情况?答案 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)
正如已经说过的,将一个大功能分成几个较小的功能有很多优点。可读性(具有适当的命名),局部变量的分组(函数中使用的临时变量更接近,提供更好的缓存行为),可能会发生其中一个函数可以在其他地方重用,之前不可见的事情。