<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          設計一個高質量的 API 接口

          共 2263字,需瀏覽 5分鐘

           ·

          2022-06-09 11:53

          大家好,我是寶哥!

          你是否也感同身受?

          • 對接XX業(yè)務時,XX業(yè)務具備的功能和API全靠跑業(yè)務負責人那反復逐個詢問、確認。用哪個API;怎么用;有沒有限制;等等
          • 各個業(yè)務間,甚至同一業(yè)務內,API風格不統(tǒng)一。
            • API命名: 按自然語義全翻譯的;按屬性角度定義的;按操作角度定義的;動賓、非動賓的;復數(shù)、非復數(shù)的;等等
            • API入?yún)ⅲ?/strong> 帶Map的;相同語義字段名稱不一樣;
            • API出參: 有包裝Resoponse的;直接返回結果數(shù)據(jù)的;相同數(shù)據(jù),返回格式和字段名稱有差別的;
            • 錯誤信息: 直接返回中文提示的;返回提示信息編碼的;返回異常類型的;等等
          • XX業(yè)務API性能方面未知。
          • 隨著業(yè)務的演進,開放的API持續(xù)在增加,但類同的很多

          API編碼規(guī)范迫在眉睫

          優(yōu)秀API的特質

          自解釋
          • 從API本身一眼就能看懂API是干什么的,支持的用法,適用的場景,異常的處理等
          易學習
          • 有完善的文檔,以及提供盡可能多的示例和可copy-paste的代碼。
          易使用
          • 功能強大,但使用簡單。不增加調用方的使用成本(例如要求業(yè)務方用API時需要額外的配置和依賴),不暴露復雜的細節(jié)、冗長的使用流程給調用方感知。調用方只做最小的感知和最少的傳參。
          難誤用
          • 優(yōu)秀的API可以使有經驗的開發(fā)直接使用API而不需要閱讀文檔。
          • 充分的靜態(tài)檢查、動態(tài)校驗、顯式的異常說明、有效的錯誤提示。

          API 設計原則

          1. 充分原則

          不是隨便一個功能就要有個接口,也不是隨便一個需求就要加個接口。

          每新建一個接口,要有充分的理由和考慮,即這個接口的存在是十分有意義和價值的。無意義的接口不僅增加了維護的難度,更重要是對于程序的可控性的大大降低,接口也會十分臃腫。

          2. 單一視角原則

          設計接口時,分析的角度要統(tǒng)一。否則會造成接口結構的混亂。例如:不要一會以角色的角度設計,一會兒就要以功能的角度設計。

          推薦:以"屬性對象 + 行為"的視角定義API

          3. 單一功能原則

          每個API接口應該只專注一件事,并做好。產品概念簡單、關系清楚。功能模棱兩可,諸多特殊邏輯的API肯定不是個優(yōu)雅的API,且會造成功能類似重復的API。

          注:如果API它很難命名,那么這或許是個不好的征兆,好的名稱可以驅動開發(fā)、并且只需拆分與合并模塊即可。

          功能大而全的API在靈活性、簡單性方面肯定捉襟見肘。定義API的粒度之前,建議先將業(yè)務分領域、劃邊界,以此來提取業(yè)務對象,然后再根據(jù)業(yè)務對象用例來設計單一功能的API。

          比如:查詢會員,可能除了查詢會員表外還要獲取該會員的其他必要信息,但不要在查詢會員的同時還有修改權限等類似的其他業(yè)務功能,應該分成兩個接口執(zhí)行。

          4. 簡單原則

          接口設計簡單、清晰。API執(zhí)行的功能可以很豐富、很強大,但API聲明和用法一定要盡量的簡單,不能將功能的豐富通過復雜的用法來實現(xiàn),這會導致API功能不單一,演進不可控。

          最終的評審要看API的簡單易用程度。

          • 你寫的例子,能不能讓你的代碼看起來更簡單?
          • 你是不是強迫調用方關注/提供他們不在乎的選項/配置?
          • 有沒有毫無價值的額外步驟?

          編寫的代碼一定要易于讀、易于理解,這樣別人才會欣賞,也能夠給你提出合理化的建議。相反,若是繁雜難解的程序,其他人總是會避而遠之的。

          5. 抽象原則

          API的入?yún)ⅰ⒊鰠⑺龅膶ο蟆傩裕欢ㄊ前礃I(yè)務特性進行抽象后的實體。誤將底層數(shù)據(jù)模型概念如實的反應到API上。抽象API、抽象對象實體更宏觀,具有更好的適用性、兼容性、擴展性。

          6. 兼容擴展原則

          對擴展開放,對修改關閉。保證API的向后兼容。

          擴展參數(shù)應當是便利的,保證后續(xù)類似的需求,可以在已有的API上通過兼容擴展的方式實現(xiàn)。

          7. 最小驚訝原則

          代碼應該盡可能減少讓讀者驚喜。業(yè)務API只需根據(jù)需求來設計即可,不需要刻意去設計一下復雜無用、華而不實的API,以免弄巧成拙。

          8. 低耦合原則

          API應該減少對其他業(yè)務代碼的依賴關系。低耦合往往是完美結構系統(tǒng)和優(yōu)秀設計的標志。

          耦合的種類:

          • 代碼實現(xiàn)業(yè)務逆向調用。
          • 條件邏輯依賴耦合。 例如:此API在處理國稅網超訂單類型時,需要額外發(fā)送結算支付憑證上傳的事件MQ出來。
          • 耦合API無關的業(yè)務行為。 例如:采購計劃鏈路日志API被調用時,若是項目采購委托單的情況,需要額外調用公告的API拉取鏈路信息,新建成為一條此委托單的一條鏈路日志。
          9. 正交原則

          正交性是指改變某個特性而不會影響到其他的特性。

          API之間的功能應該成正交性,無功能重合。API之間應該是互相補充的關系。

          10. 易測試原則

          對于API調用者而言,API應該是可被測試且易于被測試的。測試API不需要依賴額外的環(huán)境、容器、配置、公共服務等。

          對可測試友好的API也是可被有效集成測試的前提。

          11. 統(tǒng)一原則

          API要具備統(tǒng)一的命名、統(tǒng)一的入/出參規(guī)范、統(tǒng)一的異常規(guī)范、統(tǒng)一的錯誤碼規(guī)范、統(tǒng)一的版本規(guī)范等。

          統(tǒng)一規(guī)范的API優(yōu)點:

          • 易于被框架集成、處理
          • 有助于API調用方、API提供方開發(fā)經驗復用
          • 避免犯錯,避免誤用

          來源:blog.csdn.net/weixin_43318367/article/

          details/108746057

          精彩推薦:

          SpringBoot 實現(xiàn) Office 各種格式在線預覽(詳細教程,包教包會)

          xxl-job驚艷的設計,怎能叫人不愛

          Fluent Mybatis 牛逼!

          從零搭建基于SpringCloud Alibaba 鑒權中心服務(詳細教程)

          還在手動部署jar包?太low了,動態(tài)上傳jar包熱部署真的爽!

          MyBatis的三種分頁方式,你用過幾種?

          瀏覽 33
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产福利在线导航 | 99精品丰满人妻无码一区二区 | 青青操视频在线观看 | 欧洲a视频 | 中文字幕av久久久久久欧洲尺码 |