浅谈JavaScript 代码整洁之道(3)

不好:

function createMenu(title, body, buttonText, cancellable) {
 ...
}

好:

var menuConfig = {
 title: 'Foo',
 body: 'Bar',
 buttonText: 'Baz',
 cancellable: true
}

function createMenu(menuConfig) {
 ...
}

一个函数只做一件事

目前这是软件工程中最重要的原则。如果函数做了较多的事情,它就难以组合、测试和推测。当你让函数只做一件事情的时候,它们就很容易重构,而且代码读起来也会清晰得多。你只需要遵循本指南的这一条,就能领先于其他很多开发者。

不好:

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

函数名称要说明它做的事

不好:

function dateAdd(date, month) {
 // ...
}

let date = new Date();

// 很难从函数名了解到加了什么
dateAdd(date, 1);

好:

function dateAddMonth(date, month) {
 // ...
}

let date = new Date();
dateAddMonth(date, 1);

函数应该只抽象一个层次

如果你有多个层次的抽象,那么你的函数通常做了太多事情,此时应该拆分函数使其易于复用和易于测试。

不好:

function parseBetterJSAlternative(code) {
 let REGEXES = [
 // ...
 ];

 let statements = code.split(' ');
 let tokens;
 REGEXES.forEach((REGEX) => {
 statements.forEach((statement) => {
  // ...
 })
 });

 let ast;
 tokens.forEach((token) => {
 // lex...
 });

 ast.forEach((node) => {
 // parse...
 })
}

好:

function tokenize(code) {
 let REGEXES = [
 // ...
 ];

 let statements = code.split(' ');
 let tokens;
 REGEXES.forEach((REGEX) => {
 statements.forEach((statement) => {
  // ...
 })
 });

 return tokens;
}

function lexer(tokens) {
 let ast;
 tokens.forEach((token) => {
 // lex...
 });

 return ast;
}

function parseBetterJSAlternative(code) {
 let tokens = tokenize(code);
 let ast = lexer(tokens);
 ast.forEach((node) => {
 // parse...
 })
}

删除重复代码

任何情况下,都不要有重复的代码。没有任何原因,它很可能是阻碍你成为专业开发者的最糟糕的一件事。重复代码意味着你要修改某些逻辑的时候要修改不止一个地方的代码。JavaScript 是弱类型语句,所以它很容易写通用性强的函数。记得利用这一点!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/417.html