去除 JavaScript 程式碼的怪味

塗鴉碼龍發表於2015-05-22

難聞的程式碼

為毛是這個味?

很多原因:

  • 宣告過多
  • 巢狀太深
  • 複雜度太高

檢查工具

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 宣告

資源

this 深淵的味道

難聞的程式碼

為什麼是這個味?that 還是 self 還是 selfie

替換方案
1) bind

替換方案
2) forEach 的第二個引數

替換方案
3) ECMAScript 2015 (ES6)

4a) 函數語言程式設計

4b) 函數語言程式設計

工具

ESLint

字串連線的味道

難聞的程式碼

為毛是這個味?因為字串連線

替換方案
@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

工具

ESLINT-PLUGIN-SMELLS

難以琢磨的計時器

難聞的程式碼

為毛這個味?無法同步的計時器

Demo: setInterval

用 setTimeout 保證順序

Demo: setTimeout

重複定義

難聞的程式碼

替換方案
1) 巢狀呼叫函式

2) forEach

3) reduce

4) flow

工具

ESLINT-PLUGIN-SMELLS

資源

過度耦合

難聞的程式碼

為毛是這個味?緊密耦合的依賴關係

如何改善!?!

  1. 依賴注入
  2. 訊息訂閱
  3. 依賴注入

  1. 訊息訂閱

資源

連續不斷的互動

難聞的程式碼

Demo: 根本停不下來

解決方案:節流閥

Demo

解決方案:DEBOUNCE

Demo

資源

匿名函式

難聞的程式碼

給函式命名的原因:

  1. 堆疊追蹤
  2. 去關聯
  3. 程式碼複用
  4. 堆疊追蹤

修改後

  1. 去關聯

單次事件繫結

Demo

  1. 程式碼複用

資源

結尾

更多的 ESLint 規則

資源

NPM 搜尋 eslint-plugin

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

去除 JavaScript 程式碼的怪味 去除 JavaScript 程式碼的怪味

相關文章