很多人做软件开发非常执着于技术本身,希望通过更少的代码解决最多的需求,这个想法本身是没有错的,但是应该有一个前提,就是代码的可维护性比代码的简洁性重要。
如下面一段代码:
void swap(int *x, int *y)
{
*x = *y ^ *x;
*y = *y ^ *y;
*x = *y ^ *y;
}
实现是相当简洁的,效率也不错,但是对于一个没有这个概念的其他程序员来维护这个系统时候,就需要花时间去演算一下这个过程实现了什么。如果采用如下的程序逻辑,则相对来说容易理解得多。
void swap_int( int *x, int *y)
{
int temp_int;
temp_int = *x;
*x = *y;
*y = temp_int;
}
在这里我们在函数名swap之后加上了_int,一方面可以让其他程序员更好理解函数的意义,同时也可以在一个程序用构建如swap_byte、swap_long这些函数,而不至于引起混淆。
下面是摘录一个程序员编写的一个函数,说明似乎是很规范,但是这样千篇一律的只为了构建索引而编制的函数说明有什么意义呢,它并不会为其他程序员提供更多的信息。还有一个问题,函数名,这个简直就是精简啊,但是当他过一段时间再去阅读自己的程序的时候,一样会被弄糊涂的。
/*******************************************
函数名称: InB
功 能: 从D12读出一个字节数据
参 数: 无
返回值 : dat--读出的字节数据
/********************************************/
uchar InB(void)
{
.......
}
1) 在函数说明中,可以说明该函数的程序逻辑、用途、限制等信息。
2) 函数名应该尽可能地长,而不是尽可能短, 如Read_OneByte_From_D12。
下面看两个程序的可读性区别
if(BUSY)
WAIT;
else
SendCmd(RESET);
上面的程序相当简单,下面的程序显得更啰嗦些。
if (D12_IS_BUSY )
WAIT_UNTIL_D12_FREE;
ELSE
Send_Command_To_D12(COMMAND_RESET_D12);
第二段程序的可阅读性明显增强,从代码中变量和函数名称就可以获知程序的适用范围。
虽然书写第二段代码需要的时间比第一段稍微长些,但是书写时间在整个编写程序中占用的时间可以说是微乎其微的。千万不要为了少敲几个字而让程序的阅读性下降。
刚学写程序的时候,有一个天真的概念,就是变量定义太长,会占用更多的程序空间,为了减少软件的尺寸,尽量缩短变量函数名称。后来对于数据的存储和编译有些概念之后才知道,原来无论变量和函数名定义多长,编译后的程序都是占用一样的存储空间。