您的位置:首页 > 编程语言

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

2016-03-04 19:02 411 查看

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.将函数一分为二,分成两个函数
getFinishedProduct
getUnFinishedProduct


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. 总结

准确地对变量、函数命名

不要有重复逻辑的代码

函数的行数不要超过20行,这里的20行只是个大概,并不一定是这个数字

减少嵌套
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: