我认为这个问题更多的是关于风格:我有一个算法,它的 CC 非常高(还有很多行!)。我想减少它,这很容易,因为有一些可以分组的代码。问题是,以这种方式做事我会有一个“大”函数调用“小”函数,这些函数只被调用一次。
在我看来,尽管函数被调用一次,但将一个大函数分成小块更利于代码的易读性(在这种情况下)。
你怎么看?类似情况你怎么办?
我认为这个问题更多的是关于风格:我有一个算法,它的 CC 非常高(还有很多行!)。我想减少它,这很容易,因为有一些可以分组的代码。问题是,以这种方式做事我会有一个“大”函数调用“小”函数,这些函数只被调用一次。
在我看来,尽管函数被调用一次,但将一个大函数分成小块更利于代码的易读性(在这种情况下)。
你怎么看?类似情况你怎么办?
将一个大功能分解成更小的、大部分独立的块是一个非常好的主意。它使代码更易读,控制流更清晰。
如果函数是静态的并且只调用一次,编译器可能会在不被询问的情况下为您内联它们,因此无需担心运行时成本。
只调用一次的函数并没有什么不好。
它们使您的代码保持整洁,并且您不会丢失任何东西,只是添加了函数调用,对只调用一次的函数没有真正的性能影响。
比内联更进一步,有很多函数只被调用一次。
假设我们有这样的结构:
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 页算法并将它们排列在一张桌子上以便能够阅读它:)
如前所述,将一个大功能拆分为几个较小的功能有很多优点。可读性(使用正确的命名),局部变量的分组(函数中使用的临时变量更接近,从而提供更好的缓存行为),这些函数中的一个可以在其他地方重用,这是以前不可见的。