我認(rèn)為有一種趨勢(shì)——至少在初級(jí)開(kāi)發(fā)人員中——認(rèn)為代碼越短越好。但情況并非總是如此。
我認(rèn)為有一種趨勢(shì)——至少在初級(jí)開(kāi)發(fā)人員中——認(rèn)為代碼越短越好。(在我之后重復(fù):更短并不總是更好。)我當(dāng)然會(huì)成為這種思路的犧牲品,即使我知道這是錯(cuò)誤的。這就是為什么當(dāng)我發(fā)現(xiàn)它時(shí),我認(rèn)為隱含else是自切片面包以來(lái)最好的東西。
直到一位高級(jí)開(kāi)發(fā)人員對(duì)我進(jìn)行了其他教育。
本·懷特在Unsplash上拍攝。這是我被嚇壞了。
這是什么隱含的 ‘ else’?
如果您已經(jīng)熟悉該概念,請(qǐng)?zhí)料乱徊糠帧?duì)于其他所有人:
使用隱式elsewithif語(yǔ)句利用了return語(yǔ)句結(jié)束函數(shù)執(zhí)行這一事實(shí)。在某些情況下,這可以讓我們消除else語(yǔ)句,從而縮短代碼。
看看下面的玩具giveMeFood功能giveMeFoodImplicit。從技術(shù)上講,我們不需要 an,else因?yàn)槿绻憬o我吃巧克力(只是說(shuō)),該函數(shù)會(huì)提前返回’yum’并停止執(zhí)行。如果你沒(méi)有,那么它會(huì)返回’no Thanks’。
兩個(gè)函數(shù)——一個(gè)帶有顯式“else”,一個(gè)帶有隱式“else”
事實(shí)上,我可以添加更多if…return語(yǔ)句來(lái)代替if…else,最后添加一個(gè)默認(rèn)值return!看起來(lái)更干凈,不是嗎?這是否意味著我們可以else永遠(yuǎn)吻別?
使用 if…return 代替 if…else
為什么以及何時(shí)避免隱含’else’
肯定有使用隱式的場(chǎng)合else,但這是高級(jí)開(kāi)發(fā)人員向我建議的:
這是一個(gè)例子來(lái)說(shuō)明他的意思。
假設(shè)我們有一個(gè)函數(shù)可以檢查用戶選擇的國(guó)家,并返回一個(gè)撥號(hào)代碼。目前,checkCountryCode僅用于處理”United States”和”United Kingdom”作為參數(shù)。else使用隱式完全省略第二個(gè)條件并縮短代碼是很誘人的。
checkCountryCode 函數(shù)最初僅用于處理兩個(gè)輸入,因此很想使用隱式 else
如果我們以后想要擴(kuò)展該功能以處理更多國(guó)家(例如烏拉圭和烏茲別克斯坦),就會(huì)出現(xiàn)問(wèn)題。很容易忘記或混淆隱式return應(yīng)該處理的內(nèi)容(在這種情況下,+44如果輸入是,它應(yīng)該返回”United Kingdom”)!
當(dāng)我們開(kāi)始擴(kuò)展函數(shù)以處理更多國(guó)家/地區(qū)時(shí),很容易忘記隱含的 else 應(yīng)該處理什么條件!
現(xiàn)在這是用顯式elses 重寫的代碼。它肯定會(huì)更長(zhǎng),但現(xiàn)在如果有人經(jīng)過(guò)我們尚未考慮的國(guó)家/地區(qū),則會(huì)引發(fā)錯(cuò)誤——如果此函數(shù)嵌套在更大的代碼庫(kù)中,這將特別有用。
這個(gè)實(shí)現(xiàn)看起來(lái)有點(diǎn)冗長(zhǎng),但它更具可讀性,因此更容易擴(kuò)展
是的,你可以在沒(méi)有 final 的情況下拋出錯(cuò)誤else,但這是我們需要問(wèn)自己的基本問(wèn)題:
省略elses left, right 和 center真的讓我的代碼更容易理解嗎?如果有一堆if…returns然后throw在底部突然出現(xiàn)一個(gè)聲明,其他人會(huì)很直觀地閱讀嗎?