[JS进阶] 编写可维护性代码 (1)

今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码的可维护性,以便其他开发人员更好地工作!

1 可维护性代码的特点

  1. 可理解性:其他人可以接手代码并理解它的意图,无需原开发人员花太多时间解释!
  2. 直观性:代码中的东西一看就能明白,尽管其操作过程复杂。
  3. 可适应性:代码以一种数据上的变化不要求完全重写方法。
  4. 可扩展性:在代码架构上可对核心功能的扩展。
  5. 可调式性:出错时,代码可以给你足够的信息来直接确定问题所在。

2 代码约定

由于javascript语言的特点,我们可编写各种编程风格的代码,从传统的面向对象式到声明式到函数式。形成一套良好的javascript代码书写约定可大大提高可维护性,这点对初学者来说绝对是没有很注重的地方。

2.1 可读性

  1. 缩进:在项目中统一代码缩进,更易于阅读,一种不错也很常见的缩进大小为四个空格,当然可以是其他数量。
  2. 注释:其实我们在编写一些后台代码会经常把一个功能,一个业务逻辑,一个函数的代码注释起来,但我们却在编写javascript却经常忽略这些习惯。一般而言,在js中有以下这些地方需要注释:
  • 函数和方法 :描述其目的和参数代表,返回值等。
  • 大段的代码 :大段代码通常是一个任务的代码,应注释描述任务。
  • 复杂的算法 :不是所有人都会你的算法,你需要把你的算法思路简单描述下。
  • Hack :因各浏览器的差异,javascripthack用于解决什么问题应该描述清楚。

2.2 变量和函数的命名

  1. 变量名应该名词:如carperson
  2. 函数名应以动词开始:如getName(),返回布尔类型值的函数一般以is开头,如:isEnable();
  3. 只要合乎逻辑,不用担心变量或者函数名的长度,长度问题可以通过在你发布代码压缩的时候得以解决。

2.3 变量类型透明

var car,person; //声明两个变量

 

如上代码,由于javascript中变量是松散类型的,我们并不知道其中的car和person是什么类型的数据,不够透明,我们可以通过一下两种方式缓解这种问题:

  1. 初始化变量:通过初始化指定变量类型,但通过这种方式命名的对象无法用于函数声明中的参数。

    var car = null; //car是对象
    var person = ''; //person是字符串
    var count = -1; //count是整数
    var found = false; //found是布尔型

     

  2. 匈牙利标记法:在变量名之前加上一个或多个字符表示数据类型。o - 对象,s - 字符串,i - 整数,f - 浮点数,b - 布尔型

    var oCar; //car是对象
    var sPerson; //person是字符串
    var iCount; //count是整数
    var bFound; //found是布尔型

     

3 松散耦合

记得以前刚入门C#的时候,师兄经常跟我说‘高内聚低耦合’这词,我也就含糊地点点头,很多人可能也像我之前一样,这词耳熟能详,但未真正实践。

只要应用的某个部分过分依赖另一部分,代码就是耦合过紧,难于维护! 典型的问题:对象直接应用另一个对象,并且修改其中一个的同时需要修改另一个。 在我们web应用中,我们可以通过一下方式解耦我们的代码:

3.1 解耦HTML/JavaScript

在web应用中,我们希望html专注于展示数据,css专注于样式,javascript专注于行为交互。但是有一些代码会将htmljavascript过于紧密地耦合在一起。

  1. 直接写在HTMLjavascript,使用包含内联代码的<script>元素或者是使用HTML属性来分配事件处理程序。

    <!--使用<script>标签的紧密耦合 -->
    
    
    <script type="text/javascript">
       document.write('hello,javascript');
    </script>
    
    
    
    <!--使用时间处理程序属性值的紧密耦合 -->
    <input type="button" value="click me" οnclick="doSomething()"/>

     

    虽然这样写完全正确,但出现javascript错误是,我们需要判断错误出现在HTML还是在Javascript中,并且这还存在一个时间差问题,当我按下上面代码的按钮时,若此时javascript代码并未加载完,此时变回引发错误。在实践中,理想的状况应该是HTMLJavascript应完全分离,使用引入外部文件来加载javascript

  2. 相反地,在javascript中也不能包含过多的HTMl

    function insertMsg(msg){
        var container = document.getElementById('container');
        container.innerHtml = '<div lcass=\"msg\"><p class=\"post\">' + msg + '</p></div>'
    }

     

当你在写这样的代码的时候,我想你应该去找个js模板引擎来了。

对动态生成的HTML,对书写CSS布局,定位错误都比较难把控。

3.2 解耦CSS/Javascript

上面说了,CSSJS都应该各司其职,不能有太大的亲密动作,秀恩爱,死得快 囧~~~。
这个问题并不能说完全解耦cssjs,因为在现代web应用中常常需要javascript来更改样式,但是我们还是尽量使他们分离。

// CSS对JS的紧密耦合
element.style.color = 'red';
element.style.backgroundColor= 'blue';

 

这样的代码在以后修改样式的时候需要同时修改CSS和JS,可麻烦了。

//这样就ok了
element.className = 'color'; //color是样式类

 

还有一个就是不能在CSS中写CSS表达式,这应该是都知道的了。

3.3 解耦应用逻辑和事件处理程序

每个web应用程序都有相当多的事件处理程序,监听着大量不同的事件,然而,很少能有仔细将应用逻辑从事件处理程序中分离的,如下:

function checkValue(e){
   e = e || window.event;
   var target = e.target || e.srcElement;
   if(target.value.length < 5){
      //省略一堆逻辑处理代码...
   }
}

 

将上面的代码重写为:

function checkValue(value){
       if(value.length < 5){
         //省略一堆逻辑处理代码...
       }
   }
   function handleBlur(e){
       e = e || window.event;
       var target = e.target || e.srcElement;
       checkValue(target.value); //调用应用逻辑处理函数
    }

 

这样写有什么好处呢?

  1. 当有不同的方式触发相同的相同过程事件的时候,这时只需调用应用逻辑处理函数即可。
  2. 应用逻辑处理函数可以在不添加到事件的情况下单独测试。

4 编程实践

在企业环境中创建的web应用往往同时由大量人员一同创作。在这种情况下的目标是确保每个人所使用的浏览器环境都有一致和不变的规则,因此,我们需要坚持一下的一些编程实践:

4.1 避免全局变量

在一个js文件中,最多允许有一个全局变量,让其他对象和函数包含在其中,因为过多的全局变量会消耗大量内存。

//两个全局变量
var name = 'jozo';
function sayName(){
  alert('jozo');
}

 

上面的代码有两个全局变量,变量name和函数sayName(),其实可以创建一个变量包含它们:

//一个全局变量 --推荐
var person = {
    name:'jozo',
    sayName : function(){
        alert(this.name);
    }
}

 

这样一个全局变量延伸开来就是‘空间的概念’了,不会与其他功能产生冲突,有助于消除功能作用域之间的混淆。

4.2 避免与null进行比较

function sortArray(values){
    if(values != null){
        values.sort(比较函数);
    }
}

 

上面代码中的if语句应该检测values是否是数组,但如果与null作比较的话,字符串,数字等都会通过,导致函数抛出错误。这里是数组,那么我们就应该检测其是否为数组:

function sortArray(values){
    if(values instanceof Array){
        values.sort(比较函数);
    }
}

 

所于当我们遇到与null作比较的代码的时候,我们应该用下面的技术替换:

  1. 如果值为引用类型,则用instanceof 操作符检查其构造函数。
  2. 如果值是基本类型,则用typeof操作符检查其类型。

4.3 使用常量

function validate(value){
    if(!value){
        alert('不存在');
        location.href = '/errors/invalid.php';
    }
}

 

现在,我想把‘不存在’改为‘该数据不存在!’,把跳转路径也改了,我得回到函数中找到对应的代码去修改,而每次修改逻辑代码,都有可能引入错误的风险。所以我们可以把数据单独定义为常量,与应用逻辑分离:

var Constans = {
    ERRORMSG: '不存在',
    ERRORPAGE:'/errors/invalid.php'
};
function validate(value){
    if(!value){
        alert(Constans.ERRORMSG );
        location.href = Constans.ERRORPAGE ;
    }
}

 

这样我们修改静态文本内容的时候就无需去动逻辑函数了,甚至可以把Constans单独一个文件。那么什么样的数据需要抽出来做常量呢?

  1. 重复值:任何在多处用到的值。
  2. 用户界面字符串:任何用于显示给用户提示信息的字符串。
  3. URLs:在WEB项目中,资源路径可能经常变更。在一个公共的地方存起来,修改起来更容易!
  4. 任何可能在以后会改变的值。

5 总结

所有编程语言都需要可维护性良好的代码,这个很重要,因为大部分开发人员都花费大量时间维护他人的代码。为了减轻相互的负担,从今天起我要做个好人,写好代码! o(╯□╰)o

ok,写了一遍,我印象又加深了!以上内容整理自《JavaScript高级程序设计》,觉得不错点个赞呗。下一篇将整理如何书写提高性能的JS代码。谢谢阅读……

 

 

本文转自 naraku666

转载于:https://www.cnblogs.com/JerryWang24/p/5590048.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写可维护的JavaScript》向开发人员阐述了如何在团队开发中编写具备高可维护性的JavaScript代码,书中详细说明了作为团队一分子,应该怎么JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。   《编写可维护的JavaScript》作者Nicholas C. Zakas是顶级的Web技术专家,也是《JavaScript高级程序设计》一书的作者。他曾是Yahoo!的首席前端开发工程师,在完成了从一名“独行侠”到“团队精英”的蜕变后,他站在前端工程师的角度提炼出众多的最佳编程实践,其中包括很多业内权威所推崇的最佳法则,而这些宝贵经验正是本书的核心内容。   《编写可维护的JavaScript》适合前端开发工程师、JavaScript程序员和学习JavaScript编程的读者阅读,也适合开发团队负责人、项目负责人阅读。运用本书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 第一部分 编程风格 第1章 基本的格式化 1.1 缩进层级 1.2 语句结尾 1.3 行的长度 1.4 换行 1.5 空行 1.6 命名 1.6.1 变量和函数 1.6.2 常量 1.6.3 构造函数 1.7 直接量 1.7.1 字符串 1.7.2 数字 1.7.3 null 1.7.4 undefined 1.7.5 对象直接量 1.7.6 数组直接量 第2章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.3.1 难于理解的代码 2.3.2 可能被误认为错误的代码 2.3.3 浏览器特性hack 2.4 文档注释 第3章 语句和表达式 3.1 花括号的对齐方式 3.2 块语句间隔 3.3 switch语句 3.3.1 缩进 3.3.2 case语句的“连续执行” 3.3.3 default 3.4 with语句 3.5 for循环 3.6 for-in循环 第4章 变量、函数和运算符 4.1 变量声明 4.2 函数声明 4.3 函数调用间隔 4.4 立即调用的函数 4.5 严格模式 4.6 相等 4.6.1 eval() 4.6.2 原始包装类型 第二部分 编程实践 第5章 UI层的松耦合 5.1 什么是松耦合 5.2 将JavaScript从CSS中抽离 5.3 将CSS从JavaScript中抽离 5.4 将JavaScript从HTML中抽离 5.5 将HTML从JavaScript中抽离 5.5.1 方法1:从服务器加载 5.5.2 方法2:简单客户端模板 5.5.3 方法3:复杂客户端模板 第6章 避免使用全局变量 6.1 全局变量带来的问题 6.1.1 命名冲突 6.1.2 代码的脆弱性 6.1.3 难以测试 6.2 意外的全局变量 避免意外的全局变量 6.3 单全局变量方式 6.3.1 命名空间 6.3.2 模块 6.4 零全局变量 第7章 事件处理 7.1 典型用法 7.2 规则1:隔离应用逻辑 7.3 规则2:不要分发事件对象 第8章 避免“空比较” 8.1 检测原始值 8.2 检测引用值 8.2.1 检测函数 8.2.2 检测数组 8.3 检测属性 第9章 将配置数据从代码中分离出来 9.1 什么是配置数据 9.2 抽离配置数据 9.3 保存配置数据 第10章 抛出自定义错误 10.1 错误的本质 10.2 在JavaScript中抛出错误 10.3 抛出错误的好处 10.4 何时抛出错误 10.5 try-catch语句 10.6 错误类型 第11章 不是你的对象不要动 11.1 什么是你的 11.2 原则 11.2.1 不覆盖方法 11.2.2 不新增方法 11.2.3 不删除方法 11.3 更好的途径 11.3.1 基于对象的继承 11.3.2 基于类型的继承 11.3.3 门面模式 11.4 关于Polyfill的注解 11.5 阻止修改 第12章 浏览器嗅探 12.1 User-Agent检测 12.2 特性检测 12.3 避免特性推断 12.4 避免浏览器推断 12.5 应当如何取舍 第三部分 自动化 第13章 文件和目录结构 13.1 最佳实践 13.2 基本结构 第14章 Ant 14.1 安装 14.2 配置文件 14.3 执行构建 14.4 目标操作的依赖 14.5 属性 14.6 Buildr项目 第15章 校验 15.1 查找文件 15.2 任务 15.3 增强的目标操作 15.4 其他方面的改进 15.5 Buildr任务 第16章 文件合并和加工 16.1 任务 16.2 行尾结束符 16.3 文件头和文件尾 16.4 加工文件 第17章 文件精简和压缩 17.1 文件精简 17.1.1 使用YUI Compressor精简代码 17.1.2 用Closure Compiler精简 17.1.3 使用UglifyJS精简 17.2 压缩 17.2.1 运行时压缩 17.2.2 构建时压缩 第18章 文档化 18.1 JSDoc Toolkit 18.2 YUI Doc 第19章 自动化测试 19.1 YUI Test Selenium引擎 19.1.1 配置一台Selenium服务器 19.1.2 配置YUI Test Selenium引擎 19.1.3 使用YUI Test Selenium引擎 19.1.4 Ant的配置法 19.2 Yeti 19.3 PhantomJS 19.3.1 安装及使用 19.3.2 Ant的配置法 19.4 JsTestDriver 19.4.1 安装及使用 19.4.2 Ant的配置法 第20章 组装到一起 20.1 被忽略的细节 20.2 编制打包计划 20.2.1 开发版本的构建 20.2.2 集成版本的构建 20.2.3 发布版本的构建 20.3 使用CI系统 20.3.1 Jenkins 20.3.2 其他CI系统 附录A JavaScript编码风格指南 附录B JavaScript工具集
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值