如何寫出一個(gè)能夠避開(kāi)測(cè)試的線上詭異bug ?

一直以來(lái), 前端工程代碼中有著大量的對(duì)于接口返回字段值為null的處
理. 在實(shí)際項(xiàng)目中, 接口字段返回null的情況也是普遍狀況.
已然變成了一種合理形式.

這有什么問(wèn)題呢?

  1. 不符合接口字段的類型約定

由于前后端配合是基于接口文檔的, 每個(gè)字段都有明確的類型, 如果接口的某個(gè)字段約定是Array, 但返回的值為null, 實(shí)際上對(duì)于前端, 是類型錯(cuò)誤, null的類型是Object.

由于基于接口文檔我們預(yù)期接口返回的是Array類型,
所以, 本應(yīng)放心的使用數(shù)組的方法,
但是, 如果此時(shí)接口返回了null,
實(shí)際上是返回了Object類型,
等于違背了接口文檔的約定.

    phoneNumbers.sort()
  1. 額外的防御性代碼, 需要手工保障

由于任何值都可能是null, 在使用是都需要防御,
隨著工程發(fā)展,這種狀況會(huì)很泛濫

ps:
事實(shí)上, 對(duì)于泛前端來(lái)說(shuō), 也需要保證代碼健壯性.
但檢查的規(guī)則, 是基于接口約定的.如果不符合接口定義會(huì)統(tǒng)一彈出統(tǒng)一報(bào)錯(cuò).而不是在業(yè)務(wù)邏輯中逐一防范.

    // 如果phoneNumbers來(lái)自于接口, 且值是null , 直接就會(huì)報(bào)錯(cuò)
    const phoneNumbers: number[] = []

    // 此時(shí), 由于null的類型是object并不是array, 
    // 所以sort的方法就會(huì)在報(bào)錯(cuò).
    console.log(phoneNumbers.sort())

    // 這時(shí)只能先判斷再使用
    if (Array.isArray(phoneNumbers) ) {
      phoneNumbers.sort()  
    }
    
    // 換成不嚴(yán)謹(jǐn)?shù)暮?jiǎn)單粗暴的判斷方式
    phoneNumbers && phoneNumbers.sort()

那么為什么后端要返回null呢?

  1. 語(yǔ)言特性

java語(yǔ)言: 認(rèn)為返回默認(rèn)值會(huì)占用內(nèi)存, 比如空數(shù)組也需要占用內(nèi)存, 空字符串也要占用內(nèi)存.

  1. 開(kāi)發(fā)成本

對(duì)于一些后端工程, 想要加默認(rèn)值, 成本非常高, 需要逐個(gè)去加 (容我質(zhì)疑一下, 難道就沒(méi)有便捷的)

前端手動(dòng)書(shū)寫防御性代碼會(huì)帶來(lái)什么問(wèn)題?

1.難以避免的疏忽

所有依靠手動(dòng)保障的工作, 本質(zhì)上都是在對(duì)賭一個(gè)詞: “認(rèn)真”, 顯然, 智者千慮必有一失, 誰(shuí)都不能確保沒(méi)有疏忽, 如果可能使用工具代替手工才是出路.

2.難以測(cè)試, 成為線上質(zhì)量的隱患

這種防御性代碼帶來(lái)的問(wèn)題,本質(zhì)上是由數(shù)據(jù)不符合規(guī)范導(dǎo)致的, 往往開(kāi)發(fā)測(cè)試階段, 數(shù)據(jù)都是理想的, 甚至線上回歸測(cè)試時(shí)也沒(méi)問(wèn)題, 但經(jīng)常有一些線上故障是這樣的

1. 前端功能發(fā)生致命錯(cuò)誤,導(dǎo)致交互無(wú)法繼續(xù)

由于接口返回的數(shù)據(jù)沒(méi)有遵守按照協(xié)議, 導(dǎo)致的前端錯(cuò)誤.

2. 沒(méi)有報(bào)錯(cuò), 但流程異常

舉個(gè)例子: 某個(gè)枚舉值, 對(duì)應(yīng)著前端的單選框,
例如 是/否 , 起初約定0: 是, 1: 否 , 但由于某種原因數(shù)據(jù)變成了1: 是, 2: 否 ,
從交互上就出現(xiàn)了問(wèn)題且一般不會(huì)報(bào)錯(cuò).
隨著交互繼續(xù)進(jìn)行, 問(wèn)題將難以定位,
在這過(guò)程中流失的用戶訂單將會(huì)與定位、解決問(wèn)題的時(shí)間成正比, 實(shí)為不能承受之重.

現(xiàn)在, 我們面臨的問(wèn)題是什么?

  1. 如何保證泛前端代碼在數(shù)據(jù)交換時(shí)的健壯性.
  2. 前端工程的可維護(hù)性, 是否重要?
  3. 線上質(zhì)量與性能到底哪個(gè)重要?

以下的認(rèn)知, 期待我們能達(dá)成共識(shí):

前后端通過(guò)接口文檔(協(xié)議約定)進(jìn)行數(shù)據(jù)交換合作, 例如: 每一個(gè)字段“是否必須”, 字段類型, 枚舉, 都有唯一性的明確約定. 雙方都須遵守?cái)?shù)據(jù)交換協(xié)議, 才能保證線上質(zhì)量.


解決方案當(dāng)然也是有的, 請(qǐng)關(guān)注下一期, :
《如何不增加泛前端維護(hù)成本又能增強(qiáng)數(shù)據(jù)交換過(guò)程中泛前端代碼的健壯性》 ?


推薦給后端同學(xué)的參考閱讀:

不要再返回Null了
https://juejin.im/post/6844903683436576776

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜈敢,隨后出現(xiàn)的幾起案子辜荠,更是在濱河造成了極大的恐慌,老刑警劉巖抓狭,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯病,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡否过,警方通過(guò)查閱死者的電腦和手機(jī)午笛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苗桂,“玉大人药磺,你說(shuō)我怎么就攤上這事∶何埃” “怎么了癌佩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)便锨。 經(jīng)常有香客問(wèn)我围辙,道長(zhǎng),這世上最難降的妖魔是什么鸿秆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任酌畜,我火速辦了婚禮怎囚,結(jié)果婚禮上卿叽,老公的妹妹穿的比我還像新娘。我一直安慰自己恳守,他們只是感情好考婴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著催烘,像睡著了一般沥阱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伊群,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天考杉,我揣著相機(jī)與錄音,去河邊找鬼舰始。 笑死崇棠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丸卷。 我是一名探鬼主播枕稀,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萎坷?” 一聲冷哼從身側(cè)響起凹联,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哆档,沒(méi)想到半個(gè)月后蔽挠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虐呻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年象泵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟叼。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偶惠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朗涩,到底是詐尸還是另有隱情忽孽,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布谢床,位于F島的核電站兄一,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏识腿。R本人自食惡果不足惜出革,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渡讼。 院中可真熱鬧骂束,春花似錦、人聲如沸成箫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹬昌。三九已至混驰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皂贩,已是汗流浹背栖榨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留明刷,地道東北人婴栽。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遮精,于是被迫代替她去往敵國(guó)和親居夹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子败潦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348