【编程规范】命名变量的艺术

There are only two hard things in Computer Science: cache invalidation and naming things. — Phil Karlton

给各种东西命名着实有难度,但合理地命名得到的回报是值得我们付出心思的。你是否曾经见过类似这种代码?

const convertObj = (x, y, z) => {
    const k = Object.keys(x);
    return k.map((key) => {
        return {
            [y]: key,
            [z]: x[key],
        }
    });
}

这段代码究竟是干啥的?一行一行地读,你确实能读懂,但若你合理地给变量命名,那阅读起来就轻松多了。

好的变量名极为重要,特别是动态类型语言(比如 javascript),他们没有类型定义来帮助你理解变量。可是,即使是静态类型语言,也需要使用好的命名习惯,对提高代码可阅读性有很大的帮助。

我会分享这些年我自己总结的一些通用规则,然后根据不同类型,用一些例子来分析。就先从数组开始吧。

  • 数组

数组是一个可迭代列表,通常存储相同类型数据。既然他们包含多个值,复数化变量名就很合理

// 差劲
const fruit = ['apple', 'banana', 'cucumber'];
// 一般
const fruitArr = ['apple', 'banana', 'cucumber'];
// 不错
const fruits = ['apple', 'banana', 'cucumber'];
// 优秀 - "names" 表明是 字符串
const fruitNames = ['apple', 'banana', 'cucumber'];
// 优秀
const fruits = [{
    name: 'apple',
    genus: 'malus'
}, {
    name: 'banana',
    genus: 'musa'
}, {
    name: 'cucumber',
    genus: 'cucumis'
}];
  • 布尔值

布尔值只有两个值,true 或 false,既然如此,使用像 is,has,can 这种前缀可以帮助阅读者推断出这个变量的类型

// 差劲
const open = true;
const write = true;
const fruit = true;
// 不错
const isOpen = true;
const canWrite = true;
const hasFruit = true;

那如果是断言函数呢(返回 boolean 的函数),当我们命名函数后,命名变量会有点麻烦

const user = {
    fruits: ['apple']
}
const hasFruit = (user, fruitName) => (
    user.fruits.includes(fruitName)
);
// 该如何命名返回的布尔值?
const x = hasFruit(user, 'apple');

我们不能把名字取为 hasProjectPermission,因为我们已经把名字给了函数。这种情况下,我喜欢给断言加个前缀,check 或 get

const checkHasFruit = (user, fruitName) => (
    user.fruits.includes(fruitName)
);
const hasFruit = checkHasFruit(user, 'apple');
  • 数字

对于数字,考虑一些能描述数字的词语,比如 maximum, minimum, total

// 差劲
const pugs = 3;
// 不错
const minPugs = 1;
const maxPugs = 5;
const totalPugs = 3;
  • 函数

函数名字应该使用一个动词加名词组合。当函数是在一些资源上执行动作,函数的名字应该要反映出这种意图。一个好的命名格式是遵循 动作+资源,比如 getUser

// 差劲
userData(userId)
userDataFunc(userId)
totalOfItems(items)
// 不错
getUser(userId);
calculateTotal(item)

另外,一个常见的习惯是在转换数值时,在函数名前加前缀 to

// I like it!
toDollars('euros', 20);
toUppercase('a string');

另一个常见的模式是我喜欢在遍历数组时,当函数内接收一个参数,使用数组名字的单数形式

// 差劲
const newFruits = fruits.map(x => {
    return doSomething(x);
});
// 不错
const newFruits = fruits.map(fruit => {
    return doSomething(fruit);
});
  • 总结

这些命名习惯也不是全然正确,但是比起一贯地命名风格,你如何命名变量会显得不重要些。假如你一直保持着一贯的命名规范,你的代码库会变得更加容易理解,下个开接手发人员能更懂你写的东西

如果你有更好的命名习惯,请在评论区留言互相交流。

原文链接:https://hackernoon.com/the-art-of-naming-variables-52f44de00aad

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值