1.数据类型重构
1. 使用具名常量代替神秘数值
使用常量来代替直接使用数值,可以让代码更具可读性,可扩展性
//传入int类型的半径,计算半径对应的圆的周长
float GetPerimeterByRadius(int radius){
return 3.14 * 2 * radius;
}
//传入int类型的半径,计算半径对应的圆的面积
float GetPerimeterByRadius(int radius){
return 3.14 * radius * radius;
}
假如现在要把π 具体到小数点后4位,则需要把所有3.14改成3.1415,也就是说你需要修改N个地方的代码,但是如果你“使用常量代替数值”,使用PI来代替3.14,其他的地方只要拿到这个PI,那么,下次修改的时候,你只需要改这个地方就好了
// PI = 3.1415 此处不具体到在哪里定义π了
//传入int类型的半径,计算半径对应的圆的周长
float GetPerimeterByRadius(int radius){
return 2 * PI * radius;
}
//传入int类型的半径,计算半径对应的圆的面积
float GetPerimeterByRadius(int radius){
return PI * radius * radius;
}
2.用更明确或者更准确的名字来命名变量
使用准确的名字来代表变量,可以让程序员不需要在具体了解这个变量是用来做什么的,从哪里来的
3.用函数来代替表达式
当其它地方有需要用某个计算方式求值的时候,可以把它改成函数,直接调用函数计算值,不仅能使代码读起来简单,还更利于扩展,参照本文第 1 个例子的PI,只是这里是替换方法
float GetPerimeterByRadius(int radius){
return 2 * PI * radius;
}
4.将多用途变量转化为多个单一用途变量
减少变量涉及到的其它用途,避免相互之间造成影响,在使用变量前的位置声明初始化变量
5.使用局部变量,实现局部用途,而不是直接使用参数
意思是说,你传进去的参数不要直接用(修改它的值,读取是可以的),声明一个临时变量,把参数的值赋值给它,然后使用这个临时变量
//错误例子
float GetPerimeterByRadius(int radius){
//需求:偷偷让半径加1
radius += 1;//不能直接使用
return 2 * PI * radius;
}
//正确例子
float GetPerimeterByRadius(int radius){
//需求:偷偷让半径加1
int tempRadius =radius + 1;//临时变量存储
return 2 * PI * tempRadius ;
}
2.语句级重构
1.分解布尔表达式,将复杂布尔表达式转化成命名准确的布尔函数
此处的意思是把布尔表达式分解,使其每个布尔值都能更具体的表现出来
//判断是否要谈恋爱
if( 帅 或 高 或 富 ){
//和他谈恋爱
}else{
//你是好人,但是我们不合适
}
//按照标题改进:
bool 条件好 = 帅 或 高 或 富 ;
if( 条件好 ){
//和他谈恋爱
}else{
//你是好人,但是我们不合适
}
闲话:中英混编举例好像挺爽的
2.合并条件语句不同,部分中的重复代码片段
3.方法、函数级重构
1.提取子程序或者方法
与 1.3 用函数来代替表达式 类似
2.参数的增加和删除、合并
增:当传入的数据增加的时候,可以更方便执行代码、理顺逻辑,不妨多添加一个参数
删:当传入的参数并没有用到的时候,考虑一下要不要把它删了
合并:当传入的参数可以合并(构成一个结构体或类),可以考虑把它们合并起来,传参数的时候只需要传一个进去就好了
3.将函数的操作区分开来,避免在一个函数中进行一种操作,然后又进行另一种操作
一个函数,应当只进行一种操作,在一个函数内进行过多的处理,会混淆其作用;
简而言之:搞不懂它在做什么
//规范示例
Data data = GetDataById(id); //只读数据
Result result = GetResultByData(data); //解析数据
print(result);
4. 类重构
使用不多,此处暂不做