成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從 Java 大神 Joshua Bloch 提煉 API 設計的三個核心原則

開發 前端
即使你作為一個程序員并不直接參與面向公眾的 API 開發,實際上你也在持續地創建 API。優秀的編程應該是模塊化的,模塊間的邊界自就是 API。同樣,如果你參與的是一個現代化的、分布式的、基于微服務架構的系統,那么服務間的邊界也構成了 API,只是架構有所不同。

一個 API 應該容易學習和使用,且不易被誤用。它還應該隨著時間而發展,優秀的設計需要預見并適應這種變化。

Joshua Bloch 曾在 Sun 擔任杰出工程師,之后加入谷歌成為首席 Java 架構師。他主導了 Java 平臺上的很多功能,包括 Java Collections 框架,java.math 包,assert 機制等。他也是 Effective Java 的作者。

在谷歌 2007 年的一場重要演講中,軟件工程師兼技術作家 Joshua Bloch 強調了 API 是一種極其重要的商業資產。他指出,這主要是因為如果 API 對外開放,客戶可能會選擇在上面進行大量投資,從而很難改變使用習慣。

Bloch 還警告說,設計糟糕的 API 可能會導致無休止的客戶支持電話,極大地阻礙公司的發展。

Bloch 進一步指出,以 API 設計為思考核心,能顯著提高編寫程序的質量。

即使你作為一個程序員并不直接參與面向公眾的 API 開發,實際上你也在持續地創建 API。優秀的編程應該是模塊化的,模塊間的邊界自就是 API。同樣,如果你參與的是一個現代化的、分布式的、基于微服務架構的系統,那么服務間的邊界也構成了 API,只是架構有所不同。

盡管如此,API 設計仍然是許多程序員面臨的一個挑戰。那么,一個好的 API 有哪些特點呢?

1、名字至關重要

從宏觀角度來看,API 應該易于學習和使用,同時難以被誤用。它還需要隨著時間的發展而進化,而一個優秀的設計會將此考慮在內。

命名的方式極其重要,因為 API 在實質上是一種需要用戶學習的簡約語言。

「真正合適的命名可以解決問題并避免誤解,因為恰當的命名能夠非常明確地表明事物的本質?!筍oftIron 首席科學家 Harry Richardson 在接受 The New Stack 采訪時表示。

Richardson 特別指出,對于開發者來說,命名塑造了我們的思維模型。

「改變一個已經形成的思維模型是相當困難的工作,這不一定是在代碼方面,而是關于我們思考問題方式的方面?!?/span>

因此,投入時間去精心挑選一個能夠精確描述 API 功能的名稱是非常值得的。

作為一個作家的基本工具 —— 字典和詞典 —— 在 API 命名過程中也能提供幫助。如果你發現某個名字特別難以確定,這可能意味著它嘗試同時承擔太多的職責。就像需要將過于復雜的句子分割成更簡單的句子一樣,當一個模塊過于復雜時,也應該考慮將其拆分。

要避免使用讓人費解的縮寫,并且注意保持命名的一致性。比如,不應該同時使用 getBasicSalary() 和 getBaseSalary() 這樣意義相同但命名不一的方法 —— 如果你的 API 中既有 remove() 又有 delete() 方法,使用者能夠清楚地知道它們之間的區別嗎?

使用的語言需要與組織或供應商公開的其他 API 保持一致性。這種對一致性的追求意味著,實施一定程度的集中化管理會很有幫助。

比如,一些大型企業會把高級技術寫作人員的職責擴展到幫助工程團隊統一命名方法、屬性和字段。

如果你正在開發 REST 風格的系統,獨立咨詢師兼《掌握 API 架構》一書的合作者 Daniel Bryant 建議參考已有的 API 指南集,這有助于在 API 的行為上實現一致性。對于基于 HTTP 的 API,他推薦考慮使用 OpenAPI,還有其他包括 Atlassian、Google 和 Microsoft 在內的指南。

同時,雖然所有 API 都需要恰當的命名,但這些命名本身是特定于領域的;比如,為量化分析師編寫的 API 與為零售商編寫的 API 使用的語言會有很大不同。理想情況下,選用的術語應與企業已經使用并至少理解的術語匹配。

為此,Bryant 在對 The New Stack 的講述中提到,最佳做法是進行用戶研究,確保覆蓋所有潛在的 API 使用群體。

「QA 團隊成員與開發者對于你的 API 應如何運作會有不同的看法,」他說?!肝医洺R姷介_發者在沒有詢問誰會使用它的情況下設計 API,結果暴露了內部的領域模型?!?/span>

他推薦從「待完成的工作」(Jobs-to-be-Done)的角度來考慮,比如:你的關鍵任務是什么?你的工作流是怎樣的?你是如何處理它的?你希望如何處理它?最后一個問題至關重要,因為圍繞已建立的流程可能會形成慣性。

「如果你能簡化復雜事物,你就有可能顛覆人們的世界觀,隨著系統的演進,通常會出現很好的機會」Bryant說。

2、最小意外原則

你的 API 也應該符合其所用編程語言的慣常用法,并尊重該語言的工作機制。例如,如果 API 要和 Java 配合使用,就應該通過拋出異常來處理錯誤,而不是像在 C 語言中那樣返回錯誤代碼。

API 應遵循最小意外原則。這一原則部分通過對稱性實現;比如說,如果你需要添加和刪除方法,這些操作應該在適當的地方被一致地實施。

一個優秀的 API 應該僅包含少數幾個概念;在學習它時,不應被迫學習太多內容。這并不特指方法、類或參數的數量,而是指 API 所涵蓋的概念范圍。理想情況下,一個 API 應該只專注于完成一個任務。

也最好避免無謂地添加任何元素。「不確定時就不要添加,」Bloch 這樣建議。你通??梢栽谛枰獣r向 API 中添加某些內容,但一旦 API 被公開,就無法再移除其中的任何部分。

如之前所述,你的 API 需要隨時間發展,因此設計的一個關鍵方面是,在后續過程中能夠進行更改而不破壞整體結構。

「歸根到底,關鍵在于 API 應該反映現實,」Richardson表示?!咐?,如果一個人可以有多個地址或電話號碼,即便你目前只關注一個,也不應該僅允許存在一個地址。忽略現實最終總會帶來問題。」

3、API 的粘性

Richardson 指出,僅實施你當前需要的 API 的一部分是一個常見的錯誤模式。這種做法的風險在于,你可能沒有徹底思考 API 的設計,最終導致在其他場景下不可用的結果。

「API 設計需要比任何其他事情投入更多的思考,」Richardson 說,「因為一旦建成,你就無法再對其進行更改?!?/span>

第二個問題涉及到封裝和實現細節的泄露。

「一旦實現細節泄露,你就無法更改它,」Richardson表示。「因此,你需要考慮,這里進行的操作是什么?這個數據結構的真實含義是什么?」

錯誤處理通常是被忽略的一個領域。比如,如果你使用數據庫作為后端存儲,就不應該讓 SQL 錯誤直接暴露出來,因為如果你以后想更改存儲機制,這樣做就會遇到障礙。

就像軟件開發的任何其他方面一樣,認為你可以孤立地把自己鎖在一個房間里獨立完成 API 的開發是一個錯誤。這樣做,你可能會過于堅持自己的設計,即便設計存在問題。最好是像對待任何其他系統一樣,頻繁地與合作方一起測試你的想法。

在開始編碼 API 之前,編寫一個簡短的規格說明書,向合作方展示它將做什么以及如何工作是個不錯的主意。規格說明書保持簡短,這樣可以增加被閱讀的可能性,并防止你一開始就過于投入你的方案。如果你花費幾個月時間編寫了一個 100 頁的規格說明書,你就很難承認它可能并不那么優秀。

文檔是被極度低估的一方面,這不僅適用于 API 設計,在整個計算機科學領域都是如此。技術文檔編寫者經常被低估和低薪,而文檔最多被當作事后的補充,這種情況常被「代碼即文檔」這一危險的觀點所體現。

雖然你希望你的 API 易于理解和學習,但它的文檔仍極為重要。它應當是完整而全面的,至少包含每個方法的用途、每個字段的作用以及可能的錯誤條件。

「你希望它能列出所有可能返回的錯誤代碼及其對應的情況」

Richardson 強調。

投入時間來打磨和修正文檔,避免諸如使用不容易理解的縮寫這樣的常見錯誤。

在開發過程中,繼續根據 API 編寫示例代碼。Bloch 提到,許多開發者在開發過程往往半途而廢,但是如果在整個實施過程中持續對 API 進行編碼,你將能夠真實地感受到它的工作時機和方式。

「這些代碼不是無用功,」Bloch強調,「因為它不僅幫助你打造出更優秀的產品,還提供了一套可供其他程序員學習的范例。」

這些示例極為關鍵,因為它們將被其他開發者不斷地復制使用,從而根本性地影響 API 的使用方式。

責任編輯:武曉燕 來源: Bytebase
相關推薦

2021-05-07 15:27:23

架構設計架構開發

2022-02-22 09:58:09

搜索設計交互互聯網

2022-01-05 07:07:37

Go核心設計

2011-11-21 14:39:46

巴菲特IBM

2022-12-30 08:16:34

2022-02-14 10:42:41

移動端標簽設計用戶

2017-06-19 14:21:01

JavaScriptAPI設計原則

2014-12-10 09:53:43

Java 9

2016-03-29 09:59:11

JavaScriptAPI設計

2021-09-14 09:39:06

設計系統框架設計原則

2021-09-16 15:06:33

漏洞管理漏洞網絡攻擊

2016-11-28 08:56:15

透析大數據核心

2022-02-10 23:38:23

API架構設計

2014-07-21 09:22:40

GoAPI

2015-03-12 10:57:51

開源項目

2023-04-26 11:14:11

IT領導者遠程工作

2021-08-02 07:57:03

注冊Nacos源碼

2021-01-06 10:49:31

云遷移銀行

2024-09-24 17:20:16

Python自動化辦公

2015-10-12 17:20:21

產品設計層級
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产a区 | 国产精品99久久久久久人 | av二区三区 | 精品亚洲一区二区三区四区五区高 | 中文字幕在线一 | 国产中文 | 欧美一区二区久久 | 欧美精品一二三 | 福利视频一区二区三区 | 成人不卡在线 | 国产精品日韩在线观看一区二区 | 国产成人精品一区二区三 | 国产午夜精品一区二区三区嫩草 | 欧美在线一区二区三区 | 91传媒在线观看 | 国产一区二区在线观看视频 | 日本一区二区三区在线观看 | 亚洲手机在线 | 91精品国产一区二区在线观看 | 中文字幕在线人 | 中文字幕在线观看 | 国产羞羞视频在线观看 | 午夜99| 欧美日韩中文字幕在线 | 亚洲综合一区二区三区 | 欧美一级特黄aaa大片在线观看 | 亚洲一区二区三区四区五区午夜 | 精品国产乱码久久久久久果冻传媒 | 欧美成人a∨高清免费观看 欧美日韩中 | 久久草在线视频 | av永久免费| 亚洲一区二区在线免费观看 | 日韩在线小视频 | 久久久久久久久久一区二区 | 在线免费观看毛片 | 久久中文一区二区 | 欧美黄色一级毛片 | 欧美一区二区三区在线看 | 欧美一区二区综合 | 中文字字幕在线中文乱码范文 | 日韩国产中文字幕 |