重构代码之重新组织函数

背景

有时很困惑如何才能写出完美、优雅、可读性高、可扩展性高的代码,删除冗余的代码,让其更精简~每次声明,每次调用都能发挥自身最大的价值。一本重构之书大大的解决了当前的困惑,今天介绍重构代码之重新组织函数9点内容,终身受用~

关于函数存在的糟糕代码习惯

  • 重复的代码
  • 过长的函数(偶见看见过优秀的代码一个函数不超过20行)
  • 过长的参数列表
  • 过多的使用switch,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
// 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// before
if(a.indexOf('mac') > -1 && b.indexOf('ie')>-1 && resize > 0){
// do something
}


// -------------------
// 优化后
// after
var hasMac = a.indexOf('mac') > -1;
var isIe = b.indexOf('ie') >-1 ;
var isResize = resize > 0;
if(hasMac && isIe && isResize){
// do something
}

分解临时变量

每次赋值给与一定的含义,不能重复赋值,除非是结果性的值

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();
}

小结

编码在让机器正常运行的同时,更需要让其拥有扩展性、可读性~优雅的编码

坚持原创技术分享,您的支持将鼓励我继续创作!