整洁代码法则:
大法一:变量的名称及方法的注意
1、使用const定义常量,切勿使用var,那不是常量会变的。
2、功能类似的变量名采用统一的命名风格。
//反例:请求数据信息:
getUserInfo();
getClientData();
getCustomerRecord();
//都是请求数据,有的用info有的用data,最后使用下方命名
getUser();
getClient();
getCustomer();
3、使用易于检索的名称
我们阅读的代码要远远多于我们写的代码,变量名变得晦涩难懂真的是一种糟糕透顶的体验。
//反例
// 525600 是什么?
for (var i = 0; i < 525600; i++) {
runCronJob();
}
//正例
var MINUTES_IN_A_YEAR = 525600;
for (var i = 0; i < MINUTES_IN_A_YEAR; i++) {
runCronJob();
}
4、不要绕弯子,显示优于隐式。
//反例
var locations = ['Austin', 'New York', 'San Francisco'];
locations.forEach((l) => {
doStuff();
doSomeOtherStuff();
...
...
...
// l是什么?
dispatch(l);
})
//正例
var locations = ['Austin', 'New York', 'San Francisco'];
locations.forEach((location) => {
doStuff();
doSomeOtherStuff();
...
...
...
//location 相对于 l 来说更加的清晰明了
dispatch(location);
});
5、避免重复描述。当类/对象名有意义时,对其变量名就不要再次重复。
//反例
var Car = {
carMake: 'Honda',
carModel: 'Accord',
carColor: 'Blue'
};
//正例
var Car = {
Make: 'Honda',
Model: 'Accord',
Color: 'Blue'
};
6、避免无意义的判断
//反例
function createMicrobrewery(name) {
var breweryName;
if (name) {
breweryName = name;
} else {
breweryName = 'Hipster Brew Co.';
}
}
//正例
function createMicrobrewery(name) {
var brewerName = name || 'Hipster Brew Co.';
}
大法二:函数
1、函数参数最好保持在理想状态(不超过两个)
限制函数参数的数量将非常有助于我们在测试函数时的方便,我们的测试将会更加的有效。
对于JavaScript来说,定义一个对象非常方便,我们可以使用一个对象将变量进行一个封装,当参数过多时不妨试试对象。
//反例
function createMenu(title, body, buttonText, cancellable) {
...
}
//正例
var menuConfig = {
title: 'Foo',
body: 'Bar',
buttonText: 'Baz',
cancellable: true
}
function createMenu(menuConfig) {
...
}
2、函数功能单一性
为啥要单一性,因为功能不单一的函数很难重构、测试和理解。功能单一的函数叫代码看起来更加的干净。
//反例
function emailClients(clients) {
clients.forEach(client => {
let clientRecord = database.lookup(client);
if (clientRecord.isActive()) {
email(client);
}
});
}
//正例
//可能你觉得这样很繁琐,明明一个函数可以解决的问题,最终却变成了三个,
//但是当你的函数出了问题之后,比较一下是不是相对上边集成高的代码下边的更加清晰。
function emailClients(clients) {
clients.forEach(client => {
emailClientIfNeeded(client);
});
}
function emailClientIfNeeded(client) {
if (isClientActive(client)) {
email(client);
}
}
function isClientActive(client) {
let clientRecord = database.lookup(client);
return clientRecord.isActive();
}
3、函数名应该明确他的功能
//反例
function dateAdd(date, month) {
// ...
}
let date = new Date();
// 很难理解dateAdd(date, 1)是什么意思
dateAdd(date, 1);
//正例
//这个名字你是不是就知道你增加的是月份了!
function dateAddMonth(date, month) {
// ...
}
let date = new Date();
dateAddMonth(date, 1);
4、一定要移除重复的代码
永远、永远、永远不要在任何循环下有重复的代码。
重复代码的存在毫无意义,且潜在风险极大。重复的代码意味着逻辑变化时需要对不止一处进行修改。JS 弱类型的特点使得函数拥有更强的普适性。好好利用这一优点吧。
//反例
function showDeveloperList(developers) {
developers.forEach(developer => {
var expectedSalary = developer.calculateExpectedSalary();
var experience = developer.getExperience();
var githubLink = developer.getGithubLink();
var data = {
expectedSalary: expectedSalary,
experience: experience,
githubLink: githubLink
};
render(data);
});
}
function showManagerList(managers) {
managers.forEach(manager => {
var expectedSalary = manager.calculateExpectedSalary();
var experience = manager.getExperience();
var portfolio = manager.getMBAProjects();
var data = {
expectedSalary: expectedSalary,
experience: experience,
portfolio: portfolio
};
render(data);
});
}
//正例
function showList(employees) {
employees.forEach(employee => {
var expectedSalary = employee.calculateExpectedSalary();
var experience = employee.getExperience();
var portfolio;
if (employee.type === 'manager') {
portfolio = employee.getMBAProjects();
} else {
portfolio = employee.getGithubLink();
}
var data = {
expectedSalary: expectedSalary,
experience: experience,
portfolio: portfolio
};
render(data);
});
}
5、使用Object.assign设置默认对象
//反例
var menuConfig = {
title: null,
body: 'Bar',
buttonText: null,
cancellable: true
}
function createMenu(config) {
config.title = config.title || 'Foo'
config.body = config.body || 'Bar'
config.buttonText = config.buttonText || 'Baz'
config.cancellable = config.cancellable === undefined ? config.cancellable : true;
}
createMenu(menuConfig);
//正例
var menuConfig = {
title: 'Order',
// User did not include 'body' key
buttonText: 'Send',
cancellable: true
}
function createMenu(config) {
config = Object.assign({
title: 'Foo',
body: 'Bar',
buttonText: 'Baz',
cancellable: true
}, config);
// config now equals: {title: "Order", body: "Bar", buttonText: "Send", cancellable: true}
// ...
}
createMenu(menuConfig);
6、不要使用标记(Flag)作为参数
使用Flag的话一般意味着函数的单一性已经被破坏。此时应该考虑对函数进行再次划分。
//反例
function createFile(name, temp) {
if (temp) {
fs.create('./temp/' + name);
} else {
fs.create(name);
}
}
//正例
function createTempFile(name) {
fs.create('./temp/' + name);
}
----------------------------
function createFile(name) {
fs.create(name);
}
以上内容只是一小部分。学习大佬翻译得来,详细可链接github
代码整洁之道
没写过几篇,还请多多指教!!!