JavaScript API 設計原則

Alon's Blog發表於2016-03-29

前段時間組織優化我們的原生模組 API(iOS、Android 模組封裝成 JavaScript 介面),於是學習了幾篇 JavaScript API 設計的文章,儘管是舊文,但受益匪淺,這裡記錄一下。


好的 API 設計:在自描述的同時,達到抽象的目標。

設計良好的 API ,開發者可以快速上手,沒必要經常抱著手冊和文件,也沒必要頻繁光顧技術支援社群。

流暢的介面

方法鏈:流暢易讀,更易理解

設定和獲取操作,可以合二為一;方法越多,文件可能越難寫

一致性

相關的介面保持一致的風格,一整套 API 如果傳遞一種熟悉和舒適的感覺,會大大減輕開發者對新工具的適應性。

命名這點事:既要短,又要自描述,最重要的是保持一致性

“There are only two hard problems in computer science: cache-invalidation and naming things.”
“在電腦科學界只有兩件頭疼的事:快取失效和命名問題”
— Phil Karlton

選擇一個你喜歡的措辭,然後持續使用。選擇一種風格,然後保持這種風格。

處理引數

需要考慮大家如何使用你提供的方法,是否會重複呼叫?為何會重複呼叫?你的 API 如何幫助開發者減少重複的呼叫?
接收 map 對映引數,回撥或者序列化的屬性名,不僅讓你的 API 更乾淨,而且使用起來更舒服、高效。

jQuery 的  css()  方法可以給 DOM 元素設定樣式:

這個方法可以接受一個 JSON 物件:

 處理型別

定義方法的時候,需要決定它可以接收什麼樣的引數。我們不清楚人們如何使用我們的程式碼,但可以更有遠見,考慮支援哪些引數型別。

加了短短的 6 行程式碼,我們的方法強大到可以接收  Date 物件,數字的時間戳,甚至像 Sat Sep 08 2012 15:34:35 GMT+0200 (CEST)  這樣的字串。

如果你需要確保傳入的引數型別(字串,數字,布林),可以這樣轉換:

 處理 undefined

為了使你的 API 更健壯,需要鑑別是否真正的 undefined  值被傳遞進來,可以檢查  arguments  物件:

給引數命名

Event.initMouseEvent 這個方法簡直喪心病狂,不看文件的話,誰能說出每個引數是什麼意思?

給每個引數起個名字,賦個預設值,可好

ES6, 或者 Harmony 就有 預設引數值 和 rest 引數 了。

引數接收 JSON 物件

與其接收一堆引數,不如接收一個 JSON 物件:

呼叫起來也更簡單了:

引數預設值

引數最好有預設值,通過 jQuery.extend() , _.extend() 和 Protoype 的 Object.extend,可以覆蓋預設的預設值。

擴充套件性

回撥(callbacks)

通過回撥, API 使用者可以覆蓋你的某一部分程式碼。把一些需要自定義的功能開放成可配置的回撥函式,允許 API 使用者輕鬆覆蓋你的預設程式碼。

API 介面一旦接收回撥,確保在文件中加以說明,並提供程式碼示例。

事件(events)

事件介面最好見名知意,可以自由選擇事件名字,避免與原生事件 重名。

處理錯誤

不是所有的錯誤都對開發者除錯程式碼有用:

這樣的錯誤除錯起來很痛苦,不要浪費開發者的時間,直接告訴他們犯了什麼錯:

 備註: typeof callback === "function"  在老的瀏覽器上會有問題, object 會當成個  function 。

可預測性

好的 API 具有可預測性,開發者可以根據例子推斷它的用法。

Modernizr’s 特性檢測 是個例子:

a) 它使用的屬性名完全與 HTML5、CSS 概念和 API 相匹配

b) 每一個單獨的檢測一致地返回 true 或 false 值

依賴於開發者已熟悉的概念也可以達到可預測的目的。

jQuery’s 選擇器語法 就是一個顯著的例子,CSS1-CSS3 的選擇器可直接用於它的 DOM 選擇器引擎。

比例協調

好的 API 並不一定是小的 API,API 的體積大小要跟它的功能相稱。

比如 Moment.js,著名的日期解析和格式化的庫,可以稱之為均衡,它的 API 既簡潔又功能明確。

像 Moment.js 這樣特定功能的庫,確保 API 的專注和小巧非常重要。

編寫 API 文件

軟體開發最艱難的任務之一是寫文件,實際上每個人都恨寫文件,怨聲載道的是沒有一個好用的文件工具。

以下是一些文件自動生成工具:

  • YUIDoc (requires Node.js, npm)
  • JsDoc Toolkit (requires Node.js, npm)
  • Markdox (requires Node.js, npm)
  • Dox (requires Node.js, npm)
  • Docco (requires Node.js, Python, CoffeeScript)
  • JSDuck (reqires Ruby, gem)
  • JSDoc 3 (requires Java)

最重要的是:確保文件跟程式碼同步更新。

參考資料:

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

打賞作者

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

任選一種支付方式

JavaScript API 設計原則 JavaScript API 設計原則

相關文章