API 設(shè)計(jì): 想清楚了再寫代碼(1)

作為軟件開發(fā)人員,我們很難抗拒把自己的想法寫成代碼的沖動(dòng)。當(dāng)突然有了想法,我們的手指就無法控制,就行一群野獸一樣在鍵盤上瘋跑,想用最快的速度實(shí)現(xiàn)我們的想法。

盡管這種感覺特別爽,但是我們最好還是退一步思考下,特別是當(dāng)你創(chuàng)建的東西會(huì)被很多人使用,比如一些公共API。在此篇文章中,我講為大家說明為什么和如何去設(shè)計(jì)一個(gè)深思熟慮的API。

API(Application Program Interface)是一個(gè)用于定義應(yīng)用程序接口的通用術(shù)語,換句話說,就是人或者機(jī)器是如何與機(jī)器進(jìn)行交流的。在web開發(fā)領(lǐng)域,一個(gè)API就是一個(gè)站點(diǎn)回復(fù)客戶端請(qǐng)求的結(jié)構(gòu)化文本數(shù)據(jù)的途徑。

另一個(gè)被web開發(fā)者廣泛應(yīng)用的理念是 RESTFul Web API. 是由 Roy Fielding 定義,其作為一種架構(gòu)風(fēng)格,它提供了一個(gè)完善的客戶端和服務(wù)器之間的通信協(xié)議。它有一些限制: 無狀態(tài)通信,基于已有的技術(shù)(一般是HTTP),使用超媒體作為引擎狀態(tài)。
換句話說,它提出了一些構(gòu)建web API 的模式。為了簡單起見,本文引用的Web API都是簡單API。

一個(gè)JSON勝萬言(One JSON is worth a thousand words)

看一個(gè)API響應(yīng)的例子:

{
  "data": [
    {
      "story": "Jonatas Baldin was writing a blog post.",
       "created_time": "2017-15-01T00:02:57+0000",
       "id": "624510964324764_1046909755418214"
    },
  ]
}

這個(gè)數(shù)據(jù)片段叫JSON, 這是在智能手機(jī)上看到的一個(gè)Facebook的一個(gè)狀態(tài)消息,來自于 Facebook API,是不是相當(dāng)簡潔?

現(xiàn)象一下,如果你是一個(gè)負(fù)責(zé)這個(gè)API的Facebook工程師,突然你有一天你腦子一熱決定把id字段改成message_id. 可以想象,這么一個(gè)小小的改動(dòng),有可能讓Facebook崩潰。最終導(dǎo)致所有依賴之前結(jié)構(gòu)的設(shè)備不能收集和展示給用戶內(nèi)容,這是多么操蛋的一天。

好的,糟糕的和丑陋的(The good, the bad and the ugly)

一個(gè)糟糕的API設(shè)計(jì)早晚會(huì)引起問題:

缺乏一致性:一旦一個(gè)API的增長,要?jiǎng)?chuàng)建訪問點(diǎn)往往只是為了滿足緊急需求。
很難擴(kuò)展:遇到問題很難找到擴(kuò)展突破口。
很難學(xué)習(xí):學(xué)習(xí)曲線陡峭
性能問題:后來適配的API往往是性能瓶頸
API改變無休止: 總是第一次是對(duì)的,后面都不對(duì)。

API是程序和用戶之間的契約,當(dāng)突然改變的時(shí)候不能引起混亂,這個(gè)契約要有遠(yuǎn)見。這是設(shè)計(jì)的入口:一個(gè)計(jì)劃,一個(gè)公約,一個(gè)系統(tǒng)或者是一個(gè)可評(píng)估的交流。

原文

API Design: Think First, Code Later

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評(píng)論 19 139
  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,199評(píng)論 3 119
  • 27c 為了使意見不統(tǒng)一能帶來好的結(jié)果,評(píng)估個(gè)人決策或者決策者必須在更高的層面上去看待這些問題。舉個(gè)例子,如果受到...
    財(cái)才閱讀 224評(píng)論 0 0
  • 卸載apk adb uninstall com.chaincloud.securewallet 1.查看當(dāng)前所在的...
    學(xué)費(fèi)閱讀 391評(píng)論 0 0
  • 我用新生的芽呼喚樹的名字,呼喚被風(fēng)劫持,抵達(dá)他的耳畔的消息是微渺的心音。 這樣已經(jīng)足夠了啊,輕細(xì)的酸楚鉆進(jìn)皮膚深處...
    風(fēng)輕語閱讀 713評(píng)論 0 2

友情鏈接更多精彩內(nèi)容