编写可维护性代码

可维护的代码遵循原则:

  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. python_day1_python第一个程序 hello world

    Python 第一个程序 1)安装好python后,cmd进入DOS下,直接输入python Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06 ...

  2. linux下运算的几种方法

    1.expr 1.1 最简单的用法 yan@yan:~$ \* yan@yan:~$ 1.2 bash脚本对于expr yan@yan:~$ cat expr1.sh #!/bin/bash PATH ...

  3. 1057 Stack 树状数组

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  4. CentOS 5.5 防火墙开启、关闭以及开放指定端口

    之前有讲过公司新买的服务器使用的是CentOS5.5, 部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页. 因为以前部署在Win Se ...

  5. android sqlite 模糊查询

    正确的做法Cursor cursor = sd.rawQuery("select * from contect where QT_CUSTOM like ?", new Strin ...

  6. 普通用户开放 sudo 权限

    大家都知道 linux 每个目录都是有权限的,所以如果要想在此目录下读写,则要有这个目录的权限,或者就是有 sudo 权限,那怎么给普通用户赋予 sudo 权限呢,下面我们来看一下: 1.先用 roo ...

  7. Nutch1.2 的安装与使用

    Nutch1.2的安装与使用 1.nutch1.2下载    下载地址 http://archive.apache.org/dist/nutch/     2.nutch1.2目录   bin:用于命 ...

  8. hdu 5073 有坑+方差贪心

    http://acm.hdu.edu.cn/showproblem.php?pid=5073 就是给你 n 个数,代表n个星球的位置,每一个星球的重量都为 1 开始的时候每一个星球都绕着质心转动,那么 ...

  9. javascript Object.create()究竟发生了什么

      这是我在博客园的第一篇博客,早上看了一个大牛的博客,关于javascript继承的,对于大牛使用Object.create()实现继承的方式觉得点问题,就自己研究了一下,所以就有了这篇帖子. 本帖 ...

  10. 11.CrawlSpiders

    CrawlSpiders 通过下面的命令可以快速创建 CrawlSpider模板 的代码: .scrapy startproject tencentspider .scrapy genspider - ...