别再用Else语句写代码了!
作者丨Joey Colon
譯者丨核子可樂(lè)
策劃丨小智
if…else 語(yǔ)句是許多程序員在寫(xiě)代碼時(shí)最常用的方式之一。你甚至可以看到許多程序員的代碼中嵌套著無(wú)數(shù) else 語(yǔ)句。可這樣,真的好嗎?一篇關(guān)于衛(wèi)語(yǔ)句的實(shí)用介紹。
在剛開(kāi)始接觸編程時(shí),我多希望能有人在我摸索著開(kāi)發(fā)第一個(gè)網(wǎng)站的過(guò)程中,給我分享一點(diǎn)中肯的人生經(jīng)驗(yàn)……
那會(huì)兒我犯下的第一個(gè)大錯(cuò)誤,就是在編寫(xiě)條件時(shí)過(guò)度使用 else 關(guān)鍵字。不只是我,后來(lái)我發(fā)現(xiàn)很多開(kāi)發(fā)者朋友都有這個(gè)問(wèn)題,所以我打算在今天的文章里好好聊聊這件事。
免責(zé)聲明:本文純粹是我自己的主觀感受。
在某些情況下,我們可能沒(méi)辦法在代碼里使用這類(lèi)方法。有時(shí)候,使用 else 關(guān)鍵字確實(shí)是最好的解決方案。這些我都承認(rèn),本文只是想給大家提供一點(diǎn)關(guān)于構(gòu)建邏輯的新思路。
縮進(jìn)波動(dòng)拳!
衛(wèi)語(yǔ)句根據(jù)維基百科的介紹,衛(wèi)語(yǔ)句是對(duì)完整性前提條件檢查。用于避免在執(zhí)行期間發(fā)生錯(cuò)誤。
望之不似人言,下面我就用普通話翻譯翻譯。我們首先得先對(duì)前提條件(在代碼開(kāi)頭)進(jìn)行完整性檢查,這樣才能避免主邏輯流程當(dāng)中出現(xiàn)錯(cuò)誤。
在理想的流程中(當(dāng)驗(yàn)證正確時(shí)),我們希望程序的主邏輯在驗(yàn)證之后才開(kāi)始運(yùn)行。
現(xiàn)在讓我們假設(shè)自己在運(yùn)營(yíng)一個(gè)網(wǎng)站,其中包含一個(gè)高級(jí)購(gòu)買(mǎi)區(qū)域,僅限付費(fèi)客戶在每天夜里 12 點(diǎn)之后訪問(wèn)。
<?php if ($user != null) { if (time() >= strtotime('12 pm')) { if ($user->hasAccess(UserType.PREMIUM)) { if ($store->hasItemsInStock()) { // the content a premium user user should be able to see when the store is in stock // after 12pm. } else { return 'We are completely sold out.'; } } else { return 'You do not have premium access to our website.'; } } else { return 'This section is not opened before 12PM'; } } else { return 'You are not signed in.'; }在實(shí)際應(yīng)用中,我們可能會(huì)返回某種形式的異常。
雖然這是一種條件流方案,但即使其中只包含少量 else 關(guān)鍵字,我們也很難跟上這樣的條件思路。
這還只是條件邏輯的一個(gè)簡(jiǎn)單示例。在實(shí)際場(chǎng)景當(dāng)中,大家肯定遇到過(guò)對(duì)邏輯極為復(fù)雜的類(lèi)進(jìn)行導(dǎo)航的狀況。在我看來(lái),這樣的編碼方式缺乏可持續(xù)性,我們應(yīng)該采取更好的辦法。
使用衛(wèi)語(yǔ)句,我們可以遵循以下框架:
<?php if (condition1()) { return ...; } if (condition2()) { return ...; } // Input is valid. doSomething();利用這套框架,我們可以重構(gòu)以前的代碼,具體如下所示:
<?php if ($user == null) { return 'You are not signed in.'; } if (time() < strtotime('12 pm')) { return 'This section is not opened before 12PM'; } if (!$user->hasAccess(UserType.PREMIUM)) { return 'You do not have premium access to our website'; } if (!$store->hasItemsInStock()) { return 'We are completely sold out.'; } // the content a premium user user should be able to see when the store is in stock // after 12pm.在衛(wèi)語(yǔ)句中,我們通常將布爾表達(dá)式反轉(zhuǎn)為我們想要 assert 的內(nèi)容。如果我們希望用戶在登錄之后才能查看此頁(yè)面,那么首先就得檢查他們是否已經(jīng)登錄。
這種方法實(shí)現(xiàn)了相同的精確邏輯流程,但在我看來(lái),這體現(xiàn)出了更為清晰的條件邏輯處理方法。
總結(jié)在編程時(shí),我們應(yīng)該始終牢記這樣一個(gè)問(wèn)題:“這些代碼能夠穩(wěn)定執(zhí)行至少 6 個(gè)月嗎?”
就當(dāng)下來(lái)講,這些代碼也許能夠很好地解決問(wèn)題。但是未來(lái)呢?在編寫(xiě)代碼時(shí)不考慮后續(xù)需求,顯然是種愚蠢的行為。
考慮到這一點(diǎn),我果斷放棄了那些已經(jīng)修復(fù)過(guò)無(wú)數(shù)次的代碼,從零開(kāi)始編寫(xiě)功能。是的,這樣才能徹底解決掉技術(shù)債務(wù)。
適當(dāng)運(yùn)用衛(wèi)語(yǔ)句,大家將能夠?yàn)樽约耗酥翀F(tuán)隊(duì)的開(kāi)發(fā)成果奠定堅(jiān)實(shí)的基礎(chǔ),從而在未來(lái)需要時(shí)隨時(shí)滿足種種新增需求。
原文鏈接:
https://medium.com/better-programming/why-you-need-to-stop-using-else-statements-5b1fd09dea9e
有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號(hào)
好文章,我在看??
總結(jié)
以上是生活随笔為你收集整理的别再用Else语句写代码了!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 于校园赠祥博
- 下一篇: Java按照时间顺序从hbase中读出数