编码风格 - 更少的使用变量

August 22 2019 , Category: JavaScript

每一位程序员都有自己的编码风格,在从事编码多年之后,对于这个话题我也有了一些自己的看法和经验。

我们知道,在 JavaScript 中使用『变量』是一种很常见的场景。我们可以用 var, let 或者 const 声明,当然稍微严谨点的说, const 在字面上是用来声明『常量』的。

在接下来的内容中,我将会讨论的一个点是『如何在编码的时候使用更少的变量』– 这是一个非常小的点,但是对于每个人平时的编程工作而言还是比较重要的。

不要在一开始就先给变量赋默认值

我们先来看一段代码:

function getTitleViaType(type) {
  let title = '';
  if (type === 'add') {
    title = 'Add page';
  } else if (type === 'edit') {
    title = 'Edit page';
  }
  return title;
}

上述代码的目的很简单 – 通过入参 type 来获取『标题』。

很多程序员在写代码的时候,习惯于在开始实现某个逻辑的时候先声明一个字面量为空值的「变量」,比如在上述例子中就是一个空字符串 ''

你可以花费 5秒钟的时间去思考下如何优化这个示例的代码。

嗯,我觉得你肯定已经有了非常棒的主意。于我而言,我会将代码修改成如下:

function getTitleViaType(type) {
  if (type === 'add') return 'Add page';
  if (type === 'edit') return 'Edit page';
  return '';
}

正如你看到的那样,我们将函数体从 7 行缩减到了 3 行,更重要的是,这段代码相比之下显得更为简洁和清晰。

使用合适的 API 去避免使用变量

function objToArray(obj) {
  let arr = [];
  Object.keys(obj).forEach(id => {
    arr.push(obj[id]);
  });
  return arr;
}

上述函数的目的是想要将一个 Object 转换成 Array:在每一次 forEach 的循环过程中,一开始初始化为空数组的 arr 会不断增加元素。

但实际上,变量 arr 在这个例子中是相对多余的,我们可以很干脆的将它从代码中移除:

function objToArray(obj) {
  return Object.keys(obj).map(id => {
    return obj[id];
  });
}

没错,将这些代码修改的过程其实非常简单,而且只需要花费很少的时间。但实在是有太多的职业程序员没有在日常的工作中实践这些真理。

混合逻辑的场景

function getGroupIndexArr(plainArr) {
  const rootArr = plainArr.filter(item => item.level === 0);

  const groupArr = [];
  let flag = 0;

  rootArr.forEach(element => {
    groupArr.push({
      key: flag,
      range: element.range
    });

    flag += element.range;
  });

  return groupArr;
}

上述代码的目的就是为了在循环生成新数组的过程中,通过额外的字段进行一个计数操作。因此,这边使用了 groupArrflag 两个『变量』。

但实际上,我们完全可以避免额外的『变量』去实现这个遍历过程。至于具体如何修改,就不再此进行赘述。

其他一些示例

let { duration } = this.props;
if (duration > 800) {
  duration = 800;
}

从入参或者其他地方(上述是从 React 组件的 props 中)获取,然后通过一些判断条件再进行重新赋值,也是一个比较常见的场景。

其实 ESLint 是有规则对入参的修改进行提示的,但仍然无法避免很多类似的编程习惯。

比如上述例子,很显然我们可以通过 Math.min() 来返回需要的值。

总结

本文简单探讨了下如何使用适当的手段,减少日常编程过程中一些使用『变量』的不太优雅的姿势。

值得注意的是,文章中的大部分『不太好』的代码片段都是我从同事们的日常工作中『扣』出来的。

当然,你可能觉得文中的示例都过于简单,但其实也有更为复杂的例子,不过在我看来其中的思想是一模一样的。比如在编写一个函数或者一段逻辑之前,就应该先思考下要使用哪些变量,使用什么方式去实现。这是关乎程序员职业素养的事情,而不是打开编辑器就先声明一个变量 – 之后随机应变。

后续,我会挖掘一些更为有意思的关于『编码风格』的思考,希望对大家的日常工作有所帮助。

支持作者 | 文章采用 CC BY-NC-SA 4.0,转载请注明出处