" if…else 語句是許多程序員在寫代碼時最常用的方式之一。你甚至可以看到許多程序員的代碼中嵌套著無數(shù) else 語句?蛇@樣,真的好嗎? 一篇關(guān)于衛(wèi)語句的實(shí)用介
if…else 語句是許多程序員在寫代碼時最常用的方式之一。你甚至可以看到許多程序員的代碼中嵌套著無數(shù) else 語句。可這樣,真的好嗎?
一篇關(guān)于衛(wèi)語句的實(shí)用介紹。
在剛開始接觸編程時,我多希望能有人在我摸索著開發(fā)第一個網(wǎng)站的過程中,給我分享一點(diǎn)中肯的人生經(jīng)驗……
那會兒我犯下的第一個大錯誤,就是在編寫條件時過度使用 else 關(guān)鍵字。不只是我,后來我發(fā)現(xiàn)很多開發(fā)者朋友都有這個問題,所以我打算在今天的文章里好好聊聊這件事。
免責(zé)聲明:本文純粹是我自己的主觀感受。
在某些情況下,我們可能沒辦法在代碼里使用這類方法。有時候,使用 else 關(guān)鍵字確實(shí)是最好的解決方案。這些我都承認(rèn),本文只是想給大家提供一點(diǎn)關(guān)于構(gòu)建邏輯的新思路。
衛(wèi)語句
根據(jù)維基百科的介紹,衛(wèi)語句是對完整性前提條件檢查。用于避免在執(zhí)行期間發(fā)生錯誤。
望之不似人言,下面我就用普通話翻譯翻譯。我們首先得先對前提條件(在代碼開頭)進(jìn)行完整性檢查,這樣才能避免主邏輯流程當(dāng)中出現(xiàn)錯誤。
在理想的流程中(當(dāng)驗證正確時),我們希望程序的主邏輯在驗證之后才開始運(yùn)行。
現(xiàn)在讓我們假設(shè)自己在運(yùn)營一個網(wǎng)站,其中包含一個高級購買區(qū)域,僅限付費(fèi)客戶在每天夜里 12 點(diǎ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)用中,我們可能會返回某種形式的異常。
雖然這是一種條件流方案,但即使其中只包含少量 else 關(guān)鍵字,我們也很難跟上這樣的條件思路。
這還只是條件邏輯的一個簡單示例。在實(shí)際場景當(dāng)中,大家肯定遇到過對邏輯極為復(fù)雜的類進(jìn)行導(dǎo)航的狀況。在我看來,這樣的編碼方式缺乏可持續(xù)性,我們應(yīng)該采取更好的辦法。
使用衛(wèi)語句,我們可以遵循以下框架:
<?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)語句中,我們通常將布爾表達(dá)式反轉(zhuǎn)為我們想要 assert 的內(nèi)容。如果我們希望用戶在登錄之后才能查看此頁面,那么首先就得檢查他們是否已經(jīng)登錄。
這種方法實(shí)現(xiàn)了相同的精確邏輯流程,但在我看來,這體現(xiàn)出了更為清晰的條件邏輯處理方法。
總結(jié)
在編程時,我們應(yīng)該始終牢記這樣一個問題:“這些代碼能夠穩(wěn)定執(zhí)行至少 6 個月嗎?”
就當(dāng)下來講,這些代碼也許能夠很好地解決問題。但是未來呢?在編寫代碼時不考慮后續(xù)需求,顯然是種愚蠢的行為。
考慮到這一點(diǎn),我果斷放棄了那些已經(jīng)修復(fù)過無數(shù)次的代碼,從零開始編寫功能。是的,這樣才能徹底解決掉技術(shù)債務(wù)。
適當(dāng)運(yùn)用衛(wèi)語句,大家將能夠為自己乃至團(tuán)隊的開發(fā)成果奠定堅實(shí)的基礎(chǔ),從而在未來需要時隨時滿足種種新增需求。
"美國國家航空航天局已發(fā)出近10億 Dell的新款Precision 7000系列移 蘇寧中華第一店的“倒退”顯示出 Microsoft Surface go 2已通過En 如何連接裝修工人的訂單接收平臺 這21個應(yīng)用程序是非法的! 您可 YouTube每分鐘產(chǎn)生32000美元的廣 頻頻挖角高管抱怨午夜,魅族的應(yīng) 當(dāng)場推翻原版! AI不承認(rèn)上帝, 數(shù)字基礎(chǔ)共享視頻介紹了VRS可變 北通云企業(yè)照明站,3分鐘發(fā)布一 100智能大廈 新聞:2020年13英寸Macbook Pro 閱讀對最近查詢的回應(yīng):全面推動 餐飲業(yè)的創(chuàng)新,變革和利潤保證 國家緊急響應(yīng)為2級或以下; 特斯 巴菲特:尚未找到感興趣的公司 Apple的新消息專利:重新編輯發(fā) 沒有贏得原始的跑步成績,并且沒 長鑫家用DDR4內(nèi)存芯片/顆粒處理 在原始的win10中搜索其他瀏覽器 巴菲特的Alpha:使用機(jī)器學(xué)習(xí)量 圖片預(yù)覽界面中的新增長焦點(diǎn)圖片 巴菲特:麝香做得很棒,但不會投 閱讀:作家座談會于5月6日啟動, 原始IOS 13.5 beta 3帶來了有關(guān) 中國人民銀行:恢復(fù)生產(chǎn)的狀況正 原裝國內(nèi)最差的手機(jī)系統(tǒng):華為的 比亞迪與華為合作! 趙長江:特 經(jīng)典gal“ MUV luv”將發(fā)布在Ste