首页 > 技术文章 > 程序猿与工匠精神

blfshiye 2014-10-25 20:28 原文

前几天和一个朋友聊天时说:我有强迫症,每次看到不符合自己审美的代码时,总想重构一下。朋友的观点与大多数人相仿,程序仅仅要满足要求,执行正确就能够。
在现实的工作中一样,每当看到一段优美且高效的代码,我总是喜欢多看几遍,满心的享受。可是我们产品中的太多代码让我这个代码洁癖“患者”看了很的烦躁:
1. 随便一个源文件都是上百行的函数,有些甚至超过500行(含空行和凝视)。
2. 大量没有必要的暂时变量定义。
3. 习惯性的把全部变量声明定义放到函数前面,一些大函数甚至超过20行都是函数局部变量的声明和定义。想想看,在第一个异常检查之后程序返回,而前面定义的十几个变量变得毫无价值。
4. 功能相仿的反复代码。

诸如此类的代码问题,给程序维护带来无尽的风险,而大多数技术管理者却觉得代码重构根本毫无必要,甚至非常多人觉得仅仅要设计文档写好,代码符合文档要求,顺利通过公司的各种质量评审,这段代码就最好不要动。要命的是,非常多大型软件,非常多团队共同开发,团队A要在团队B开发的代码中改动,为了省事,根本不考虑重构,甚至函数都不愿意添加一个,任由代码行数累加。

哎,假设我是一个技术管理者,我希望能够把敏捷中对于代码质量的要求贯彻和运行。程序开发人员应该把自己看做一个追求极致的工匠,而不是一个累代码的民工。

之前完整的看了老罗的手机公布会,他最后一句话:我不是为了输赢,我就是认真。我当时真的打心底里感动,无论老罗的这次创业是否能颠覆国内的手机市场,仅凭他的工匠精神,衷心的祝福他和他的公司取得成功,工匠精神配得上一次成功。

为了说明这个问题,我用一段代码重构结束这篇牢骚。

原代码:
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;
}

这里并非说原来的代码不好,不过为了做说明之用。
有些重构并不一定能够降低整体的代码行数,可是能够改善代码的可读性和可重用性。如果上面的代码时作为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:
近期两个月一直没有更新博客,一方面工作确实太忙,还有一方面花了非常多时间在做个人的微信工作号:瑜伽分享汇。希望喜欢瑜伽的朋友们,能够关注。







推荐阅读