前几天和一个朋友聊天时说:我有强迫症,每次看到不符合自己审美的代码时,总想重构一下。朋友的观点与大多数人相仿,程序只要满足要求,运行正确就可以。
在现实的工作中一样,每当看到一段优美且高效的代码,我总是喜欢多看几遍,满心的享受。但是我们产品中的太多代码让我这个代码洁癖“患者”看了非常的烦躁:
1. 随便一个源文件都是上百行的函数,有些甚至超过500行(含空行和注释)。
2. 大量没有必要的临时变量定义。
3. 习惯性的把所有变量声明定义放到函数前面,一些大函数甚至超过20行都是函数局部变量的声明和定义。想想看,在第一个异常检查之后程序返回,而前面定义的十几个变量变得毫无价值。
4. 功能相仿的重复代码。
诸如此类的代码问题,给程序维护带来无尽的风险,而大多数技术管理者却认为代码重构根本毫无必要,甚至很多人认为只要设计文档写好,代码符合文档要求,顺利通过公司的各种质量评审,这段代码就最好不要动。要命的是,很多大型软件,很多团队共同开发,团队A要在团队B开发的代码中修改,为了省事,根本不考虑重构,甚至函数都不愿意增加一个,任由代码行数累加。
哎,如果我是一个技术管理者,我希望可以把敏捷中对于代码质量的要求贯彻和执行。程序开发者应该吧自己看做是艺术家,而不是一个累代码的民工。
为了说明这个问题,我用一段代码重构结束这篇牢骚。为了不至于引起误会,我采用的是www.cplusplus.com的一段小程序,没有对原作者不敬的意思,相反,我非常尊敬这些给开源做出重大贡献的朋友们。
原代码:
http://www.cplusplus.com/reference/cstdarg/va_arg/?kw=va_arg
/* va_arg example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
int FindMax (int n, ...)
{
int i,val,largest;
va_list vl;
va_start(vl,n);
largest=va_arg(vl,int);
for (i=1;i<n;i++)
{
val=va_arg(vl,int);
largest=(largest>val)?largest:val;
}
va_end(vl);
return largest;
}
int main ()
{
int m;
m= FindMax (7,702,422,631,834,892,104,772);
printf ("The largest value is: %d\n",m);
return 0;
}
重构后的代码:
/* va_arg example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
#include <stdlib.h>
int getTheLargest(va_list vl, int n, int* pVarray)
{
int val;
int largest =0;
for (int i=0;i<n;i++)
{
val=va_arg(vl,int);
largest=(largest>val)?largest:val;
pVarray[i] = val;
}
va_end(vl);
return largest;
}
int findMax (char a, int n, ...)
{
int* pVarray = (int*)malloc(sizeof(int)*n);
va_list vl;
va_start(vl,n);
return getTheLargest(vl, n, pVarray);
}
int main()
{
printf ("The largest value is: %d\n",
FindMax (‘a‘, 2, 702,822,631,834,892,104,772));
system("PAUSE");
}
控制台输出:
The largest value is: 822
Press any key to continue . . .
PS:
最近两个月一直没有更新博客,一方面工作确实太忙,另一方面花了很多时间在做个人的微信工作号:瑜伽分享汇。希望喜欢瑜伽的朋友们,可以关注。
程序员,做艺术家不做码农