最近致力于改善团队质量,原来说过,真正去看代码的时候让我“惊 ”喜连连,惊的可不是一点半点。
对照重构中的很多经典“bad smell”,我截取产品中的典型代码,发在内部讨论组上,
分享在这里,看有没有人感兴趣:
魔鬼数字 , magic number 。
出现频率: 五颗星
杀伤力: 四颗星
预防难度: 两颗星
魔鬼数字的定义:
直接写死在程序代码中,且不是用来给变量赋值的数字。
例如:
int itemCount=10; // 这可以认为不是魔鬼数字 ,但应该有注释
int itemSize=5; // 这可以认为不是魔鬼数字 ,但应该有注释
// 一系列处理逻辑后
if ((storageManager.getCapacity() - itemCount*itemSize) < 1024){ //1024 是魔鬼数字
storageManager.expandCapacityBy(512); //512 是魔鬼数字
}
魔鬼数字的危害:
魔鬼数字不会带来程序逻辑的错误,它主要影响 代码可读性,读者看到的数字无法理解其含义,从而难以理解程序的意图。
当程序中出现的魔鬼数字量过多时,代码的可维护性将会急剧下降,代码变得难以修改,并容易引入错误。
解决方案:
1、 将魔鬼数字定义为常量
例如,将:
storageManager.expandCapacityBy(512);
改成:
public static final int CAPACITY_INCREASE_STEP=512;
storageManager.expandCapacityBy(CAPACITY_INCREASE_STEP);
2、 将使用魔鬼数字的逻辑封装为方法,增加注释
例如,将:
if ((storageManager.getCapacity() - itemCount*itemSize) < 1024){
改成:
if ( storageManager.needIncreaseCapacity(itemCount,itemSize)){
boolean storageManager.needIncreaseCapacity(int itemCount,int itemSize){
return (storageManager.getCapacity() - itemCount*itemSize) < 1024;// 当剩余容量小于 1024 字节时,需要扩充空间。
}
魔鬼数字真实片段:
1 、我相信,如下代码换一个人来接手,肯定很晕
2、 下面的代码做了剪裁,但依然很有震撼力,试问,此码既出,谁敢接手?