1、什么是魔法数
魔法数主要是指代码中莫名其妙出现的数字,这些数字只有通过分析相关的业务逻辑才能够知道该数字的具体作用,这种现象就是魔法数,可能还会被叫做魔法值。
这里需要注意,魔法值或者魔法数不仅仅指的的是数字,还包括字符串等,只要是没有任何定义,直接莫名其妙出现的值都可以被称为魔法数
2、魔法数有什么危害
最能体现该点的就是魔法数会导致代码的可维护性极差,之所以这样讲就是因为该数字调用频繁且没有注释,代码可阅读性极差,想对的可维护性也会变得极差。
这里通过两段代码进行对比,首先设定场景,这里需要打印宿舍内外的温度以及宿舍的湿度,且室内温度需要在原有温度的值上增加10度。
QStringList strList_tem<<"dormitory_humi"<<"dormitory_inside_tem"<<"dormitory_outside_tem"
int i_num=0;//假设原有值为0
for(int i=0;i<strList_tem.size();i++)
{
if(1==i)
{
i_num=i_num+20;
qDebug()<<i_num;
}
else
{
i_num=i_num+10;
qDebug()<<i_num;
}
}
首先这串代码大致实现了场景的要求,但是代码的可读性高吗?并不高!首先优秀的代码可以在不看场景描述的情况下就可以大致的的理解这串代码是什么作用,而这串代码如果不看场景,或许根本没办法理解这里为什么要在等于1的时候加20。
下面再看第二串代码:
#define DORMITORY_INSIDE_INDEX (1) // 宿舍内部在列表中的索引
#define TEM_NUM (10) // 室外及湿度所需增加的值
#define TEM_NUM2 (20) // 室内温度所需增加的值,需比室外大10
...
...
QStringList strList_tem<<"dormitory_humi"<<"dormitory_inside_tem"<<"dormitory_outside_tem"
int i_num=0;//假设原有值为0
for(int i=0;i<strList_tem.size();i++)
{
if(DORMITORY_INSIDE_INDEX==i)
{
i_num=i_num+TEM_NUM2;
qDebug()<<i_num;
}
else
{
i_num=i_num+TEM_NUM;
qDebug()<<i_num;
}
}
这串代码相比于第一串代码最大的区别就是将一些莫名其妙的数字宏定义,这样做最大的好处就是提高了代码的可阅读性,以及,后续维护性极大程度的提高!之所以这样说是因为这里仅是建了一个很简单的应用场景,真正的项目中可能这个数字不止出现在一个地方,还可能出现在很多的地方,这个时候后续需要修改的时候就需要挨个检查,效率极低且容易忽略某些数字。
3、魔法数修改的几种方式
主要是变量的几种定义方式,不过多的解释,只说一下可以使用的方法。
1.宏定义;
2.const常量;
3.枚举;
4.作用域枚举(C++11及以后的版本才有);
5.枚举作用域声明(C++20及以后的版本采用)。
4、什么是注释
注释就是对代码的解释和说明。目的是为了让别人和自己很容易看懂,一看就知道这段代码是做什么用的。正确的程序注释一般包括序言性注释和功能性注释。序言性注释的主要内容包括模块的接口、数据的描述和模块的功能。模块的功能性注释的主要内容包括程序段的功能、语句的功能和数据的状态。
5、怎么做注释
一个好的代码不是每一行都有注释,也不是每个函数都有注释,而是该有的地方有,不该有的地方就没有,具体的要开发者自己判断。但是除此之外,一些注释也有一些比较好的写法:例如某个有返回值的函数,可能部分程序员做注释就是说明这个函数是做什么的。我们需要注意这种做法并不能提高多少代码的可阅读性,对于某些需要返回值的函数,我们就需要使用注释块,在块内说明函数的返回值类型,返回值的作用,简短的说明不要过长。有函数参数的,我们就要说明入参的名称。
这里简单举两个例子:
/*
功能:计算温度总值
入参:温度值1、温度值2
返回值:无
*/
void calNum(int i_num1,int i_num2)
{
int i_all_num=i_num1+i_num2;
}
/*
功能:计算温度总值
入参:温度值1、温度值2
返回值:温度总值
*/
int claNum(int i_num1,int i_num2)
{
int i_all_num=i_num1+i_num2;
return i_all_num;
}
这样注释之后不仅提高了代码的可阅读性,对于代码的后期维护人员也是非常的友好。