提升开发效率的几个常用编码规范
优秀的项目源码离不开严格的编码规范,不仅可以提升代码本身的可维护性,在团队协作中也起着举足轻重的作用,既方便了自己也方便了后来人。
以下汇总了一些基本的编码规范:
1. 代码缩进
代码缩进是保证可读性的重要基础,一般来说,缩进是4个空格,当然具体多少个可以自己定。缩进通常要使用空格数而不是Tab(制表符)来定义,因为后者在不同文本编辑器中的显示不同。
2.代码注释
在大多数编程语言中,广泛接受的做法是为每个方法都编写注释,也可以极大的提高了代码的可读性。需要加注释的一般有以下几种情况:
函数和方法。每个函数和方法都应该有注释来描述其用途,以及完成任务所用的算法。同时,也写清使用这个函数或方法的前提(假设)、每个参数的含义,以及函数是否返回值(因为通过函数定义看不出来)。
大型代码块。多行代码但用于完成单一任务的,应该在前面给出注释,把要完成的任务写清楚。
复杂的算法。如果使用了独特的方法解决问题,要通过注释解释明白。这样不仅可以帮助别人查看代码,也可以帮助自己今后查看代码。
使用黑科技。由于浏览器之间的差异,JavaScript代码中通常包含一些黑科技。不要假设其他人一看就能明白某个黑科技是为了解决某个浏览器的什么问题。如果某个浏览器不能使用正常方式达到目的,那要在注释里把黑科技的用途写出来。这样可以避免别人误以为黑科技没有用而把它“修复”掉,结果你已解决的问题又会出现。
3.函数和变量命名
以下是关于命名的通用规则:
变量名应该是名词,例如car或person。
函数名应该以动词开始,例如getName()。返回布尔值的函数通常以is开头,比如isEnabled()。
对变量和函数都使用符合逻辑的名称,不用担心长度。长名字的问题可以通过后处理和压缩解决(本章稍后会讨论)。
变量、函数和方法应该以小写字母开头,使用驼峰大小写(camelCase)形式,如getName()和isPerson。类名应该首字母大写,如Person、RequestFactory。常量值应该全部大写并以下划线相接,比如REQUEST_TIMEOUT。
名称要尽量用描述性和直观的词汇,但不要过于冗长。getName()一看就知道会返回名称,而PersonFactory一看就知道会产生某个Person对象或实体。
要完全避免没有用的变量名,如不能表示所包含数据的类型的变量名。通过适当命名,代码读起来就会像故事,因此更容易理解。
4.松散耦合
只要应用程序的某个部分对另一个部分依赖得过于紧密,代码就会变成紧密耦合,因而难以维护。典型的问题是在一个对象中直接引用另一个对象,这样,修改其中一个,可能必须还得修改另一个。紧密耦合的软件难于维护,肯定需要频繁地重写,随时注意不要让代码产生紧密耦合。
解耦HTML/JavaScript
HTML是数据,JavaScript是行为。尽量避免在 html 中写 JS,同样也不要用 js 生成 html 元素。解耦HTML和JavaScript可以节省排错时间,因为更容易定位错误来源。同样解耦也有助于保证可维护性。修改行为只涉及JavaScript,修改标记只涉及要渲染的文件。
解耦CSS/JavaScript
最常见的例子就是使用JavaScript修改个别样式,比如:
// css紧耦合到了js element.style.color = 'red'; 复制代码
正确的做法是 css 只负责显示样式,以上改变样式的功能,可以通过动态修改类名而不是样式来实现,比如:
// css 与 js松散耦合 element.className = 'edit'; 复制代码
解耦应用程序逻辑/事件处理程序
每个Web应用程序中都会有大量事件处理程序在监听各种事件。可是,其中很少能真正做到应用程序逻辑与事件处理程序分离。 以下举一个对比的例子:
紧耦合
重写为:
这样修改之后,应用程序逻辑跟事件处理程序就分开了。
以下是在解耦应用程序逻辑和业务逻辑时应该注意的几点:
❑ 不要把event对象传给其他方法,而是只传递event对象中必要的数据。
❑ 应用程序中每个可能的操作都应该无须事件处理程序就可以执行。
❑ 事件处理程序应该处理事件,而把后续处理交给应用程序逻辑。
5.不要修改不属于你的对象
在企业开发中,非常重要的编码惯例就是尊重对象所有权,这意味着不要修改不属于你的对象。简单来讲,如果你不负责创建和维护某个对象及其构造函数或方法,就不应该对其进行任何修改。更具体一点说,就是如下惯例。
❑ 不要给实例或原型添加属性。
❑ 不要给实例或原型添加方法。
❑ 不要重定义已有的方法。
6.不声明全局变量
最多可以创建一个全局变量,作为其他对象和函数的命名空间。
7.不要比较null
JavaScript不会自动做任何类型检查,因此就需要开发者担起这个责任。结果,很多JavaScript代码不会做类型检查。最常见的类型检查是看值是不是null。然而,与null进行比较的代码太多了,其中很多因为类型检查不够而频繁引发错误。比如下面的例子:
这个函数的目的是使用给定的比较函数对数组进行排序。为保证函数正常执行,values参数必须是数组。但是,if语句在这里只简单地检查了这个值不是null。实际上,字符串、数值还有其他很多值可以通过这里的检查,结果就会导致错误。 现实当中,单纯比较null通常是不够的。检查值的类型就要真的检查类型,而不是检查它不能是什么。例如,在前面的代码中,values参数应该是数组。为此,应该检查它到底是不是数组,而不是检查它不是null。可以像下面这样重写那个函数:
如果看到比较null的代码,可以使用下列某种技术替换它。
❑ 如果值应该是引用类型,则使用instanceof操作符检查其构造函数。
❑ 如果值应该是原始类型,则使用typeof检查其类型。
❑ 如果希望值是有特定方法名的对象,则使用typeof操作符确保对象上存在给定名字的方法。
8.使用常量
关键在于把数据从使用它们的逻辑中分离出来。可以使用以下标准检查哪些数据需要提取。
❑ 重复出现的值:任何使用超过一次的值都应该提取到常量中,这样可以消除一个值改了而另一个值没改造成的错误。这里也包括CSS的类名。
❑ 用户界面字符串:任何会显示给用户的字符串都应该提取出来,以方便实现国际化。
❑ URL:Web应用程序中资源的地址经常会发生变化,因此建议把所有URL集中放在一个地方管理。
❑ 任何可能变化的值:任何时候,只要在代码中使用字面值,就问问自己这个值将来是否可能会变。如果答案是“是”,那么就应该把它提取到常量中。
9.优化循环
循环是编程中常用的语法构造,优化这些循环是性能优化的重要内容,因为循环会重复多次运行相同的代码,所以运行时间会自动增加。
(1)简化终止条件。因为每次循环都会计算终止条件,所以它应该尽可能地快。这意味着要避免属性查找或其他O(n)操作。
(2)简化循环体。循环体是最花时间的部分,因此要尽可能优化。要确保其中不包含可以轻松转移到循环外部的密集计算。
(3)使用后测试循环。最常见的循环就是for和while循环,这两种循环都属于先测试循环。do-while就是后测试循环,避免了对终止条件初始评估,因此应该会更快。
10.将复杂的if语句改为switch
switch 语句很快。如果代码中有复杂的if-else语句,将其转换成switch语句可以变得更快。然后,通过重新组织分支,把最可能的放前面,不太可能的放后面,可以进一步提升性能。
作者:代码搬运媛
链接:https://juejin.cn/post/7023680930317336613