編寫「可讀」代碼的實踐 - 接口篇

本來想寫一個怎么寫好代碼的主題,昨天突然看到了淘寶團隊的這篇文章《編寫「可讀」代碼的實踐》,把我想到的沒想到的基本都說了。然后我就想重復(fù)的內(nèi)容就不說了(別人講的比我透徹)饲鄙,我自己就補充下自己對于接口幾點想法,然后標(biāo)題呢圆雁,我就死皮賴臉的抱下大腿了忍级。

修改接口

一般來說,對于現(xiàn)有系統(tǒng)我們原則上不主張修改已有接口伪朽,如果原有接口有問題或者沒有辦法滿足要求了轴咱,那么我們會新增接口,然后在調(diào)用的地方替換掉老接口烈涮。如果直接修改現(xiàn)有接口會影響到所有調(diào)用此接口的地方朴肺,一旦修改后的接口出現(xiàn)問題,那么將影響整個系統(tǒng)的穩(wěn)定性坚洽。而新增接口戈稿,如果出現(xiàn)問題只要通過簡單的修改調(diào)用處的代碼即可回退。如果一定要修改老接口讶舰,那么要遵循一定的原則:

1. 輸入輸出不能有變化(此時有單元測試的好處就體現(xiàn)出來了)鞍盗。

2. 接口的行為不能有變化需了,同步的接口不能變成異步,反之亦然橡疼,原來不拋異常的不能變成拋異常。

接口實現(xiàn)要高內(nèi)聚

這里高內(nèi)聚主要談的是接口要把自身的異陈郏或者差異化在本身的實現(xiàn)中處理掉欣除,不能把自身的問題傳導(dǎo)到接口之外。譬如說前端通過瀏覽器獲得的 language code挪略,可能大小寫和格式因每個瀏覽器的實現(xiàn)有差異化历帚,那么我們封裝一個接口 getLanguageCode 就要把這個差異化在接口內(nèi)處理掉,保證這個接口返回的結(jié)果是標(biāo)準(zhǔn)化的杠娱,調(diào)用者拿到這個返回值在傳給其他模塊甚至后臺時一定是可預(yù)測的值(符合規(guī)范)挽牢。如果你把自身的差異化擴散到其他接口,模塊或者系統(tǒng)摊求,帶來得就不單單是可維護性的風(fēng)險:

1. 其他系統(tǒng)的維護者不一定明白為什么對這種情況需要做特殊處理禽拔,增加了維護的難度。

2. 即使其他系統(tǒng)對你的輸出做了特殊處理室叉,但是一旦你的異扯闷埽或者差異化變化了,那么修改會涉及到多個系統(tǒng)茧痕,整個系統(tǒng)的穩(wěn)定性就降低了野来。

3. 最壞的情況是某個系統(tǒng)的異常情況處理傳播到了整個系統(tǒng)鏈的多個環(huán)節(jié),一旦出現(xiàn)問題踪旷,非常難追查源頭曼氛。

接口輸出的一致性

籠統(tǒng)的說就是方法的返回類型最好能保持一致,即缺省的狀態(tài)下和非缺省的狀態(tài)下返回值的類型要一致令野,譬如getUsername舀患,如果能獲取到用戶名則返回一個 string 的用戶名,如果允許用戶不填用戶名气破,則此時調(diào)用 getUsername 應(yīng)該返回空字符串 ''构舟,而不是 undefined 或者 null。這點在前端也是非常好用堵幽,通常獲取到字符串后都需要在界面上展示狗超,如果缺省返回 undefined,則需要再增加一次判斷朴下,當(dāng) undefined 的時候在頁面上展示空字符串努咐,如果返回類型一致就不需要這一步。

原始類型的返回值比較好統(tǒng)一殴胧,非原始類型就需要分情況討論了渗稍。

第一種情況佩迟,返回類型的對象表示的是數(shù)據(jù)結(jié)構(gòu),譬如系統(tǒng)定義了用戶可以有多個聯(lián)系方式竿屹,那么 getUserContact 定義為返回一個數(shù)組报强,數(shù)組項是用戶的填寫的手機號,當(dāng)用戶未填或者查詢不到手機號時拱燃,getUserContact 應(yīng)該返回空數(shù)據(jù) [] 而不是 undefined秉溉。這么做的好處是,一般調(diào)用返回數(shù)據(jù)結(jié)構(gòu)的接口后碗誉,都需要對數(shù)據(jù)結(jié)構(gòu)進行操作召嘶,比如遍歷,篩選哮缺。如果返回類型一致就不需要對是否異常情況進行判斷(調(diào)用者不會迷惑說到底沒有聯(lián)系方式返回的結(jié)果是 undefined 還是 null 還是 []弄跌,對調(diào)用者友好)。

第二種情況尝苇,返回的對象本身表示的是一個 domain object铛只,譬如獲取賬戶信息 getUserAccountInfo,返回的應(yīng)該是一個 AccountInfo 的 domain object糠溜,那么如果用戶沒有填寫或者獲取不到格仲,返回應(yīng)該是一個 null,而不是一個空對象 {}诵冒。因為返回值本身是否為 null 是有現(xiàn)實意義的凯肋,表示是否存在對應(yīng)對象。和第一種情況的區(qū)別是汽馋,第一種情況數(shù)據(jù)如果不存在是通過數(shù)據(jù)項來表示的(array.length===0, map.entries().length===0)侮东,數(shù)據(jù)結(jié)構(gòu)本身是不應(yīng)該變化的。這里為什么選擇 null 而不是 undefined豹芯,也是想把沒有這個對象和_未定義這個對象_這兩種情況區(qū)分開來悄雅,當(dāng)然這個約定不是強制的。

接口輸出一致性原則我們在 js 的眾多 api 中都能找到很好的體現(xiàn)铁蹈,譬如 Array.prototype.findIndex 如果沒有找到 index 則返回的是-1宽闲,譬如 Array.prototype.filter 如果過濾不出符合條件的項目則返回的是空數(shù)組。譬如 Array.prototype.find 如果找到到符合條件的則返回 undefined握牧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末容诬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沿腰,更是在濱河造成了極大的恐慌览徒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颂龙,死亡現(xiàn)場離奇詭異习蓬,居然都是意外死亡纽什,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門躲叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芦缰,“玉大人,你說我怎么就攤上這事枫慷∪美伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵流礁,是天一觀的道長涕俗。 經(jīng)常有香客問我罗丰,道長神帅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任萌抵,我火速辦了婚禮找御,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绍填。我一直安慰自己霎桅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布讨永。 她就那樣靜靜地躺著滔驶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卿闹。 梳的紋絲不亂的頭發(fā)上揭糕,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音锻霎,去河邊找鬼著角。 笑死,一個胖子當(dāng)著我的面吹牛旋恼,可吹牛的內(nèi)容都是我干的吏口。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冰更,長吁一口氣:“原來是場噩夢啊……” “哼产徊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜀细,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤囚痴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后审葬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體深滚,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡奕谭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痴荐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片血柳。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖生兆,靈堂內(nèi)的尸體忽然破棺而出难捌,到底是詐尸還是另有隱情,我是刑警寧澤鸦难,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布根吁,位于F島的核電站,受9級特大地震影響合蔽,放射性物質(zhì)發(fā)生泄漏击敌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一拴事、第九天 我趴在偏房一處隱蔽的房頂上張望沃斤。 院中可真熱鬧,春花似錦刃宵、人聲如沸衡瓶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮针。三九已至,卻和暖如春坦袍,著一層夾襖步出監(jiān)牢的瞬間十厢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工键闺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寿烟,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓辛燥,卻偏偏與公主長得像筛武,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挎塌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法徘六,類相關(guān)的語法,內(nèi)部類的語法榴都,繼承相關(guān)的語法待锈,異常的語法,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理嘴高,服務(wù)發(fā)現(xiàn)竿音,斷路器和屎,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • ???人類的三大禁忌,就是性春瞬、金錢和死亡柴信。 為了證明俺對這三個話題不可置疑滴權(quán)威性,首先請允許俺用一種傲嬌的姿勢拋...
    喬拙閱讀 515評論 0 0
  • 這周的學(xué)習(xí)內(nèi)容是觀看了著名的財經(jīng)視頻-《對話》中稻盛和夫在2011參加的那一期宽气,其中有一個片段是讓三位企業(yè)嘉賓根據(jù)...
    hualincool閱讀 239評論 0 0
  • GPIO基本結(jié)構(gòu)和工作方式 GPIO寄存器說明 GPIO引腳說明 FT 5V容忍(3.3V随常,可以忍受5V) 四種...
    MecZhang閱讀 3,986評論 0 1