- 论坛徽章:
- 0
|
最近有几个帖子在批判“垃圾代码”。
垃圾代码这个概念太模糊,不知所云,我暂且理解为冗余代码。
我的观点是,适度的冗余是必要的。
原因很简单,我们不妨考虑完全没有冗余代码的情况,用另一句话说,这样的代码应该是“多一个字罗嗦,少一个字出错”,且上下文之间关联性是最大化的。
这样好吗?不好!尤其是编码初期更是不好!因为这样的代码又脆又硬,说白了就是“禁不住折腾”——没人敢碰。因为代码不可能一次成型不再改动,出于各种原因,代码都可能后来发生变化,而且可能是由不同的人做出变化,如果你的代码牵一发而动全身,后来修改的人会很累不说,还可能引入BUG。
- ...
- ...
- ...
- static int arr[XXX]={0};
- ...
- ...
- ...
- static int somefunction(void)
- {
- ...
- ...
- memset(arr, 0, sizeof(arr));
- for (i=0;i<XXX;++i) {
- ... /* 一段代码,要求arr数组的成员必须都是0 */
- }
- ...
- ...
- }
- ...
- ...
复制代码 分析上例,
全局数组赋初值是不必要的,因为它是static的,没有强定义的需求,这就属于不必要的冗余。
而memset就属于适度冗余,利大于弊。如果不写memset的话,一旦后来有人在memset前面什么地方加入了别的代码,修改了arr的内容,他如果知道下面代码的需求,还是要加上memset的,如果他不知道,后果就未定义了。
另外:
- ...
- ...
- static int somefunction(void)
- {
- ...
- static char buf[XXX];
- ...
- ...
- memset(arr, 0, sizeof(arr));
- snprintf(arr, XXX, FMT, ...);
- ...
- ...
- }
- ...
- ...
复制代码 上面这段代码中的memset是不是冗余就很难说了。也许是无意义的冗余,也可能是绝对必要的代码,必须看清上下文才能判断。
冗余的的代码的确会降低代码执行速度,理应在编码最终完成后清理并重新测试。但是,事实上,编码真的能够最终完成,不再修改吗?这样的代码太少了!!!
即便最终完成了,应不应该清理也要参考oprofile等剖面分析工具的结果,是瓶颈的话,优化,不是瓶颈的话,不必优化。 |
|