前段时间有一个叫做“人类高质量男性”的视频火了 , 相信很多同学都刷到过 。所以今天给大家分享下 , 什么叫做“人类高质量代码” , 哈哈 , 开个玩笑 。
其实分享的都是一些自己平时总结的小技巧 , 算是抛砖引玉吧 , 希望能给大家带来一些启发和帮助 。
如何编写出高质量的 JAVAScript 代码?我个人认为 , 如果要编写出高质量的 JavaScript 代码 , 可以从以下三个方面去考虑 。
分别是:易阅读的代码、高性能的代码、健壮性的代码 。下面我将分别对这三个方面进行阐述 。
易阅读的代码
首先说一下 , 代码是写给自己或团队成员看的 , 良好的阅读方式是编写高质量代码的前提条件 。这里总结了四点具体操作方式分享给大家 。
第一点:统一代码格式
不要一会这样写 , 一会那样写 , 尽量统一写法 , 下面举例 。
// badfunction foo(x,y) {return {sum : x + y};}function bar(m, n){let ret = m*nreturn ret;}// goodfunction foo(x, y) {//适当的空格隔开 , 一般符号前不添加空格 , 符号后添加空格return {sum: x + y,//拖尾逗号是合法的 , 简化了对象和数组添加或删除元素}//省略结束分号 , 当然需要知道如何规避风险}function bar(m, n) {let ret = m * nreturn ret}人为去约定代码格式 , 是很不方便的 , 所以可以借助一些工具进行自动格式转换 。
第二点:去除魔术数字魔术数字(magic number)是程式设计中所谓的直接写在程式码里的具体数值(如“10”“123”等以数字直接写出的值) 。虽然程式作者写的时候自己能了解数值的意义 , 但对其他程式员而言 , 甚至作者本人经过一段时间后 , 都会很难理解这个数值的用途 。
// badsetTimeout(blastOff, 86400000)document.onkeydown = function (ev) {if (ev.keyCode === 13) {// todos}}// goodconst MILLISECONDS_IN_A_DAY = 86400000const ENTER_KEY = 13setTimeout(blastOff, MILLISECONDS_IN_A_DAY)document.onkeydown = function (ev) {if (ev.keyCode === ENTER_KEY) {// todos}}当然还有魔术字符串也是像上面一样去处理 , 上面代码中的常量命名推荐采用下划线命名的方式 , 其他如变量、函数等推荐用驼峰进行命名 。
其实减少this的使用频率也是一样的道理 , 当代码中充斥着大量this的时候 , 我们往往很难知道它是谁 , 需要花费很多时间进行阅读 。
// badclass Foo {foo() {this.number = 100this.el.onclick = function () {this.className = "active"}}}// goodclass Foo {foo() {let context = thiscontext.number = 100context.el.onclick = function () {let el = thisel.className = "active"}}}第三点:单一功能原则无论是编写模块、类、还是函数都应该让他们各自都只有单一的功能 , 不要让他们做过多的事情 , 这样阅读起来会非常简单 , 扩展起来也会非常灵活 。
// badfunction copy(obj, deep) {if (deep) {// 深拷贝} else {// 浅拷贝}}// goodfunction copy(obj) {// 浅拷贝}function deepCopy(obj) {// 深拷贝}第四点:减少嵌套层级多层级的嵌套 , 如:条件嵌套、循环嵌套、回调嵌套等 , 对于代码阅读是非常不利的 , 所以应尽量减少嵌套的层级 。
像解决条件嵌套的问题 , 一般可采用卫语句(guard clause)的方式提前返回 , 从而减少嵌套 。
// badfunction foo() {let resultif (isDead) {result = deadAmount()} else {if (isRet) {result = retAmount()} else {result = normalAmount()}}return result}// goodfunction foo() {if (isDead) {return deadAmount()}if (isRet) {return retAmount()}return normalAmount()}除了卫语句外 , 通过还可以采用短路运算、条件运算符等进行条件语句的改写 。
// badfunction foo() {if (isOk) {todo()}let gradeif (isAdmin) {grade = 1} else {grade = 0}}// goodfunction foo() {isOk && todo()// 短路运算let grade = isAdmin ? 1 : 0// 条件运算符}像解决回调嵌套的问题 , 一般可采用“async/await”方式进行改写 。
// badlet fs = require("fs")function init() {fs.mkdir(root, (err) => {fs.mkdir(path.join(root, "public", "stylesheets"), (err) => {fs.writeFile(path.join(root, "public", "stylesheets", "style.css"),"",function (err) {})})})}init()// goodlet fs = require("fs").promisesasync function init() {await fs.mkdir(root)await fs.mkdir(path.join(root, "public", "stylesheets"))await fs.writeFile(path.join(root, "public", "stylesheets", "style.css"), "")}init()
推荐阅读
- 衬衫|DNF:110版本还未加强的14个职业!3个已无望,2个重做可能性高
- 招聘|这3个岗位往届生也可以报考,不仅有五险一金,还有编制
- 罗云熙|老福特言情CP浏览量榜单,罗云熙前6有3个,看到第一满意离开!
- 李晨|打破3个影史纪录,9次荣登票房日冠军,李晨的眼光真精准
- 招聘|殡仪馆也是“铁饭碗”,转正有五险一金,这3个条件需满足!
- 妇科疾病该怎么治疗?躲过3个误区 妇科疾病治疗
- 漫画 男人身体的13个小秘密
- 天气转冷后,电动车电池变得不耐用,这3个方法解决跑不远的问题
- 老人死去的前兆,老人过世的前兆-
- 江玉燕|电视剧中常演“坏女人”的3个人,尽管心狠手辣,却因为她们的美丽而被人怜惜
