原文:《 ELIMINATE JAVASCRIPT CODE SMELLS 》
作者: @elijahmanor
笔记:涂鸦码农
难闻的代码
为毛是这个味?
很多原因:
检查工具
Lint 规则
结果
重构
重构后统计
- max-statements(最多声明): 16 → 6
- max-depth(最大嵌套): 5 → 2
- complexity(复杂度): 7 → 3
- max-len(最多行数): 65 → 73
- max-params(最多参数): 1 → 2
- max-nested-callbacks(最多嵌套回调): 0 → 1
资源
jshint -http://jshint.com/
eslint - http://eslint.org/
jscomplexity - http://jscomplexity.org/
escomplex - https://github.com/philbooth/escomplex
jasmine - http://jasmine.github.io/
复制粘贴代码的味道
已有功能…
已有代码,BOX.js
那么,现在想要这个功能
于是,Duang! CIRCLE.JS 就出现了…
为毛是这个味?因为我们复制粘贴了!
工具
JSINSPECT
检查复制粘贴和结构相似的代码
一行命令:
JSCPD
程序源码的复制 / 粘贴检查器
(JavaScript, TypeScript, C#, Ruby, CSS, SCSS, HTML, 等等都适用…)
怎么能不被发现?重构
把随机颜色部分丢出去…
再重构
再把怪异的 [].forEach.call 部分丢出去…
再再重构
资源
switch 味道
难闻的代码
为毛是这个味?违背“ 打开 / 关闭原则 ”
增加个新形状
加点设计模式
再增加新形状时
还有其它的味道吗?神奇的字符串
神奇的字符串重构为对象类型
神奇字符重构为 CONST & SYMBOLS
工具!?!
木有 :(
ESLINT-PLUGIN-SMELLS
用于 JavaScript Smells(味道) 的 ESLint 规则
规则
- no-switch - 不允许使用 switch 声明
- no-complex-switch-case - 不允许使用复杂的 switch 声明
资源
- CodePen
- Addy Osmani’s JavaScript Design Patterns eBook
- ESLint
- eslint-plugin-smells
- ES6 Scoping
- ES6 Symbols
- Learn ES6
this 深渊的味道
难闻的代码
为什么是这个味?that 还是 self 还是 selfie
替换方案1) bind
替换方案2) forEach 的第二个参数
替换方案3) ECMAScript 2015 (ES6)
4a) 函数式编程
4b) 函数式编程
工具
ESLint
- no-this-assign (eslint-plugin-smells)
- consistent-this
- no-extra-bind
字符串连接的味道
难闻的代码
为毛是这个味?因为字符串连接
替换方案
@thomasfuchs 推文上的 JavaScript 模板引擎
替换方案2) ECMAScript 2015 (ES6) 模板字符串
替换方案3) ECMAScript 2015 (ES6) 模板字符串 (多行)
替换方案4) 其它小型库或大型库 / 框架
- Lowdash 或 Underscore
- Angular
- React
- Ember
- 等等…
工具
ESLINT-PLUGIN-SMELLS
no-complex-string-concat
资源
Tweet Sized JavaScript Templating Engine by @thomasfuchs
Learn ECMAScript 2015 (ES6) - http://babeljs.io/docs/learn-es6/
jQuery 调查
难闻的代码
为毛是这个味?丧心病狂的链式调用
愉快地重构吧
最终 Demo
See the Pen pvQQZw by Elijah Manor ( @elijahmanor ) on CodePen .