C语言开发提高代码可读性的细节,不要让其他阅读者看你的代码越看越高血压

在开发过程中,不管是你自己开发还是阅读别人的代码,一些让人看不懂的代码总是让人高血压,还有就是不良的代码习惯会让人在排查问题过程中困难加倍,当然了,这里不排除你是防御性编程。

我在这里也总结了一下在开发过程中遇到的典型让人高血压的代码,还有可以提高代码质量的一些细节。

一、让人高血压的代码

假如说这段代码是你之前某个同事留下来传承给你的代码,要让你维护,就请问你能看得懂是什么意思么。最多只能知道这是一段关于步骤操作的代码,然后就不知道他到底表达的是什么意思了。

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)

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值