在开发过程中,不管是你自己开发还是阅读别人的代码,一些让人看不懂的代码总是让人高血压,还有就是不良的代码习惯会让人在排查问题过程中困难加倍,当然了,这里不排除你是防御性编程。
我在这里也总结了一下在开发过程中遇到的典型让人高血压的代码,还有可以提高代码质量的一些细节。
一、让人高血压的代码
假如说这段代码是你之前某个同事留下来传承给你的代码,要让你维护,就请问你能看得懂是什么意思么。最多只能知道这是一段关于步骤操作的代码,然后就不知道他到底表达的是什么意思了。
int l_iStep = 0;
.....
//中间过程l_iStep被赋值
.....
if(l_iStep == 0)
{
machine0();
}
else if(l_iStep == 1)
{
machine1();
}
else if(l_iStep == 2)
{
machine2();
}
二、高血压代码中存在的问题-神秘数字
1、使用神秘数字
什么叫做神秘数字?凡是代码中出现没有注释也没有相关宏定义说明的数字,都可以叫做神秘数字,这种神秘数字仅仅能被一开始写这个神秘数字的人理解,而且可能这个人过了半年后再看都不知道是什么意思了。
虽然神秘数字也可以作为“防御性编程”的一种,但是不建议大家用。
2、优化方法:使用枚举或者宏定义
最上面的高血压代码,如果用枚举的话,可以这么优化。
具体是定义一个枚举来替换代码中0、1、2这些让人看不懂的神秘数字。并且在条件判断以及变量定义的时候,也可以使用枚举来替换。
这里用宏定义也没问题,但是我更推荐用枚举,因为使用枚举来做赋值以及条件判断,如果你赋值 超过枚举范围,编译器是可以检查出来报错的,这样有减少赋值不对但是自己没发现的风险。
enum emStep
{
emStep_start = 0,
emStep_run = 1,
emStep_stop = 2
};
emStep l_iStep = 0;//用emStep替换int,可以将l_iStep的赋值范围限定在0-2
.....
//中间过程l_iStep被赋值
.....
if(l_iStep == emStep_start)
{
machine0();
}
else if(l_iStep == emStep_run)
{
machine1();
}
else if(l_iStep == emStep_stop)
{
machine2();
}
三、高血压代码中存在的问题-函数命名不清晰
1、函数命名不清晰
machine0();machine1();machine2();函数命名不清晰的问题也很常见的,基本上没注释根本不知道是什么意思,而且很多人都不喜欢写注释。
基本也是只有命名的人能看懂,其他人看不懂,说句好听的,可能命名的人在“防御性编程”吧。
2、优化方法:使用关键英文单词命名函数
将machine0修改为machineStart, machine1修改为machineRun,machine2修改为machineSop。这样子在函数命名有Start、Run、Stop这些关键英文单词,其他阅读者也大致知道这个函数是执行开始、运行或者停止功能了。
enum emStep
{
emStep_start = 0,
emStep_run = 1,
emStep_stop = 2
};
emStep l_iStep = 0;//用emStep替换int,可以将l_iStep的赋值范围限定在0-2
.....
//中间过程l_iStep被赋值
.....
if(l_iStep == emStep_start)
{
machineStart();
}
else if(l_iStep == emStep_run)
{
machineRun();
}
else if(l_iStep == emStep_stop)
{
machineStop();
}
另外函数命名不要用拼音,谢谢了。
四、高血压代码中存在的风险-条件判断数值在右边
3、条件判断数值在右边
并不是说if(l_iStep == emStep_start)这个条件判断这样写有问题,只是说这样会有风险。
有可能是在写条件判断过程中,不小心写成(l_iStep = emStep_start)。
这样子条件判断逻辑就从l_iStep是否等于emStep_start,变成了l_iStep被赋值成emStep_start,就违背我们的初衷了,而且这样写编译器还不会报错,不会提示我们有风险,导致出问题的时候排查难度大大增加。
2、优化方法:条件判断数值在左边
if(emStep_start == l_iStep),条件判断中数值在左边有个好处,就算你写成了emStep_start = l_iStep(相当于0 = l_iStep),在编译时编译器会报错,这样你就能在编译阶段规避风险。
enum emStep
{
emStep_start = 0,
emStep_run = 1,
emStep_stop = 2
};
emStep l_iStep = 0;//用emStep替换int,可以将l_iStep的赋值范围限定在0-2
.....
//中间过程l_iStep被赋值
.....
if(emStep_start == l_iStep)
{
machineStart();
}
else if(emStep_run == l_iStep)
{
machineRun();
}
else if(emStep_stop == l_iStep)
{
machineStop();
}
五、注释
变量与结构体的声明最好加上注释,以及关键逻辑代码点加注释。
六、可有可无的优化点
以上这段代码还可以用switch条件判断来代替if条件判断语句。
当前这种情况限于需要判断单一变量多个值的时候,这种时候if用switch替换可以提高执行效率。
enum emStep
{
emStep_start = 0,
emStep_run = 1,
emStep_stop = 2
};
emStep l_iStep = 0;//用emStep替换int,可以将l_iStep的赋值范围限定在0-2
.....
//中间过程l_iStep被赋值
.....
switch(l_iStep)
{
case emStep_start:
machineStart();
break;
case emStep_run:
machineRun();
break;
case emStep_stop:
machineStop();
break;
default:
break;
}//end switch(l_iStep)