代码整洁之道-如何写好函数

Author Avatar
我爱吃包子 7月 11, 2019

前言

最近事情巨多,这几个周末又是搬家又是加班的,导致整个系列的进度严重delay。自己这次经手了一个完整的小程序项目,明明上比之前好多了,勉强达到了让人看到命名能明白这个变量的用处。项目中也遇到了一些其他的问题,比如函数的使用,我应该如何抽象函数,如何让函数变得简洁易懂,如何分离函数功能。这些我们都在这篇文章中了解。

如何写好函数

  • 短小

  • 只做一件事

    函数应该做一件事情。做好这件事。只做一件事。

    问题的关键是很难知道那件该做的事情是什么。比如下面代码。下面代码可以说只做了一件事,发送请求。但是也可以看成两件事,1、验证数据是否合法。2、如果验证合法则发送请求。如果该函数只是做了该函数名下同一抽象层级上的步骤,则可以看做只做了一件事。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    sendDataIfverity() {
    /* 忽略 */
    if (!this.verify(data)) {
    return;
    } else {
    // 发送请求
    this.sendData()
    }
    }
  • 每个函数一个抽象层级

    要确保函数只做一件事,函数中的语句都要在同一抽象层级上。看下面代码,可以看出下面代码氛围多个抽象层级。验证数据、展示loading、发送请求、使用缓存。很明显这些都不是在同一抽象层级下,应该把下面方法进行优化。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    sendDataIfverity() {
    /* 忽略 */
    if (!this.verify(data)) {
    return;
    } else {
    // 发送请求
    commonFetch({
    ...purpose
    }, () => {
    this.$loading.hide();
    this.$toast.show('添加意向成功', 1500, () => {
    setStorage(
    'wishTab',
    'sent',
    () => {
    }
    );
    });
    }, (err) => {
    this.$loading.hide();
    this.$toast.show(err.message);
    });
    }
    }
  • 使用描述性的名称

    这里在上一篇文章有说到,就不细致说了,可以翻看上一篇文章。还是只有最核心的一句,在尽可能短的名称内描述你想干的事。

  • 函数参数

    最理想的参数数量是零,其次是一,再次是二,尽量避免三。

  • 无副作用

    函数承诺只做一件事,但还是会做其他被藏起来的事。无论哪种情况,都是具有破坏性的,会导致古怪的时序性耦合及顺序依赖。

  • 使用异常替代返回错误码

    抽离 try/catch 代码,应该把 try/catch 代码分离开来。如果一个函数中包含 try/catch ,那应该把这个放在函数的开头。这样这个函数就是处理异常的函数。

一些例子和错误的地方

  • 1、过多的参数

    函数的参数数量应该少,没参数最好,一个次之,两个、三个再次之。三个以上的参数非常值得质疑,应坚决避免。从测试的角度来看,参数过多更让人头疼。参数过多,会让人猜函数参数的意思。

  • 2、死函数

    永不被调用的函数应该输出,别害怕删除代码,一时删一时爽,一直删一直爽。

总结一下

  • 1、函数应该做一件事,函数做好一件事,函数只做一件事。
  • 2、每个函数都应该只有一个抽象层级。
  • 3、任何人都不可能一次性写出完美的函数,必定是在修改多次之后才是。所以写完回顾自己的函数也是重要的一步。