你会拆分这样的函数么?

2014-12-05 16:16:51 +08:00
 spacewander
有一个函数,是这样子的:
(仅仅用作表示,真实函数肯定不叫doSomething)

doSomething(a, b, c)
{
// prepare
...
// do A
...
// do B
...
// do C
...
}

前提:
1. do A/B/C中的内容不会被其他函数复用,仅仅在doSomething中被用到
2. 这是C++写的
3. 该函数不是“厨房下水道”函数,其长度是300多行

有人认为,应该把do A/B/C部分,分别拆开成单独的函数,然后让doSomething调用它们。
理由:
1. 这样做大大减少了doSomething函数的大小,使得整个函数更加一目了然
2. 无需再添加一行注释表示该部分代码是做什么的,用函数名就能清晰表示它们的职责
3. 将部分逻辑置于独立的函数之中,便于调试

不过楼主不认同这个观点,反而认为维持现状即可。
理由:
1. 这些部分不会被复用,即使独立成单独的函数,意义不大,不应该过度设计。
2. 独立成单独的函数后,需要将函数的输入/输出参数重复一遍,而且万一以后发生变动,不得不修改多个函数之间的传递的类型信息。
3. 独立出更多的函数后,看上去程序更好理解了,但实际是把单个函数的维护成本分摊到多个子函数上了。如果这样做了,要想明白doSomething的实现细节,你就不得不去阅读4个函数:doSomething,doA,doB和doC。
4. 一旦doSomething的逻辑发生较大变化,原本只需修改doSomething一个函数,现在则需要修改三个子函数。分拆函数就是为了把逻辑独立出去,但是这三个函数在逻辑上不一定能够独立开来,分拆它们会把事情变得更复杂。

各位怎么看?
6307 次点击
所在节点    程序员
44 条回复
jedihy
2014-12-06 11:27:09 +08:00
可以试试 inline 或者宏定义
barbery
2014-12-06 14:27:31 +08:00
必须拆。。。
cvrock
2014-12-06 16:11:44 +08:00
unsigned DoAct(ACT_TYPE type)
{
unsigned ret = 0;
switch(type)
{
case TYPE_A:
ret = DoActA();
break;
case TYPE_B:
ret = DoActB();
break;
default:
ret = -1;
}
//log、assert什么的统一放这里
LOG("Do act xxx returns xx.\n");
return ret;
}

我喜欢这样。
ryanking8215
2014-12-06 20:41:50 +08:00
我会拆的,初始化的时候这种情况很多,拆开来会比较eye candy。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/151763

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX