成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
為什么?因?yàn)椴紶栔等菀鬃屵壿嬜兊脧?fù)雜。命名糟糕、否定邏輯、嵌套條件,這些都會(huì)讓代碼變得難以理解。更糟的是,我們常常把多個(gè)布爾條件組合在一起,讓閱讀者的大腦不得不做多重判斷。

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

多年的編碼經(jīng)驗(yàn)讓我對(duì)布爾值保持警惕。也許你習(xí)慣了它們,但我發(fā)現(xiàn),能不用就盡量不用;如果非用不可,也得格外小心。

為什么?因?yàn)椴紶栔等菀鬃屵壿嬜兊脧?fù)雜。命名糟糕、否定邏輯、嵌套條件,這些都會(huì)讓代碼變得難以理解。更糟的是,我們常常把多個(gè)布爾條件組合在一起,讓閱讀者的大腦不得不做多重判斷。

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

保持積極 正面條件優(yōu)先 禁止復(fù)雜表達(dá)式 拒絕布爾參數(shù) 布爾值是未來復(fù)雜性的陷阱

保持積極

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

if UserIsAuthorized {
  // 執(zhí)行某些操作
}

而不是:

if !UserIsNotAuthorized {
  // 執(zhí)行某些操作
}

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

正面條件優(yōu)先

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

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

而應(yīng)該將正面條件放在前面:

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

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

禁止復(fù)雜表達(dá)式

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

我經(jīng)常看到這樣的代碼:

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

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

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();
}

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

const userHasJumpedThroughAllTheRequiredHoops = true;

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

拒絕布爾參數(shù)

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

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

當(dāng)你編寫函數(shù)時(shí),參數(shù)是有命名的,看起來沒問題。但當(dāng)你要調(diào)用它時(shí),維護(hù)者必須查找函數(shù)聲明才能理解傳遞了什么。

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

enum WelcomeEmailOption {
  Send,
  DoNotSend,
}

enum VerificationStatus {
  Verified,
  Unverified,
}

然后你的函數(shù)可以這樣寫:

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

你可以這樣調(diào)用它:

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

這難道不是對(duì)大腦更友好嗎?這個(gè)調(diào)用就像文檔一樣。它清晰明了,維護(hù)者可以立即看到調(diào)用做了什么以及參數(shù)的含義。

布爾值是未來復(fù)雜性的陷阱

enum的一個(gè)優(yōu)點(diǎn)是它們可以擴(kuò)展。想象一下,你有一個(gè)食品飲料系統(tǒng),有小型和大型飲料。你可能會(huì)得到:

var IsSmallDrink: boolean;

你圍繞這個(gè)布爾變量構(gòu)建了你的系統(tǒng),甚至在數(shù)據(jù)庫中為這些信息創(chuàng)建了布爾字段。但后來老板過來告訴你:"嘿,我們要開始賣中號(hào)飲料了!"

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

enum DrinkSize {
  Small,
  Large
}

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

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

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

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

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

責(zé)任編輯:武曉燕 來源: 前端小石匠
相關(guān)推薦

2017-10-20 10:19:49

Kotlin語言陷阱

2021-03-01 15:52:14

開源開源軟件陷阱

2019-02-11 10:00:23

云網(wǎng)絡(luò)云平臺(tái)微服務(wù)

2024-01-22 08:20:40

Python編程語言代碼陷阱

2018-06-11 15:26:47

云計(jì)算企業(yè)云陷阱

2021-04-22 11:22:12

云計(jì)算數(shù)據(jù)遷移混合云

2022-09-13 08:33:05

SQLNULL三值邏輯

2022-10-21 16:28:52

PythonGo布爾值

2023-06-13 15:24:15

JavaScript數(shù)據(jù)類型

2016-02-23 09:23:50

swift陷阱解決方法

2017-08-25 10:26:04

業(yè)務(wù)邏輯程序員

2024-11-06 09:44:22

2020-09-21 19:34:07

DevOps

2021-08-24 10:51:19

多云云計(jì)算云平臺(tái)

2023-06-21 10:09:50

2013-01-06 10:15:02

大數(shù)據(jù)分析數(shù)據(jù)分析師大數(shù)據(jù)

2021-07-16 10:27:07

ITIT領(lǐng)導(dǎo)IT管理

2022-10-11 07:20:56

YAML字符串語言

2022-09-19 09:19:24

云存儲(chǔ)TCO云服務(wù)

2014-07-11 10:23:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品视频在线播放 | 欧美涩涩网| 亚洲二区在线观看 | www日韩高清 | 一级二级三级黄色 | 午夜视频在线观看网站 | 成年女人免费v片 | 操操操操操| 爱综合| 日韩亚洲一区二区 | 天天在线操 | 91精品久久久久久久久 | 中文字幕日韩欧美一区二区三区 | 操操日 | 精品国产黄色片 | h小视频 | 国产在线精品区 | 日韩a在线| 国产精品资源在线 | 精品婷婷 | 亚欧洲精品在线视频免费观看 | 亚洲码欧美码一区二区三区 | 天天草天天操 | 国产视频一区二区 | 欧美日韩亚洲国产 | 国产亚洲一区二区在线观看 | 国产精品一区二区在线 | 国产精品178页 | 一区二区久久电影 | 高清国产一区二区 | 欧美理伦片在线播放 | 国产成人精品免费视频大全最热 | 男女网站免费观看 | 日韩成人在线视频 | 久久国产亚洲 | 蜜桃视频在线观看www社区 | 亚洲免费在线视频 | 国产分类视频 | 成av在线 | 在线观看免费高清av | 日韩综合 |