提升代码的可读性系列(一)–基础篇

509 查看

readable_cover

编程是一门艺术活,好的代码应该就像住的房子一样,有整体的框架,有门,有窗户,相互独立又完美组合。你觉得门不够结实,就拆下来换个实心的;你觉得窗户不够明亮就换个全玻璃的,总之对房子的其他部位没有任何影响。所以说每一个程序员都应该有一颗设计师的心。本文主要从编码变量处理错误对象等基础方面进行简单的探讨,希望能对大家的工作有所帮助~~

1 编码风格

老生常谈,我们先从最基础的编码说起吧!好的编码规范不仅仅能够提升代码的可读性与可维护性,提高团队的工作效率,也能够避开一些低级的错误,减少bug的隐患,提升程序员的自我修养。编码虽小,但却是万丈高楼的基础,对于编写清晰连贯的代码来说,每一个字符都是非常重要的。以下部分编码规范参考自凹凸实验室

1.1 缩进

通常使用四个空格进行代码缩进,有些也用tab来缩进,这主要根据团队的风格跟个人喜好

1.2 空格

  • 左括号与类名之间一个空格
  • 冒号与属性值之间一个空格
  • 操作符前后
  • 匿名函数表达式之后等

1.3 空行

这是一个容易被大家忽略的点,但它所带来的效果是毋庸置疑的!通常一段代码的语义和另一段代码不相关,就应该用空行隔开,避免一大段的代码揉在一起,比如

  • 在方法之间;
  • 方法中的局部变量和第一条语句之间;
  • 注释之前
  • 方法内的逻辑片段之间

1.4 命名约定

有一位大师曾说过,计算机科学只存在两个难题:缓存命名。由此可见命名不仅是一门科学,也是一门技术。
通常情况下,变量与函数一般使用驼峰大小写命名法,其中为了区分变量与函数,变量命名前缀应当是名词,函数前缀应当是动词,也就是说我们应当让命名承载一定的含义,因此要避免使用没有意义的命名。

1.4 注释

通常我们在编写完一段代码的短时间内,会清楚这段代码的工作原理。但是当过一段时间再次回到代码中,可能会花很长的时间才能读懂。这种情况下,编写注释就变得尤为重要了。

2 变量

首先说一说全局变量存在哪些的问题吧!命名冲突测试难度大深耦合等等。在创建变量的时候,我们应该注意以下几个方面

2.1 避免隐性的创建全局变量

什么是隐性的全局变量呢?官方的回答是:任何变量,如果未经声明,就为全局对象所有。啥意思呢?其实就是没有加var声明的,请看下面的例子

另外一种容易创建隐形全局变量的情况就是var声明的链式赋值,如下代码所示

以上这段代码的执行结果是:a是局部变量,b是全局变量,主要原因是从右至左的操作符优先级,它实际执行的结果等同于

综上所述,隐式全局变量并不是我们平时用var声明的变量,而是全局对象的属性,既然是属性,那么它可以通过delete操作符删除,但变量不可以,且在ES5 strict以上会抛出错误。

2.2 在函数顶部声明变量

在javascript中,声明变量有一个“提升”的概念,即无论在函数哪里声明,效果都等同于在函数顶部进行声明。所以我们统一把变量在函数顶部声明,既有利于可读性与可维护行,也不易出错。

2.3 使用单一var模式

这样声明的变量不仅可读性好,而且可以防止变量在定义前就被使用的逻辑错误,且编码更少。

2.4 单全局变量方式

虽然全局变量的容易污染命名空间,但有些功能的需要,难以避免使用,关键是我们应该做到避免全局变量超出我们的掌控,最佳的方法是依赖尽可能少的全局变量。我们可以使用单全局变量的方式来开启我们的项目,这种方式在许多的javascript类库中都有这样使用。如jQuery,它定义了两个全局变量$和jQuery。

3 UI松耦合

什么是松耦合?当修改一个组件的逻辑,而对另一个组件没有影响,就说这叫松耦合。通常一个大型的web应用,都是由多人共同开发维护,这时候松耦合显得至关重要,假如你修改了某一处的代码而影响了团队其他人的功能,这是非常不友好的。通常我们主要注意以下几点

  • 将javascript从css中抽离,如避免使用css表达式
  • 将csst从javascrip中抽离,如避免使用javascript直接修改css,最佳的方法是操作css的className;
  • 将javascript从HTML中抽离,如避免将函数直接嵌入到html执行,我们应该尽量做到将所有的js代码都放入外置文件中,确保
    html中不会有内联的js代码。
  • 将html从javascript中抽离,如避免在js中拼接html结构,我们可以用模板引擎,也可以使用Vue、React等。

4 错误处理

4.1 为什么要抛出错误?

在javascript开发中,总是会悄无声息的出现一些超出我们预期的,携带的信息稀少的,隐晦含糊的bug,让我们措手不及,大大增加了我们调试错误、定位错误的难度,影响开发效率。假设错误中包含这样的信息:“由于某某情况,导致某某函数执行错误”,那么是不是马上就可以开始调试而不用花大量的时候去定位错误?

4.2 何时抛出错误?

主要是辨识代码中哪些部分在特定的情况下最后可能导致错误,这里的错误通常都是我们在思考的过程中的一些可预期的错误。

4.3 怎样抛出错误?

4.3.1 使用try-catch

将可能引发错误的代码放在try块中,处理错误的代码放在catch中,如

也可以增加一个finally块,这里需注意的是finally块中的代码块不管是否有错误发生,最后都会被执行。

4.3.2 throw

当我们能清晰的捕捉到错误的时候,最好的做法就是抛出这个错误,避免在不经意的时候又遇到它,让大家尴尬。这里需注意的是当遇到throw操作符时,代码会立即停止执行

也可以自定义一个错误类型,总之就是尽可能用最短的字符描述清楚

5 创建对象

5.1 对象字面量

所谓的对象字面量其实就是我们通常所说的键值对哈希表,这种方式不仅富有表现力,可读性好,且字符更短,没有作用域解析。它的语法规则如下

  • 对象包装在大括号中
  • 逗号分隔属性和方法
  • 用冒号分隔属性名称和属性的值