编写可维护性代码

可维护的代码遵循原则:

  1. 可理解性 (方便他人理解)
  2. 直观性 (一眼明了)
  3. 可适应性 (数据变化无需重写方法)
  4. 可扩展性 (应对未来需求扩展,要求较高)
  5. 可调试性 (错误处理方便定位)

命名方式

变量取名多为为名词,方法取名多为为动词

// 变量名
car, person; // 方法名
getName, isEnable;

解耦

功能过于依赖,代码耦合过紧,不利于维护。而通过解耦能让我们更专一地处理特定功能业务的开发,也方便我们开发中调试,从复杂的耦合依赖中抽离出来。

解耦优势:代码复用,单元测试。

解耦原则:

  1. HTML/JavaScript解耦(结构层/行为层的解耦)
  2. CSS/JavaScript解耦 (样式层/行为层的解耦)
  3. 应用逻辑/事件处理程序解耦

应用逻辑/事件处理程序解耦合的原则:

  1. 勿将event对象传给其他方法;只传来自event对象中所> 需的数据
  2. 任何可以在应用层面的动作都应该可以在不执行任何事> 件处理程序的情况下进行;
  3. 任何事件处理程序都应该处理事件,然后将处理转交给应用逻辑
// 一个事件解耦的例子
var pwdInput = document.getElementById('password'); // 回车事件
pwdInput.addEventListener('keyup', function(event){
if (event.keyCode == 13) {
validatePassword(event.target.value);
}
}) // 失焦事件
pwdInput.addEventListener('blur', function(event) {
validatePassword(event.target.value);
}) // 业务应用单独封装到一个方法里面,多处复用/单元测试皆可
function validatePassword(pwd) {
if (!pwd) {
alert('密码不能为空!');
}
}

对象所有权

JavaScript中是通过原型链来实现继承,而原型继承的一个特点就是原型上定义的属性方法,可以被多个实例共享使用。

对象维护原则:

  1. 不要为实例或原型添加属性
  2. 不要为实例或原型添加方法
  3. 不要重定义已存在的方法

需要修改对象时:

  1. 创建包含所需功能的新对象,并用它与相关对象进行交互
  2. 创建自定义类型,继承需要进行修改的类型,然后可以自定义类型添加额外功能

全局变量引申命名空间

var name = 'KenTsang';
function sayName () {
console.log(name);
} var MyApp = {
name: 'KenTsang',
sayName: function() {
console.log(this.name);
}
skill: {
html: 80,
css: 80,
js: 80
}
} MyApp.skill.js // 80

虽然减少程序员输错代码造成修改全局变量的几率,但依旧可以修改到全局变量,而且增加了代码量。

常用null比较误区

TIPS: null可同时判断null/undefined,可用来判断对象属性是否存在。

使用null作判断无法进行充分的类型检查。

// 错误用法
function sortArrays(values) {
if (values != null) {
// 非数组类型就会报错,因为sort方法只有Array才具备
values.sort();
}
} // 正确用法
if (values instanceof Array) {
value.sort();
}

使用null比较的代码,替换原则:

  1. 如果值应为一个引用类型,使用instanceof操作符检查其构造函数
  2. 如果值应为一个基本类型(值类型),使用typeof检查其类型
  3. 如果是希望对象包含某个特点的方法名,则使用typeof操作符确保指定名字的方法存在于对象上
// 值类型 (Number, String, Boolean)
typeof value == 'string'; // 引用类型 (Array, Object, Function)
value instanceof Array; // 对象方法 (Object.property)
typeof person.getName == 'function'

常量应用

var CONSTANS = {
INVALID_VALUES_MSG: "Invalid value!",
INVALID_VALUE_URL: "/erros/invalid.php"
} CONSTANS.INVALID_VALUES_MSG // "Invalid value!"

常量应用原则:

  1. 重复值——多处地方引用的值 (CSS类名/后端返回的状态码)。
  2. 用户界面字符串——显示给用户的字符串 (国际化, 替换为对应的语言包文件)
  3. URLs——公共地方存放所有的URL (测试API的URL/上线API的URL)
  4. 任何可能会更改的值 (通常是环境/语言配置上的修改)

redux/vuex的actionType判断的应用,也是常量应用常见的场景。好处就是引用时拼写错误会直接抛出变量引用错误,而直接用字符串值判断,则不会抛出错误,不利于调试。

// redux-reducer.js文件中应用常量
import {
ADD_TODO_ITEM,
DELETE_TODO_ITEM
} from './actionTypes' const defaultState = {
inputValue: '',
list: []
}; export default (state = defaultState, action) => {
let newState = JSON.parse(JSON.stringify(state)); switch (action.type) {
case DELETE_TODO_ITEM:
newState.list.splice(action.value, 1);
break;
case ADD_TODO_ITEM:
if (newState.inputValue.trim().length) {
newState.list.push(newState.inputValue);
}
newState.inputValue = '';
break;
} return newState;
}

参考文档

作者:以乐之名

本文原创,有不当的地方欢迎指出。转载请指明出处。

读书笔记(02) - 可维护性 - JavaScript高级程序设计的更多相关文章

  1. 读书笔记(05) - 事件 - JavaScript高级程序设计

    HTML依托于JavaScript来实现用户与WEB网页之间的动态交互,接收用户操作并做出相应的反馈,而事件在此间则充当桥梁的重要角色. 日常开发中,经常会为某个元素绑定一个事件,编写相应的业务逻辑, ...

  2. 读书笔记(03) - 性能 - JavaScript高级程序设计

    作用域链查找 作用域链的查找是逐层向上查找.查找的层次越多,速度越慢.随着硬件性能的提升和浏览器引擎的优化,这个慢我们基本可以忽略. 除了层级查找损耗的问题,变量的修改应只在局部环境进行,尽量避免在局 ...

  3. 读书笔记(01) - JSON - JavaScript高级程序设计

    JSON与JavaScript对象 JSON是一种表示结构化数据的存储格式,语法格式上与JavasScript对象有些类似. TIPS: 与JavaScript对象的格式区别 不支持变量.函数或对象实 ...

  4. 学习笔记:《JavaScript高级程序设计》

    第1章 JavaScript简介 1.一个完整的JavaScript实现应该由三部分组成:核心(ECMAScript),文档对象模型(DOM)和浏览器对象模型(BOM). 2.Web浏览器只是ECMA ...

  5. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  6. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  7. JavaScript高级程序设计(读书笔记)(一)

    本笔记汇总了作者认为“JavaScript高级程序设计”这本书的前七章知识重点,仅供参考. 第一章 JavaScript简介 JavaScript发展简史: 1995年,JavaScript诞生 19 ...

  8. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

  9. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

    ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...

随机推荐

  1. 【慕课网实战】Spark Streaming实时流处理项目实战笔记六之铭文升级版

    铭文一级: 整合Flume和Kafka的综合使用 avro-memory-kafka.conf avro-memory-kafka.sources = avro-sourceavro-memory-k ...

  2. MIT molecular Biology 笔记11 位点特异性重组 和 DNA转座

    位点特异性重组 和 DNA转座 视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th ed ...

  3. (转)WAMP多站点配置

    转自:http://wislab.net/archives/43.html Wamp正在被广泛使用,其傻瓜式的安装配置,使得我们可以得心应手地完成以往较为烦琐的服务器环境搭建过程,直接进入到网页程序的 ...

  4. (转)私有代码存放仓库 BitBucket介绍及入门操作

    转自:http://blog.csdn.net/lhb_0531/article/details/8602139 私有代码存放仓库 BitBucket介绍及入门操作 分类: 研发管理2013-02-2 ...

  5. linux下修改root密码以及找回密码的方法

    以root身份登陆,执行: # passwd 用户名 (修改密码) # useradd 用户名 (添加用户) 具体示例如下:[root@bogon ~]# passwd root Changing p ...

  6. SSM_CRUD新手练习(6)分页后台控制器编写

    经过测试基础环境已经搭建好了,现在我们开始编写CRUD. 我们来看一下查询的逻辑该怎么写: 1.访问index.jsp页面 2.index.jsp页面发送查询员工的请求 3.EmployeeContr ...

  7. AngularJS $eval $parse

    $eval $parse都可以解析或计算Angular表达式的值. 一.$parse 是一个独立的可以注入的服务,注入就可以使用,它返回一个函数,我们需要显式将表达式求值的上下文传递给该函数.$par ...

  8. iOS笔记之UIKit_UIButton

    //UIButton的基本属性 _btn = [UIButton buttonWithType:UIButtonTypeCustom]; _btn.frame = CGRectMake(0, 200, ...

  9. 8.正则表达式和XPath

    1.使用正则表达式爬取内涵段子 import requests import re def loadPage(page): url = "http://www.neihan8.com/art ...

  10. AlexNet详解

    在imagenet上的图像分类challenge上Alex提出的alexnet网络结构模型赢得了2012届的冠军.要研究CNN类型DL网络模型在图像分类上的应用,就逃不开研究alexnet,这是CNN ...