關(guān)于 let it crash 編程哲學(xué)的一個(gè)小細(xì)節(jié)

Erlang/Elixir鼓勵(lì) let it crash的編程哲學(xué)。此刻不是要記錄什么是let it crash,而是寫(xiě)代碼時(shí)想到了一個(gè)小細(xì)節(jié)。

這個(gè)小細(xì)節(jié)就是,函數(shù)調(diào)用時(shí),盡量捕獲到你希望獲得的返回值。

例如你依賴(lài)的某個(gè)第三方庫(kù)的api可能是這樣:

@spec foo -> :ok | {:error, reason}

而如果你對(duì)代碼過(guò)于自信、認(rèn)為返回值肯定是:ok的話,很可能就會(huì)這么調(diào)用:

def bar do
  foo
end

上述代碼是有危險(xiǎn)的,它沒(méi)有捕獲函數(shù)的返回值。
假設(shè)foo/0是個(gè)保存文件的函數(shù),而保存文件一般情況下肯定會(huì)成功,所以代碼編寫(xiě)者慣性思維地認(rèn)為foo/0一定會(huì)返回:ok,但若是在磁盤(pán)順壞、空間剩余不足等情況下也有可能使得該操作失敗,也就是說(shuō),這個(gè)bar/0實(shí)現(xiàn)有潛在危險(xiǎn)!
我認(rèn)為對(duì)bar/0比較好的改寫(xiě)是:

def bar do
  :ok = foo
end

僅僅是加了一個(gè)match。
加了這個(gè)match,若foo/0返回了我們討厭看到的{:error, reason},則該進(jìn)程就會(huì)報(bào)異常,也就是let it crash。之后我們檢查日志,就能發(fā)現(xiàn)一些潛在的危險(xiǎn),比如磁盤(pán)順壞,就立刻修復(fù)磁盤(pán)或者遷移文件等。

再舉個(gè)例子:

# 第三方庫(kù)
@spec foo -> :ok

# 調(diào)用者代碼
def bar do
    foo
end

這次的調(diào)用總不會(huì)出問(wèn)題了吧?你看foo/0肯定會(huì)返回:ok的,再去捕捉它的返回值,這不是多此一舉嗎?
那我想問(wèn),如果這個(gè)第三方庫(kù)版本升級(jí),foo/0這個(gè)api也升級(jí)為如下形式了呢?這不是不可能吧~

@spec foo -> :ok | {:error, reason}

所以,更穩(wěn)妥的寫(xiě)法還是加個(gè)match捕獲期望的函數(shù)返回值吧。

// 其實(shí)上述例子都不怎么好,可我現(xiàn)在手頭又沒(méi)有比較好的例子,先湊活著這樣吧

推薦

Writing assertive code with Elixir

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評(píng)論 19 139
  • 從匹配中返回值 Match 對(duì)象 成功的匹配總是返回一個(gè) Match 對(duì)象, 這個(gè)對(duì)象通常也被放進(jìn) $/ 中, (...
    焉知非魚(yú)閱讀 1,937評(píng)論 0 1
  • http://python.jobbole.com/85231/ 關(guān)于專(zhuān)業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,806評(píng)論 1 118
  • 已經(jīng)許久沒(méi)有看過(guò)電影了,也不知道庸碌里,我付諸歲月的,到底是些什么。 等到終于閑下來(lái),坐在電腦面前...
    春水枕寒流閱讀 585評(píng)論 0 0

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