聊聊 if 條件句的那些小陷阱

更新於 2024/03/07閱讀時間約 4 分鐘

當我們在寫 PHP 程式碼的時候,使用 if 條件句是控制程式流程的基本方式,也是確保程式按我們預期運作的重要手段。不過,即便是對於有經驗的開發者來說,有時候也可能會不小心掉入一些 if 條件句的陷阱。這些小疏忽可能會導致程式邏輯錯亂、效能降低,或是讓程式碼變得難以閱讀和維護。下面來聊聊在使用 if 條件句時常見的一些狀況,以及如何避免這些問題。



不必要的 if 條件句

有時候我們會遇到一些場景,其實可以直接回傳一個布林值,但我們卻用了 if 條件句來做判斷。例如:

// 這樣寫就有點多此一舉
if ($condition) {
return true;
} else {
return false;
}

// 直接這樣寫就好
return $condition;


條件句太複雜

把一堆條件塞在一個 if 裡面,看起來會很亂,而且之後要改也不容易:

// 這樣寫讓人看了頭大
if ($a > 10 && $b < 5 || $c == 20 && $d != 5) {
// 做些什麼
}

// 分開寫會比較清楚
$condition1 = $a > 10 && $b < 5;
$condition2 = $c == 20 && $d != 5;

if ($condition1 || $condition2) {
// 做些什麼
}


沒用嚴格比較

在 PHP 裡面,== 和 != 不會檢查變數的型別,這有時候會帶來問題。用 === 和 !== 來做嚴格比較就能避免這類問題:

// 這樣可能會出問題
if ($value == 0) {
// 做些什麼
}

// 這樣比較妥當
if ($value === 0) {
// 做些什麼
}

if 嵌套太深

if 嵌套用多了會讓程式碼變得很難懂,也難以維護:

// 這樣寫太複雜了
if (condition1) {
if (condition2) {
if (condition3) {
// 做些什麼
}
}
}

// 嘗試簡化一下
if (!condition1) {
return;
}
if (!condition2) {
return;
}
if (condition3) {
// 做些什麼
}


邏輯運算子用錯

有時候在用 && 和 || 的時候,可能會不小心搞錯了優先順序,導致結果不如預期:

// 可能不是你想要的結果
if ($a > 10 && $b < 5 || $c > 10) {
// 做些什麼
}

// 用括號清楚地表達你的意圖
if (($a > 10 && $b < 5) || $c > 10) {
// 做些什麼
}


太依賴 if 而忽略了其他選項

有時候用 switch 或者設計模式會是更好的選擇,但我們卻習慣了只用 if

// 用 `if` 有點笨拙
if ($type == 'type1') {
// 做些什麼
} elseif ($type == 'type2') {
// 做些什麼
}

// 或許試試 `switch` 會更合適
switch ($type) {
case 'type1':
// 做些什麼
break;
case 'type2':
// 做些什麼
break;
}

其他要考慮的情境

  • 程式碼的可測試性:過度複雜的條件判斷或嵌套 if 可能會使單元測試變得困難。儘量保持函式單一職責,使得每個函式或方法都易於測試。
  • 程式碼的可讀性:即便是對你來說非常清晰的 if 條件,對於其他開發者來說可能不那麼明顯。適當的注釋和保持簡潔的邏輯可以幫助提高程式碼的可讀性。
  • 性能考量:在某些情況下,過多的 if 判斷可能會對性能造成影響,尤其是在循環中。儘量優化邏輯判斷,避免在高頻率調用的函式中使用複雜的條件判斷。


總而言之,if 陳述句是任何程式語言中不可或缺的一部分,也是控制程式流程的基礎。為了寫出高品質的程式碼,開發者需要對 if 陳述句及其陷阱有深入的理解。避免上述提到的常犯錯誤,並且時刻保持警覺,對於那些可能不是那麼明顯的潛在問題保持敏感。隨著經驗的積累,你將能夠更加熟練地運用 if 陳述句,寫出既高效又易於維護的程式碼。此外,不斷學習和探索更好的程式碼實踐,如設計模式和程式碼重構技巧,也將有助於提升你的程式設計能力。

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
要演活一個經典角色,最簡單也最常見的方法就是氣質相符。 只要角色的性格氣質跟演員本身相似,劇本演技也別太拖後腿,要把角色演成經典其實不難,目前陸劇圈就有非常多這種案例,比如趙露思的陳芊芊、成毅的禹司鳳、虞書欣的小蘭花、張凌赫的長珩、陳都靈的葉冰裳……如果時間推遠一點,還有李沁的元淳、楊洋的肖奈、楊冪
Thumbnail
失去希望與溫度的人,都是戰爭中的俘虜。「聖誕快樂」,文化差異反而彰顯了文化之上,更貼近人心所共同渴望的,對「放下仇恨」的嚮往。戰事讓稀鬆平常的祝福成了禁忌,再沒人記得可以提起。
剛剛看完@左邊女孩的“身障心無礙|身心障礙者的隱私權 : 我說謊,我無罪 ! “突然讓我想起我的小時候!但是看到他的故事,我覺得我遇到的根本就不是事嘛!XDDD 這些年其實很不想再說小時候了!因為有人會說“你總是活在過去”,有人會說“那些都過去了”,有人會說“過去就讓他過去吧!”有人會說很多很多安慰
Thumbnail
運動風潮掀起,追求體態、肌肉線條的健身達人們將乳清蛋白視為肌肉生長的必備營養品,但是光單純的乳清蛋白就有3種,該怎麼選擇?
Thumbnail
對不起,讓你們失望了... 東京奧運剛落幕,這陣子接收到非常多有關奧運的訊息, 我注意到,當輸掉比賽時,很多選手會發文表示很抱歉讓大家失望了, 為什麼要道歉呢? 這是我的疑惑,也讓我想到「讓人期待落空」, 在諮商工作中常常看到總是「很抱歉」的個案 不論是對家人或是工作,會經常感覺到自己做錯事情,讓
Thumbnail
自學生小聚是我們開始的第一步,同時也是後續延伸不同系列活動的基礎。 「我們要把自學生們聚在一起!」 無論是分享還是派對的形式,自學生們都能在這裡找尋自己可以收穫的!而自學生們以及想更了解自學的人都能把自己都入這個小世界,盡情地釋放和接收。
Thumbnail
雖然在網路上有看到很多類似"OO歲以前一定要完成的事",但我認為這些"目標"的目的,應該是類似長期的人生計畫,給自己訂下的目標,然後看著自己一步一步地朝著自己的目標前進,而帶給自己的成就感。(不是叫你完成別人的目標啦~~完成別人的目標真的有點好笑)
Thumbnail
善與惡的價值判斷,是人出自不同的社會地位和生理條件對自身的行為所做的肯定性判斷,這是尼采對善惡做出的定義。 究竟是什麼形成了我們如今的道德觀?難道「善」就一定會好過「惡」嗎? 進擊的巨人中,作者安排了多次的角色對換讓我們能更進一步思考善惡的合理性,因此我將劇情分成五大區塊討論:
Thumbnail
時差睡不著的那晚竟然突然想起了小學六年級的班導師。我對於小學時期的記憶很片段,並沒有特別對於哪一年的記憶印象深刻,甚至對於五年級那一年來說根本一片空白,我向來也不是個會特別想親近老師的人,但他卻是我非常喜歡的一位老師。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
要演活一個經典角色,最簡單也最常見的方法就是氣質相符。 只要角色的性格氣質跟演員本身相似,劇本演技也別太拖後腿,要把角色演成經典其實不難,目前陸劇圈就有非常多這種案例,比如趙露思的陳芊芊、成毅的禹司鳳、虞書欣的小蘭花、張凌赫的長珩、陳都靈的葉冰裳……如果時間推遠一點,還有李沁的元淳、楊洋的肖奈、楊冪
Thumbnail
失去希望與溫度的人,都是戰爭中的俘虜。「聖誕快樂」,文化差異反而彰顯了文化之上,更貼近人心所共同渴望的,對「放下仇恨」的嚮往。戰事讓稀鬆平常的祝福成了禁忌,再沒人記得可以提起。
剛剛看完@左邊女孩的“身障心無礙|身心障礙者的隱私權 : 我說謊,我無罪 ! “突然讓我想起我的小時候!但是看到他的故事,我覺得我遇到的根本就不是事嘛!XDDD 這些年其實很不想再說小時候了!因為有人會說“你總是活在過去”,有人會說“那些都過去了”,有人會說“過去就讓他過去吧!”有人會說很多很多安慰
Thumbnail
運動風潮掀起,追求體態、肌肉線條的健身達人們將乳清蛋白視為肌肉生長的必備營養品,但是光單純的乳清蛋白就有3種,該怎麼選擇?
Thumbnail
對不起,讓你們失望了... 東京奧運剛落幕,這陣子接收到非常多有關奧運的訊息, 我注意到,當輸掉比賽時,很多選手會發文表示很抱歉讓大家失望了, 為什麼要道歉呢? 這是我的疑惑,也讓我想到「讓人期待落空」, 在諮商工作中常常看到總是「很抱歉」的個案 不論是對家人或是工作,會經常感覺到自己做錯事情,讓
Thumbnail
自學生小聚是我們開始的第一步,同時也是後續延伸不同系列活動的基礎。 「我們要把自學生們聚在一起!」 無論是分享還是派對的形式,自學生們都能在這裡找尋自己可以收穫的!而自學生們以及想更了解自學的人都能把自己都入這個小世界,盡情地釋放和接收。
Thumbnail
雖然在網路上有看到很多類似"OO歲以前一定要完成的事",但我認為這些"目標"的目的,應該是類似長期的人生計畫,給自己訂下的目標,然後看著自己一步一步地朝著自己的目標前進,而帶給自己的成就感。(不是叫你完成別人的目標啦~~完成別人的目標真的有點好笑)
Thumbnail
善與惡的價值判斷,是人出自不同的社會地位和生理條件對自身的行為所做的肯定性判斷,這是尼采對善惡做出的定義。 究竟是什麼形成了我們如今的道德觀?難道「善」就一定會好過「惡」嗎? 進擊的巨人中,作者安排了多次的角色對換讓我們能更進一步思考善惡的合理性,因此我將劇情分成五大區塊討論:
Thumbnail
時差睡不著的那晚竟然突然想起了小學六年級的班導師。我對於小學時期的記憶很片段,並沒有特別對於哪一年的記憶印象深刻,甚至對於五年級那一年來說根本一片空白,我向來也不是個會特別想親近老師的人,但他卻是我非常喜歡的一位老師。