国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

布爾值的陷阱:如何避免編程中的邏輯混亂

開發 前端
為什么?因為布爾值容易讓邏輯變得復雜。命名糟糕、否定邏輯、嵌套條件,這些都會讓代碼變得難以理解。更糟的是,我們常常把多個布爾條件組合在一起,讓閱讀者的大腦不得不做多重判斷。

布爾值看起來簡單,但用起來卻常常讓人頭疼。它們表面上只是“真”或“假”,但一旦深入使用,就會發現它們很容易引發混亂。

多年的編碼經驗讓我對布爾值保持警惕。也許你習慣了它們,但我發現,能不用就盡量不用;如果非用不可,也得格外小心。

為什么?因為布爾值容易讓邏輯變得復雜。命名糟糕、否定邏輯、嵌套條件,這些都會讓代碼變得難以理解。更糟的是,我們常常把多個布爾條件組合在一起,讓閱讀者的大腦不得不做多重判斷。

但布爾值畢竟是編程中不可或缺的一部分。因此,我總結了五條使用布爾值的規則:

保持積極 正面條件優先 禁止復雜表達式 拒絕布爾參數 布爾值是未來復雜性的陷阱

保持積極

在處理布爾變量時,我盡量保持它們的命名是積極的,這意味著當變量為True時,事情是正常工作和發生的。因此我更喜歡這樣的表達式:

if UserIsAuthorized {
  // 執行某些操作
}

而不是:

if !UserIsNotAuthorized {
  // 執行某些操作
}

前者可讀性更強,更容易理解。需要處理雙重否定會讓大腦感到痛苦。雙重否定意味著要思考兩件事而不是一件。

正面條件優先

本著保持積極的精神,如果你必須使用if... else結構,請將正面條件放在前面。我們的思維方式喜歡沿著"快樂路徑"前進,所以將否定條件放在前面可能會讓人感到不適。換句話說,不要這樣做:

if not Authorized {
  // 不好的情況
} else {
  // 好的情況
}

而應該將正面條件放在前面:

if Authorized {
  // 一切正常
} else {
  // 滾開!!
}

這樣更容易閱讀,而且你不需要處理not操作。

禁止復雜表達式

解釋性變量被嚴重低估了。我理解這一點——我們想要快速前進。但停下來把事情寫清楚總是值得的,就像你的數學老師過去常說的"展示你的解題過程"。我遵循這樣的規則:只在命名變量之間使用&&||,永遠不要使用原始表達式。

我經常看到這樣的代碼:

if (user.age > 18 && user.isActive && !user.isBanned && user.subscriptionLevel >= 2) {
  grantAccess();
}

相反,你應該考慮那些不得不閱讀這段可怕代碼的人,并像這樣寫出來:

const isAdult = user.age > 18;
const hasAccess = !user.isBanned;
const isActive = user.isActive;
const isSubscriber = user.subscriptionLevel >= 2;

const canAccess = isAdult && hasAccess && isActive && isSubscriber;

if (canAccess) {
  grantAccess();
}

這樣可讀性極強,而且清楚地表明了它在做什么以及期望什么。不要害怕讓解釋性變量變得明確。我懷疑有人會抱怨:

const userHasJumpedThroughAllTheRequiredHoops = true;

我知道這需要更多的輸入,但清晰度比節省幾個按鍵要寶貴得多。此外,這些解釋性變量是單元測試的絕佳候選者。它們還使日志記錄和調試變得更加容易。

拒絕布爾參數

沒有什么比布爾參數更能讓人每分鐘產生更多"這到底是怎么回事?"的疑問了。看看這個例子:

saveUser(user, true, false); // 這到底意味著什么?

當你編寫函數時,參數是有命名的,看起來沒問題。但當你要調用它時,維護者必須查找函數聲明才能理解傳遞了什么。

相反,為什么不完全避免使用布爾值,而是聲明一個描述性的enum類型來解釋參數的作用?

enum WelcomeEmailOption {
  Send,
  DoNotSend,
}

enum VerificationStatus {
  Verified,
  Unverified,
}

然后你的函數可以這樣寫:

function saveUser(
  user: User,
  emailOption: WelcomeEmailOption,
  verificationStatus: VerificationStatus
): void {
  if (emailOption === WelcomeEmailOption.Send) {
    sendEmail(user.email, 'Welcome!');
  }
  if (verificationStatus === VerificationStatus.Verified) {
    user.verified = true;
  }
  // 保存用戶到數據庫...
}

你可以這樣調用它:

saveUser(newUser, WelcomeEmailOption.Send, VerificationStatus.Unverified);

這難道不是對大腦更友好嗎?這個調用就像文檔一樣。它清晰明了,維護者可以立即看到調用做了什么以及參數的含義。

布爾值是未來復雜性的陷阱

enum的一個優點是它們可以擴展。想象一下,你有一個食品飲料系統,有小型和大型飲料。你可能會得到:

var IsSmallDrink: boolean;

你圍繞這個布爾變量構建了你的系統,甚至在數據庫中為這些信息創建了布爾字段。但后來老板過來告訴你:"嘿,我們要開始賣中號飲料了!"

哦豁,這將是一個重大變更。突然間,一個簡單的布爾值變成了一個負債。但如果你避免了布爾值,而是從一開始就使用:

enum DrinkSize {
  Small,
  Large
}

那么添加另一種飲料尺寸就會容易得多。

聽著,布爾值既強大又簡單。我年紀足夠大,還記得語言甚至沒有布爾類型的時候。我們不得不使用整數來模擬它們:

10 LET FLAG = 0
20 IF FLAG = 1 THEN PRINT "YOU WILL NEVER SEE THIS"
30 LET FLAG = 1
40 IF FLAG = 1 THEN PRINT "NOW IT PRINTS"
50 END

所以我理解它們的吸引力。但使用布爾值最終會充滿危險。有例外情況嗎?當然有,有些簡單情況實際上就是非真即假,而且永遠如此——比如isLoading。但如果你趕時間,或者放松警惕,或者可能有點懶惰,你很容易陷入編寫復雜、難以理解的代碼的陷阱中。所以在使用布爾變量之前,請謹慎小心。

原文地址:https://www.infoworld.com/article/3990923/booleans-considered-harmful.html
作者:Nick Hodges

責任編輯:武曉燕 來源: 前端小石匠
相關推薦

2017-10-20 10:19:49

Kotlin語言陷阱

2021-03-01 15:52:14

開源開源軟件陷阱

2019-02-11 10:00:23

云網絡云平臺微服務

2024-01-22 08:20:40

Python編程語言代碼陷阱

2018-06-11 15:26:47

云計算企業云陷阱

2021-04-22 11:22:12

云計算數據遷移混合云

2022-09-13 08:33:05

SQLNULL三值邏輯

2022-10-21 16:28:52

PythonGo布爾值

2023-06-13 15:24:15

JavaScript數據類型

2016-02-23 09:23:50

swift陷阱解決方法

2017-08-25 10:26:04

業務邏輯程序員

2024-11-06 09:44:22

2020-09-21 19:34:07

DevOps

2021-08-24 10:51:19

多云云計算云平臺

2023-06-21 10:09:50

2013-01-06 10:15:02

大數據分析數據分析師大數據

2021-07-16 10:27:07

ITIT領導IT管理

2022-09-19 09:19:24

云存儲TCO云服務

2022-10-11 07:20:56

YAML字符串語言

2013-06-21 10:15:33

BYOD
點贊
收藏

51CTO技術棧公眾號

欧美性xxxxx| 欧美日韩成人精品| 欧美aaa免费| 亚洲高清乱码| 一区二区三区国产好| 国产精品久久久久久av下载红粉| 久久精品毛片| 免费激情视频在线观看| 欧美偷拍一区二区| 久久青草免费| 九色一区二区| 国产精品高潮久久久久无| 亚洲猫色日本管| 自慰无码一区二区三区| 欧美性猛交xxxx乱大交3| 欧美va在线| 国产伦精品一区二区三区视频孕妇| 91美女片黄在线观看91美女| 青青影院在线观看| 国产精品欧美激情在线播放| 99国产精品一区| 久久精品国产精品亚洲精品| 三区四区在线视频| av在线不卡观看| 国产成人黄色| 亚洲精品久久久久久久久久久| 麻豆乱码国产一区二区三区| 国产农村妇女毛片精品久久莱园子| 视频一区视频二区视频| 亚洲视频香蕉人妖| 欧美大胆a人体大胆做受| 亚洲a区在线视频| 国产精品麻豆网站| 国产伦精品一区二区三区免费优势| 亚洲精品蜜桃久久久久久| 欧美色女视频| 欧美精品卡一卡二| 精品伦理精品一区| 中文字幕亚洲综合久久五月天色无吗'' | 亚洲人成网站777色婷婷| 亚洲精品毛片| 日本黄网站色大片免费观看| 91精品国产91热久久久做人人| 综合av在线| 欧美少妇另类| 国产乱肥老妇国产一区二| 亚洲天堂精品视频| 老牛国内精品亚洲成av人片| 虎白女粉嫩尤物福利视频| 一区二区三区美女xx视频| 日本视频一区二区三区| 成年人黄视频在线观看| 久久国产主播精品| 欧美日本一区二区| 欧美日韩精品| 欧美日韩欧美| 日本视频精品一区| 亚洲黄一区二区| 激情亚洲综合在线| 超碰国产一区| 国产一区二区三区小说| 精品国产网站地址| 国产日韩欧美精品综合| 99久热这里只有精品视频免费观看| 成人性视频欧美一区二区三区| 欧美日本精品在线| 亚洲日本电影在线| 午夜片欧美伦| 老司机精品视频在线观看6| 日韩av一区二区三区在线观看| 精品久久久久一区| 国模一区二区三区白浆| 久久久一本精品| 欧美乱大交xxxxx潮喷l头像| 色诱女教师一区二区三区| 91丨九色丨蝌蚪富婆spa| 97一区二区国产好的精华液| 狠狠干夜夜操| 岛国一区二区三区高清视频| 精品美女一区二区| 国产不卡高清在线观看视频| 欧美9999| 精品女厕一区二区三区| 日韩中出av| 亚洲字幕成人中文在线观看| 国产一区在线免费| 精品香蕉一区二区三区| 91农村精品一区二区在线| 久久奇米777| 国产成人三级| caopo在线| 亚洲精品中字| 亚洲欧美激情在线| 日本三级电影网| 国产精品成人一区二区三区吃奶| 精品视频在线播放色网色视频| 综合激情在线| 日本视频一二区| 欧美大码xxxx| 色综合天天狠狠| 美女国产一区二区三区| 蜜桃成人365av| 视频一区视频二区视频三区高 | 蜜臀av一区二区| 成人在线高清| 羞羞网站免费观看| 丁香婷婷久久久综合精品国产 | 97影院理论午夜| 国产精品日韩一区二区| 亚洲欧美日本另类| 亚洲精品亚洲人成人网在线播放| 在线观看的日韩av| 国产精品原创视频| 中国在线观看免费国语版电影| 精品露脸国产偷人在视频| 欧美成人一区二区三区电影| 国产精品免费aⅴ片在线观看| 午夜激情一区| 影视一区二区三区| 亚洲社区在线| 中文字幕一区综合| 欧美一级片久久久久久久| 欧美日韩一区二区三区四区五区| 国产成人8x视频一区二区| 欧美国产美女| 人人玩人人添人人澡欧美| 玖玖综合伊人| 欧美一级在线看| 99国产在线观看| 欧美xxxx做受欧美.88| 欧美日韩精品福利| 国产精品国产三级国产三级人妇 | 久久免费影院| jizz在线观看视频| 人妻无码视频一区二区三区| 精品久久久久久乱码天堂| 久久久人成影片一区二区三区观看 | 国产一线二线三线女| 国产精品9999| 亚洲精品天天看| 欧美日韩中文字幕综合视频 | 99国产超薄肉色丝袜交足的后果| 久久精品视频在线播放| 欧美男生操女生| 国产一区二区三区四区五区| 国产高清中文字幕在线| 色猫av在线| 国产高清视频网站| 看一级黄色录像| 91久久久一线二线三线品牌| 久久亚洲精品一区| 日韩美一区二区三区| 亚洲曰韩产成在线| 成人黄色国产精品网站大全在线免费观看 | 国产传媒一区二区| 久久久精品中文字幕| 日韩欧美国产电影| 日韩欧美大尺度| 亚洲女同ⅹxx女同tv| av在线综合网| 久久精品国产99国产| 黄色另类av| 国产精品亚洲二区| 亚洲超碰在线观看| 欧美日韩在线精品一区二区三区激情综合 | 精品国产制服丝袜高跟| 国产午夜亚洲精品不卡| 蜜臀av在线播放一区二区三区| 91精品一区二区三区综合| 成人h动漫免费观看网站| 精品捆绑调教一区二区三区| av基地在线| 亚洲s色大片在线观看| 国产黄色高清在线| 亚洲欧美激情网| 久久国产亚洲精品无码| 成年女人18级毛片毛片免费| 中文字幕免费高| 亚洲一卡二卡| 日韩欧美一区二区视频在线播放 | 日韩视频免费中文字幕| 日韩精品小视频| 亚洲成人av在线播放| 欧美丰满嫩嫩电影| 欧美三级中文字| 91黄色免费版| 在线免费观看日本欧美| 婷婷开心激情综合| 亚洲国产日韩一区二区| 亚洲免费观看在线观看| 亚洲欧美区自拍先锋| 亚洲日本在线视频观看| 亚洲欧美日韩小说| 亚洲在线中文字幕| 姬川优奈aav一区二区| 色妞www精品视频| 欧美日韩国产一级二级| 日韩免费观看高清完整版| 亚洲国内精品在线| 伊人久久久久久久久久久|