背景
有时很困惑如何才能写出完美、优雅、可读性高、可扩展性高的代码,删除冗余的代码,让其更精简~每次声明,每次调用都能发挥自身最大的价值。一本重构之书大大的解决了当前的困惑,今天介绍重构代码之重新组织函数9点内容,终身受用~
关于函数存在的糟糕代码习惯
优化方案
提炼函数
把可以通用的方法提取为一个公用的函数
将临时变量内联化
如果一个变量足够简单,推荐使用此方式提高代码阅读,不要一味追求过渡优化。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// before
function getNum(n){
var num = moreThanFive(n); // 优点糟糕
return num ? 1 : 0;
}
function moreThanFive(num){
return num > 5;
}
getNum(6);
// -------------------
// 优化后
// after
function getNum(n){
return moreThanFive(n) ? 1 : 0;
}
function moreThanFive(num){
return num > 5;
}
getNum(6);
以查询取代临时变量
把计算过程变成公用!!!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// before
var basePrice = _quantity * _itemPrice;
if(basePrice > 1000){
return basePrice * 0.95;
}else{
return basePrice * 0.98;
}
// -------------------
// 优化后
// after
if(basePrice()>1000){
return basePrice() * 0.95;
}else{
return basePrice() * 0.98;
}
function basePrice(){
return _quantity * _itemPrice;
}
引入解释性变量
1 | // before |
分解临时变量
每次赋值给与一定的含义,不能重复赋值,除非是结果性的值1
2
3
4
5
6
7
8
9
10// before
var temp = 2 * ( _height + _width );
temp = _height * _width;
// -------------------
// 优化后
// after
var perimeter= 2 * ( _height + _width );
var area = _height * _width;
移除对函数参数的赋值
把参数重新赋值给一个临时变量1
2
3
4
5
6
7
8
9
10
11
12
13// before
function discount(iptvalue, quantity){
if(iptvalue > 50) iptvalue -= 2;
}
// -------------------
// 优化后
// after
function discount(iptvalue, quantity){
var result = iptvalue;
if(iptvalue > 50) result -= 2;
}
以函数对象取代函数
这里的理解是通过构造函数的方式创建一个对象进行优化代码,有点类似于分解这个函数更加颗粒化~1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// before
function discountPrice(){
var primaryBasePrice;
var secondBasePrice;
// .....
function compute(){
}
}
discountPrice();
// -------------------
// 优化后
// after
function DiscountPrice(){
this.primaryBasePrice = primaryBasePrice;
this.secondBasePrice = secondBasePrice;
}
DiscountPrice.prototype.compute = function(){
}
new DiscountPrice().compute();
替换算法
创建变量对象,或者是数组对象,对这个对象进行匹配过滤,减少if-else的操作。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28// before
function findPersonPhoneByName(){
for(let i = 0; i < perosn.length; i++ ){
if(person[i].name === 'luuck'){
return person[i].phone;
}
if(person[i].name === 'moyu'){
return person[i].phone;
}
if(person[i].name === 'sunny'){
return person[i].phone;
}
}
return '';
}
// -------------------
// 优化后
// after
var personName = ['luuck', 'moyu', 'sunny'];
function findPersonPhoneByName(name){
for(let i = 0; i < perosn.length; i++ ){
if(personName.contains(person[i].name)){
return person[i].phone;
}
}
return '';
}
嵌套的条件包装后判断
提高可读性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// before
function getUserVip(){
var result;
if(_isVip7) result = vip(7);
else{
if(_isVip6) result = vip(6);
else {
if(_isVip5) result = vip(5);
else result = vipLow();
}
}
return result;
}
// -------------------
// 优化后
// after
function getUserVip(){
if(_isVip7) return vip(7);
if(_isVip6) return vip(6);
if(_isVip5) return vip(5);
return vipLow();
}
小结
编码在让机器正常运行的同时,更需要让其拥有扩展性、可读性~优雅的编码