提高代码质量:如何编写函数

1. 命名

1. 帕斯卡命名法

  • 帕斯卡命名法简单地说就是:多个单词组成一个名称时,每个单词的首字母大写。比如:
class Person{}
  • 这种命名法常用于类名定义

2. 驼峰命名法

  • 驼峰命名法和帕斯卡命名法很类似,多个单词组成一个名称时,第一个单词全部小写,后面单词首字母大写。比如:
var sendMessage = function () {};
var calculatePrice = function () {};
  • 驼峰命名法一般用于字段、局部变量、函数参数,属性等等。

2. 什么时候命名

  • 当你无法命名一个函数时,应该分析一下,这个函数的编写是否科学,有什么办法可以去优化它。

3. 不要采用太抽象广泛的单词

比如get这个单词,大家都知道这个是获取数据的,但是每一种方式都用get就有点太抽象了,以下具体情况具体分析下,列举了一些例子,当然还是要多阅读优秀的源代码:

1 简单的返回数据

function getFullName(){}

2. 从远程获取数据

function fetchPerson(){}

3. 从本地存储加载数据

function loadPerson(){}

4. 通过计算获取数据

function calculateTotal(){}

5. 从数组中查找数据

function findName($arr){}

6. 从一些数据生成或得到数据

function createSth(data){}
function buildSth(data){}
function parseSth(data){}

4. 一些常用的对仗词

add/remove           increment/decrement          open/close
begin/end            insert/delete                show/hide
create/destory       lock/unlock                  source/target
first/last           min/max                      star/stop
get/put              next/previous                up/down     
get/set              old/new

5. 根据不同项目和需求制定好命名规则

  • 比如我们通常采用的命名规则是动宾结构,也就是动词在前,名词在后,但是有一些项目,比如数据接口等项目中,一般都是名词在前,动词在后的形式,例如:
public static Product[] ProductsGet(){};
public static Product[] ProductsDel(){};
public static Customer[] CustomerDel(){};
public static Customer[] CustomerDel(){};
  • 这种的好处是看到前面的名词,比如ProductsGet,就能很快的知道这是产品相关的数据接口。

6. js中的多参数函数的变化

var filterHotel = function (city, checkIn, checkOut, price, star, position, wifi, meal, sort, pageIndex) {}

参数太长可写成如下形式:

function DatePlace (city, checkIn, checkOut){
    this.city = city;
    this.checkIn = checkIn;
    this.checkOut = checkOut
}
function HotelFeature (price, star, position, wifi, meal){
    this.price = price;
    this.star = star;
    this.position = position;
    this.wifi = wifi;
    this.meal = meal;
}
var filterHotel = function (datePlce, hotelFeature, sort, pageIndex) {};
  • 将多个参数提取成对象了,虽然对象数量增多了,但是函数参数更清晰了,调用起来也更方便了。

7. 尽量不要使用bool类型作为参数

  • 有的时候,我们会写出使用bool作为参数的情况,比如:
var getProduct = function(finished) {
    if(finished){
    }
    else{
    }
}
// 调用
getProduct(true);
  • 如果没有注释,使用者看到这样的代码:getProduct(true),他肯定搞不清楚true是代表什么意思,还要去查看函数定义才能明白这个函数是如何使用的。这就意味着这个函数不够清晰,就应该考虑去优化它。通常有两种方式去优化它:
    • 1.将函数一分为二,分成两个函数getFinishedProductgetUnFinishedProduct
    • 2.将bool转换成有意义的枚举getProduct(ProductStatus)

8. 不要修改输入参数

  • 如果输入参数在函数内被修改了,很有可能造成潜在的bug,而且使用者不知道调用函数后居然会修改函数参数。
  • 正确使用输入参数的做法应该是只传入参数用于函数调用。
  • 如果不可避免地要修改,一定要在注释中说明。

9. 尽量减少代码嵌套

  • 我们平时写if,switch或for语句是常有的事儿,也一定写过多层if或for语句嵌套的情况,如果代码里的嵌套超过3层,阅读起来就会非常困难了。我们应该尽量避免代码嵌套多层,最好不要超过2层。下面我来说说我平时一些减少嵌套的技巧或方法。
  • 如果符合某个条件下可以直接终止函数,则应该将这个条件放在第一位。我们来看看下面的例子。
if(condition1) {
    if(condition2){
        if(condition3){
        }
        else{
            return;
        }    
    }
    else{
        return;
    }    
}
else {
    return;
} 

改写后:

if(!condition1){
    return;
}
if(!condition2){
    return;
}
if(!condition3){
    return;
}
//doSth

这段代码中,我们把condition1等于false的语句提取到前面,直接终止函数,将多层嵌套的if语句重构成只有一层if语句,代码也更清晰了。

注意:一般情况下,我们写if语句会将条件为true的情况写在前面,这也比较符合我们的思维习惯。如果是多层嵌套的情况,应该优先减少if语句的嵌套

10. 总结

  1. 准确地对变量、函数命名
  2. 不要有重复逻辑的代码
  3. 函数的行数不要超过20行,这里的20行只是个大概,并不一定是这个数字
  4. 减少嵌套

猜你喜欢

转载自blog.csdn.net/wjc19911118/article/details/50804882