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

干掉if-else,多點套路,少點彎路!

運維 數據庫運維 開發工具
它可能是也是你日常默認的編碼模式。但是,讓我們從今天起結束這種方法,用狀態對象代替 If-else。

 你也許已經看了無數使用 if-else 語句的教程,你可能也讀過不少使用 if-else 作為事實上的分支技術的編程書籍。

[[347735]] 

圖片來自 Pexels

它可能是也是你日常默認的編碼模式。但是,讓我們從今天起結束這種方法,用狀態對象代替 If-else。

請注意,如果你正在編寫的代碼需要根據當前狀態改變其實現的類,你需要改用這種方法。如果你的代碼不是處理對象的狀態變化,你需要選擇其他方法。

即使你已經聽說過狀態模式,你可能也想了解如何在生產代碼中實現。

對于以前了解不多的人,下面有一段非常簡單的介紹。

對 if-else 增加任何新的條件,都會增加復雜性。應用狀態模式(state pattern),你只需使用專門的狀態對象,代替 if-else 語句來改變一個對象的行為。

像下面這樣代碼的日子,已經一去不復返了:

 

警告:PTSD 觸發器。另外,希望你能發現里面的邏輯錯誤(除了代碼整體一團糟)。

你以前肯定寫過更復雜的分支。我幾年前確實寫過。

上面的分支邏輯雖然不是很復雜,但如果再添加新的條件,這個邏輯會更加混亂。

另外,如果你認為創建新的類,而不是簡單地使用分支語句聽起來很煩人,那就可以繼續看下面的實際代碼,它簡潔而優雅。

更妙的是,它會讓你的代碼庫變得更 SOLID,除了 "D" 部分。

"好了,我相信 if-else 是邪惡的,現在請告訴我如何避免混亂的分支代碼"!

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

讓我們創建一個非常簡單的 Booking 類,它有幾個狀態。它也會有兩個公共方法:Accept() 和 Cancel()。

我畫了一個圖,顯示了一個預訂可能處于的不同狀態:

 

將分支邏輯從代碼中重構出來,可以分為三步:

  • 創建一個抽象的基本狀態類。
  • 將每個狀態作為一個獨立的類來實現,繼承于基本狀態。
  • 讓 Booking 類有一個私有的或內部的方法,把狀態基類作為參數。

演示時間

首先,我們需要一個用于繼承所有狀態的基礎狀態類。

 

請注意這個基類也有 Accept 和 Cancel 這兩個方法,雖然這里它們被標記為內部方法。

此外,基礎狀態有一個特殊的 EnterState(Booking booking)方法。每當一個新的狀態被分配給預訂對象時,這個方法就會被調用。

其次,我們要為我們要表示的每一個狀態單獨做一個類。

請注意每個類是如何代表一個狀態的,就像上圖描述的那樣。另外,CancelledState 不會不允許預訂再轉換到一個新的狀態。這個類的設計與 Null Object Pattern 非常相似。 

最后,再看看 Booking 類本身: 

看到 Booking 類是如何簡單地將 Accept 和 Cancel 的實現委托給它的狀態對象的嗎? 

這樣做可以讓我們去掉很多條件邏輯,讓每個狀態只關注對自己重要的東西 -- 當前狀態,以及也有可能將預訂轉換到新的狀態。

如何處理新的條件功能?

如果新功能通常會使用一些條件檢查來實現,現在你可以直接創建一個新的狀態類。

就這么簡單。你將不再需要處理笨重的 if-else 語句。

如何將狀態對象持久化在數據庫中?

不需要。

當把一個對象保存到 SQL 或 NoSQL 數據庫時,狀態對象并不重要。只有知道對象的狀態,以及如何將其映射到列才是重要的。

你可以將狀態映射到一個友好的類型名、一個枚舉或一個整型。只要你有某種方法將保存的值轉換回狀態對象,那就任何方法都行。

但為什么你還在使用 if?

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

但是文中介紹的方法會帶來很多額外的類?

的確如此。正如我在另一篇文章中提到的,復雜性并不源于你擁有的類的數量,而是源于這些類所承擔的責任。

擁有許多專門的類,會讓你的代碼庫更易讀、更易維護,而且整體上更容易讓人喜歡。

作者:Nicklas Millard

編輯:陶家龍

出處:轉載自公眾號高可用架構(ID:ArchNotes)

 

責任編輯:武曉燕 來源: 高可用架構
相關推薦

2020-04-09 08:29:50

編程語言事件驅動

2025-06-26 01:10:00

服務定位解析器Spring

2021-01-29 07:45:27

if-else代碼數據

2023-06-02 07:30:24

If-else結構流程控制

2013-03-06 10:28:57

ifJava

2021-04-20 08:02:08

業務數據用戶

2022-01-13 10:45:59

if-else代碼Java

2021-04-13 06:39:13

代碼重構code

2022-07-11 08:16:55

策略模式if-else

2021-03-10 07:20:43

if-else靜態代碼

2018-12-04 12:52:32

攜號轉網手機號碼消費者

2020-12-15 09:31:58

CTOif-else代碼

2020-05-13 14:15:25

if-else代碼前端

2021-11-04 08:53:00

if-else代碼Java

2025-04-24 08:40:00

JavaScript代碼return語句

2020-07-09 08:59:52

if else模板Service

2025-04-21 00:00:05

2020-09-27 14:24:58

if-else cod業務

2024-06-18 18:36:03

2020-04-20 15:40:03

if-elseJava優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中日字幕大片在线播放 | 成人在线 | 国产一区二区毛片 | 日本在线视频不卡 | 国产一级特黄aaa大片评分 | 99九色| 久久精品视频在线免费观看 | 黄色日本视频 | 成人亚洲精品 | 日本福利视频免费观看 | 日韩精品一区二区三区中文在线 | 精品无码久久久久久国产 | 午夜成人免费视频 | 国内精品久久久久 | 亚洲国产精品一区二区久久 | 99久久婷婷国产综合精品电影 | 国产精品人人做人人爽 | 干干天天 | 欧美成人a | 日本不卡一区 | 激情五月婷婷综合 | 欧美日韩在线精品 | 久久精品国产清自在天天线 | 午夜天堂精品久久久久 | 啪视频在线 | 欧美精品久久一区 | 亚洲网站在线观看 | 亚洲成人av在线播放 | 亚洲一区二区久久 | 欧美性tv | 成人3d动漫一区二区三区91 | 亚洲国产精品久久久久秋霞不卡 | 亚洲一区二区在线免费观看 | av大片 | 在线看一区二区三区 | 涩色视频在线观看 | 日本黄色影片在线观看 | 在线欧美视频 | 亚洲午夜电影 | 亚洲a一区二区 | 青娱乐国产 |