自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

無(wú)需If-Else語(yǔ)句,狀態(tài)模式即可編寫干凈可維護(hù)的代碼

開發(fā) 前端
If-Else語(yǔ)句我們?cè)偈煜げ贿^(guò)了,你可能看過(guò)無(wú)數(shù)的相關(guān)教程,讀過(guò)很多編程書籍,來(lái)提升將If-Else用作de facto分支技術(shù)的方法,甚至可能你的默認(rèn)模式就是使用If-Else。

本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。

If-Else語(yǔ)句我們?cè)偈煜げ贿^(guò)了,你可能看過(guò)無(wú)數(shù)的相關(guān)教程,讀過(guò)很多編程書籍,來(lái)提升將If-Else用作de facto分支技術(shù)的方法,甚至可能你的默認(rèn)模式就是使用If-Else。

可以結(jié)束這一切了。在任何新的條件要求下,使用If-Else都會(huì)增加復(fù)雜性。用狀態(tài)對(duì)象來(lái)代替If-Else吧。應(yīng)用狀態(tài)模式,你只需使用專用狀態(tài)對(duì)象而無(wú)需使用If-Else語(yǔ)句來(lái)更改對(duì)象行為。

[[334050]]

像下面這樣的代碼時(shí)代已經(jīng)一去不復(fù)返了:

無(wú)需If-Else語(yǔ)句,狀態(tài)模式即可編寫干凈可維護(hù)的代碼

觸發(fā)PTSD警告

你肯定曾經(jīng)寫過(guò)更復(fù)雜的分支,我也曾是這么做的。上面的分支邏輯甚至還不是很復(fù)雜,但如果嘗試添加新條件,事情肯定會(huì)越弄越糟。

另外,如果你認(rèn)為創(chuàng)建新類而非簡(jiǎn)單地使用分支語(yǔ)句聽起來(lái)很煩人,那么請(qǐng)一定等到實(shí)際使用的時(shí)候,你會(huì)發(fā)現(xiàn)這種方法簡(jiǎn)潔而優(yōu)雅。除了“ D”部分之外,它還將使你的代碼庫(kù)更加扎實(shí)。

那么如何避免混亂的分支代碼呢?

我們將研究如何在生產(chǎn)就緒代碼中替換If-Else分支。這是一個(gè)虛構(gòu)的例子,但是方法與我在大型客戶的代碼庫(kù)中使用的方法相同。

創(chuàng)建一個(gè)非常簡(jiǎn)單的Booking類,其中包含一些狀態(tài)。它還有兩個(gè)公共方法:Accept()and Cancel().。我盡力繪制了一個(gè)圖表,顯示了預(yù)訂可能處于的不同狀態(tài)。

無(wú)需If-Else語(yǔ)句,狀態(tài)模式即可編寫干凈可維護(hù)的代碼

代碼中重構(gòu)分支邏輯的過(guò)程一共有三步:

  • 創(chuàng)建一個(gè)抽象基類
  • 將每個(gè)狀態(tài)實(shí)現(xiàn)為繼承自基本狀態(tài)的單獨(dú)類
  • 讓Booking`類具有私有或內(nèi)部方法,該方法以狀態(tài)基類為參數(shù)

演示時(shí)間到!

首先,需要一個(gè)將繼承所有狀態(tài)的基類。

無(wú)需If-Else語(yǔ)句,狀態(tài)模式即可編寫干凈可維護(hù)的代碼

請(qǐng)注意,該基類還具有兩種方法,Accept和Cancel——盡管此處將它們標(biāo)記為內(nèi)部。此外,基態(tài)具有“特殊” EnterState(Booking booking)方法。每當(dāng)將新狀態(tài)分配給預(yù)訂對(duì)象時(shí),就會(huì)調(diào)用此方法。

其次,為要代表的每個(gè)狀態(tài)創(chuàng)建單獨(dú)的類。

無(wú)需If-Else語(yǔ)句,狀態(tài)模式即可編寫干凈可維護(hù)的代碼

注意,如上圖所示,每個(gè)類如何表示一個(gè)狀態(tài)。此外,ExpiredState和CancelledState不會(huì)將預(yù)訂轉(zhuǎn)換為新狀態(tài)。這兩類在本質(zhì)上與Null Object Pattern非常相似。

最后,預(yù)訂類型本身。

無(wú)需If-Else語(yǔ)句,狀態(tài)模式即可編寫干凈可維護(hù)的代碼

看到預(yù)訂類型如何簡(jiǎn)單地將Accept和Cancel的實(shí)現(xiàn)委派給其狀態(tài)對(duì)象了嗎?這樣做可以使我們刪除許多條件邏輯,并使每個(gè)狀態(tài)僅關(guān)注對(duì)自己重要的事情,當(dāng)前狀態(tài)也有機(jī)會(huì)將預(yù)訂過(guò)渡到新狀態(tài)。

Q&A

1. 如何處理新的條件功能?

如果說(shuō)通常需要使用某些條件檢查來(lái)實(shí)現(xiàn)新功能,那么現(xiàn)在只需創(chuàng)建一個(gè)新的狀態(tài)類即可,你將不再需要費(fèi)力地處理if-else語(yǔ)句了。

2. 如何將狀態(tài)對(duì)象保留在數(shù)據(jù)庫(kù)中?

不,你不想。

當(dāng)將對(duì)象保存到例如SQL或NoSQL數(shù)據(jù)庫(kù)時(shí),狀態(tài)對(duì)象并不重要,這時(shí)只有了解對(duì)象的狀態(tài)及其應(yīng)如何映射到列是重要的。你可以將狀態(tài)映射到友好類型名稱,枚舉或整數(shù)。只要你愿意,總有某種方法可以將保存的值轉(zhuǎn)換回狀態(tài)對(duì)象。

3. 但是你還在使用If’s嗎?

它們是必不可少的,特別是當(dāng)用作保護(hù)子句時(shí)。但I(xiàn)f-Else組合是造成可維護(hù)性難題的根本原因。

[[334051]]

圖源:unsplash

復(fù)雜性不是源于你擁有的類的數(shù)量,而是源于這些類承擔(dān)的功能。擁有許多專門的類將使你的代碼庫(kù)更具可讀性與可維護(hù)性,并且從總體上來(lái)說(shuō),也更易于使用。

適時(shí)地和If-Else語(yǔ)句說(shuō)再見吧!

責(zé)任編輯:趙寧寧 來(lái)源: 讀芯術(shù)
相關(guān)推薦

2023-01-27 14:53:03

2024-06-18 18:36:03

2013-04-15 09:02:43

JavaScriptJS

2024-04-07 10:13:57

C++代碼if-else

2021-09-22 11:05:19

JS代碼前端

2022-07-11 08:16:55

策略模式if-else

2021-11-04 08:53:00

if-else代碼Java

2023-06-02 07:30:24

If-else結(jié)構(gòu)流程控制

2022-06-07 09:30:35

JavaScript變量名參數(shù)

2022-01-13 10:45:59

if-else代碼Java

2020-12-29 09:16:36

程序員對(duì)象開發(fā)

2020-05-13 14:15:25

if-else代碼前端

2025-04-24 08:40:00

JavaScript代碼return語(yǔ)句

2022-06-17 09:08:27

代碼Python內(nèi)置庫(kù)

2020-07-15 14:51:39

代碼C+開發(fā)

2013-03-06 10:28:57

ifJava

2020-08-27 07:00:00

代碼軟件應(yīng)用程序

2022-04-12 07:32:40

引擎模式Spring策略模式

2023-03-27 15:05:10

Python技巧

2021-10-25 08:00:00

工具DataTrucker后端
點(diǎn)贊
收藏

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