前几天和一个朋友聊天时说:我有强迫症,每次看到不符合自己审美的代码时,总想重构一下。朋友的观点与大多数人相仿,程序只要满足要求,运行正确就可以。
在现实的工作中一样,每当看到一段优美且高效的代码,我总是喜欢多看几遍,满心的享受。但是我们产品中的太多代码让我这个代码洁癖“患者”看了非常的烦躁:
1. 随便一个源文件都是上百行的函数,有些甚至超过500行(含空行和注释)。
2. 大量没有必要的临时变量定义。
3. 习惯性的把所有变量声明定义放到函数前面,一些大函数甚至超过20行都是函数局部变量的声明和定义。想想看,在第一个异常检查之后程序返回,而前面定义的十几个变量变得毫无价值。
4. 功能相仿的重复代码。
诸如此类的代码问题,给程序维护带来无尽的风险,而大多数技术管理者却认为代码重构根本毫无必要,甚至很多人认为只要设计文档写好,代码符合文档要求,顺利通过公司的各种质量评审,这段代码就最好不要动。要命的是,很多大型软件,很多团队共同开发,团队A要在团队B开发的代码中修改,为了省事,根本不考虑重构,甚至函数都不愿意增加一个,任由代码行数累加。
哎,如果我是一个技术管理者,我希望可以把敏捷中对于代码质量的要求贯彻和执行。程序开发者应该把自己看做一个追求极致的工匠,而不是一个累代码的民工。
之前完整的看了老罗的手机发布会,他最后一句话:我不是为了输赢,我就是认真。我当时真的打心底里感动,不管老罗的这次创业能否颠覆国内的手机市场,仅凭他的工匠精神,衷心的祝福他和他的公司取得成功,工匠精神配得上一次成功。
为了说明这个问题,我用一段代码重构结束这篇牢骚。
原代码:
/* 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;
}
这里并不是说原来的代码不好,仅仅是为了做说明之用。
有些重构并不一定可以减少总体的代码行数,但是可以改善代码的可读性和可重用性。假设上面的代码时作为API接口,具体的实现函数声明为static,仅仅对外开放FindMax函数声明。代码的开放封闭原则,应该在最初编码的时候有一个清晰和严格的标准。
重构后的代码:
//findMax.h
#ifndef _FIND_MAX_H_
#define _FIND_MAX_H_
int FindMax (int n, ...);
#endif
//findMax.cpp
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
#include <iostream>
#include "findMax.h"
using namespace std;
static int getTheLargest(va_list vl, int n)
{
int val;
int largest =0;
for (int i=0;i<n;i++)
{
val=va_arg(vl,int);
largest=(largest>val)?largest:val;
}
va_end(vl);
return largest;
}
int FindMax (int n, ...)
{
va_list vl;
va_start(vl,n);
return getTheLargest(vl, n);
}
//va_list_example.cpp
#include <stdio.h> /* printf */
#include <stdlib.h>
#include "findMax.h"
int main()
{
printf ("The largest value is: %d\n",FindMax (7, 702,822,631,834,892,104,772));
system("PAUSE");
}
控制台输出:
The largest value is: 892
Press any key to continue . . .
PS:
最近两个月一直没有更新博客,一方面工作确实太忙,另一方面花了很多时间在做个人的微信工作号:瑜伽分享汇。希望喜欢瑜伽的朋友们,可以关注。