日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
干掉if-else,多點(diǎn)套路,少點(diǎn)彎路!

 你也許已經(jīng)看了無(wú)數(shù)使用 if-else 語(yǔ)句的教程,你可能也讀過(guò)不少使用 if-else 作為事實(shí)上的分支技術(shù)的編程書(shū)籍。

圖片來(lái)自 Pexels

它可能是也是你日常默認(rèn)的編碼模式。但是,讓我們從今天起結(jié)束這種方法,用狀態(tài)對(duì)象代替 If-else。

請(qǐng)注意,如果你正在編寫(xiě)的代碼需要根據(jù)當(dāng)前狀態(tài)改變其實(shí)現(xiàn)的類,你需要改用這種方法。如果你的代碼不是處理對(duì)象的狀態(tài)變化,你需要選擇其他方法。

即使你已經(jīng)聽(tīng)說(shuō)過(guò)狀態(tài)模式,你可能也想了解如何在生產(chǎn)代碼中實(shí)現(xiàn)。

對(duì)于以前了解不多的人,下面有一段非常簡(jiǎn)單的介紹。

對(duì) if-else 增加任何新的條件,都會(huì)增加復(fù)雜性。應(yīng)用狀態(tài)模式(state pattern),你只需使用專門(mén)的狀態(tài)對(duì)象,代替 if-else 語(yǔ)句來(lái)改變一個(gè)對(duì)象的行為。

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

警告:PTSD 觸發(fā)器。另外,希望你能發(fā)現(xiàn)里面的邏輯錯(cuò)誤(除了代碼整體一團(tuán)糟)。

你以前肯定寫(xiě)過(guò)更復(fù)雜的分支。我?guī)啄昵按_實(shí)寫(xiě)過(guò)。

上面的分支邏輯雖然不是很復(fù)雜,但如果再添加新的條件,這個(gè)邏輯會(huì)更加混亂。

另外,如果你認(rèn)為創(chuàng)建新的類,而不是簡(jiǎn)單地使用分支語(yǔ)句聽(tīng)起來(lái)很煩人,那就可以繼續(xù)看下面的實(shí)際代碼,它簡(jiǎn)潔而優(yōu)雅。

更妙的是,它會(huì)讓你的代碼庫(kù)變得更 SOLID,除了 "D" 部分。

"好了,我相信 if-else 是邪惡的,現(xiàn)在請(qǐng)告訴我如何避免混亂的分支代碼"!

我們將看看我是如何在生產(chǎn)代碼中替換 if-else 分支的。這是一個(gè)假想的例子,但方法和我在大型客戶的代碼庫(kù)中使用的是一樣的。

讓我們創(chuàng)建一個(gè)非常簡(jiǎn)單的 Booking 類,它有幾個(gè)狀態(tài)。它也會(huì)有兩個(gè)公共方法:Accept() 和 Cancel()。

我畫(huà)了一個(gè)圖,顯示了一個(gè)預(yù)訂可能處于的不同狀態(tài):

將分支邏輯從代碼中重構(gòu)出來(lái),可以分為三步:

  • 創(chuàng)建一個(gè)抽象的基本狀態(tài)類。
  • 將每個(gè)狀態(tài)作為一個(gè)獨(dú)立的類來(lái)實(shí)現(xiàn),繼承于基本狀態(tài)。
  • 讓 Booking 類有一個(gè)私有的或內(nèi)部的方法,把狀態(tài)基類作為參數(shù)。

演示時(shí)間

首先,我們需要一個(gè)用于繼承所有狀態(tài)的基礎(chǔ)狀態(tài)類。

請(qǐng)注意這個(gè)基類也有 Accept 和 Cancel 這兩個(gè)方法,雖然這里它們被標(biāo)記為內(nèi)部方法。

此外,基礎(chǔ)狀態(tài)有一個(gè)特殊的 EnterState(Booking booking)方法。每當(dāng)一個(gè)新的狀態(tài)被分配給預(yù)訂對(duì)象時(shí),這個(gè)方法就會(huì)被調(diào)用。

其次,我們要為我們要表示的每一個(gè)狀態(tài)單獨(dú)做一個(gè)類。

請(qǐng)注意每個(gè)類是如何代表一個(gè)狀態(tài)的,就像上圖描述的那樣。另外,CancelledState 不會(huì)不允許預(yù)訂再轉(zhuǎn)換到一個(gè)新的狀態(tài)。這個(gè)類的設(shè)計(jì)與 Null Object Pattern 非常相似。

最后,再看看 Booking 類本身:

看到 Booking 類是如何簡(jiǎn)單地將 Accept 和 Cancel 的實(shí)現(xiàn)委托給它的狀態(tài)對(duì)象的嗎?

這樣做可以讓我們?nèi)サ艉芏鄺l件邏輯,讓每個(gè)狀態(tài)只關(guān)注對(duì)自己重要的東西 -- 當(dāng)前狀態(tài),以及也有可能將預(yù)訂轉(zhuǎn)換到新的狀態(tài)。

如何處理新的條件功能?

如果新功能通常會(huì)使用一些條件檢查來(lái)實(shí)現(xiàn),現(xiàn)在你可以直接創(chuàng)建一個(gè)新的狀態(tài)類。

就這么簡(jiǎn)單。你將不再需要處理笨重的 if-else 語(yǔ)句。

如何將狀態(tài)對(duì)象持久化在數(shù)據(jù)庫(kù)中?

不需要。

當(dāng)把一個(gè)對(duì)象保存到 SQL 或 NoSQL 數(shù)據(jù)庫(kù)時(shí),狀態(tài)對(duì)象并不重要。只有知道對(duì)象的狀態(tài),以及如何將其映射到列才是重要的。

你可以將狀態(tài)映射到一個(gè)友好的類型名、一個(gè)枚舉或一個(gè)整型。只要你有某種方法將保存的值轉(zhuǎn)換回狀態(tài)對(duì)象,那就任何方法都行。

但為什么你還在使用 if?

是的,if 有時(shí)是必不可少的,尤其是作為防護(hù)語(yǔ)句(guard clause)使用時(shí)。if-else 組合才是讓人頭疼的可維護(hù)性的根本原因。

但是文中介紹的方法會(huì)帶來(lái)很多額外的類?

的確如此。正如我在另一篇文章中提到的,復(fù)雜性并不源于你擁有的類的數(shù)量,而是源于這些類所承擔(dān)的責(zé)任。

擁有許多專門(mén)的類,會(huì)讓你的代碼庫(kù)更易讀、更易維護(hù),而且整體上更容易讓人喜歡。

作者:Nicklas Millard

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號(hào)高可用架構(gòu)(ID:ArchNotes)


網(wǎng)站題目:干掉if-else,多點(diǎn)套路,少點(diǎn)彎路!
URL網(wǎng)址:http://www.dlmjj.cn/article/codhdod.html