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

過多if-else分支的優化

開發 后端
有許多人會說,疊起來一堆if-else分支,代碼就不優雅了。可是,怎樣去定義“優雅”的概念呢?再退一步說,即便不“優雅”,又有什么問題?

我想談一談這個話題是因為我的上一篇博客有一些朋友回復,說if-else過多的分支可以使用switch或者責任鏈模式等等方式來優化。確實,這是一個小問題,不過我們還是可以整理一下這個小問題的重構方式。

過多if else分支的優化

為什么要優化?

你沒有看錯。這是要放在第一條談論的。

有許多人會說,疊起來一堆if-else分支,代碼就不優雅了。可是,怎樣去定義“優雅”的概念呢?再退一步說,即便不“優雅”,又有什么問題?

對于這樣一段再普通不過的代碼:

  1. int code;   
  2. if("Name".equals(str))   
  3.     code = 0;   
  4. else if("Age".equals(str))   
  5.     code = 1;   
  6. else if("Address".equals(str))   
  7.     code = 2;   
  8. ... 

可以有好多種重構方式,但是使用這樣的代碼,雖然簡陋,但在大多數情況下,并不會影響什么,比如,對可維護性沒有影響。當然,如果你發現其中確有不好的一面,那就要考慮重構它。換言之,通常你首先要說出某段代碼的問題(比如,你覺得這段代碼不符合開閉原則,因為你希望保持這段代碼閉合穩定),那么才去存在重構的必要,而不要總是使用“優雅”和“簡潔”搪塞疑問。幾乎所有的書上都說要寫出優雅的、簡潔的代碼,這本身無可厚非,但是事物需要使用自己的判斷,可不要被習慣性地洗了腦。

在我前一家公司,是典型的通訊和傳統軟件的公司,代碼質量普遍不錯,但是很多時候,會看到許許多多不夠優雅的代碼——也許你覺得不夠簡潔、美觀,但是下代碼嚴謹、清晰,我覺得這就很好。反之,某一些精巧的設計,可能會帶來可閱讀性和可理解性下降的問題。

尋找代替分支判斷的方式

接下去我們再來考慮怎么樣去重構優化過多的if-else分支。

程序邏輯最基本的組成就是分支、判斷和循環。而過多if-else正是由于在某一個變化的點上,有許多判斷條件和結果分支造成的。所以最基本的解決辦法就是把多個判斷條件合成一個,也就是把若干個分支合成一個。

但是在大多數情況下,條件判斷的分支都是無法合并的。所以,我們需要把這個變化點通過別的途徑封裝起來,而不是采用if-else。

1. 用一個Map可以做到,if-else的變化點使用Map的get方法來代替:

  1. Map typeCodeMap = new HashMap();   
  2. typeCodeMap.put("Name"0);   
  3. typeCodeMap.put("Age"1);   
  4. typeCodeMap.put("Address"2);   
  5. ...   
  6. int code = typeCode.get(type); 

2. 枚舉:

  1. public enum Codes {   
  2.     Name(0), Age(1), Address(2);   
  3.         
  4.     public int code;   
  5.     Codes(int code){   
  6.         this.code = code;   
  7.     }   
  8. }   
  9.     
  10. //使用:   
  11. int code = Codes.valueOf(str).code; 

3. 多態:

  1. ICode iCode = (ICode)Class.forName("com.xxx." + str).newInstance();   
  2. int code = iCode.getCode(); 

當然,如果僅考慮從String轉向int這樣的轉換,用這樣的方式來簡化分支判斷邏輯,這個方式、這個例子不是很恰當。當然,這樣的方式經常被用來做從字符串到具體對象的轉換。

還有一些朋友說的這個模式那個模式來解決多if-else的問題,這些都是正確的,當然本質上也無一例外基于多態來實現的,所以我就不提及了。這些都不錯,至少比那些老說用switch來代替if-else的有價值多了 :)

最后,對于如此小的一個問題,我要補充說明的一點是,看不得大片if-else和看不得大片new關鍵字一樣,我覺得這是許多Java程序員的既有觀念或者說習慣,甚至通病——這并不好。Java最有價值的地方不是它的語義語法也不是它的虛擬機跨平臺和有多高性能,而在于它的社區它的無比豐富的類庫,在于使用它的人可以從設計上和宏觀上去思考問題。但是Java程序員,也包括我在內,很容易把這條路走得過于極端,比如遍地的Factory,比如漫山遍野的配置,比如永遠也不會被復用的可復用代碼,比如永遠也不會被擴展的可擴展代碼,還比如從前到后由內到外的分層,一層又一層。相對于這些方面無止境的追求,我們還是專注于要解決的問題,多寫一些清晰可用的代碼吧。

原文鏈接:http://www.raychase.net/1241

責任編輯:張偉 來源: 四火的嘮叨
相關推薦

2021-11-04 08:53:00

if-else代碼Java

2022-04-12 07:32:40

引擎模式Spring策略模式

2020-05-13 14:15:25

if-else代碼前端

2023-06-02 07:30:24

If-else結構流程控制

2024-04-07 10:13:57

C++代碼if-else

2024-03-25 10:00:00

C++編程else

2021-03-10 07:20:43

if-else靜態代碼

2021-04-13 06:39:13

代碼重構code

2024-11-04 09:41:47

2022-07-11 08:16:55

策略模式if-else

2020-10-22 09:20:22

SQLNoSQL 數據庫

2020-04-09 08:29:50

編程語言事件驅動

2025-04-24 08:40:00

JavaScript代碼return語句

2020-12-15 09:31:58

CTOif-else代碼

2020-09-27 14:24:58

if-else cod業務

2024-06-18 18:36:03

2021-01-29 07:45:27

if-else代碼數據

2025-06-26 01:10:00

服務定位解析器Spring

2023-11-14 08:00:00

Angular前端開發

2024-04-26 08:58:54

if-else代碼JavaSpring
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 请别相信他免费喜剧电影在线观看 | 亚洲成人av | 夜夜骑综合 | 久久视频精品在线 | 日本一道本视频 | 亚洲成人在线视频播放 | 久久激情视频 | 国产香蕉视频在线播放 | 国产乱码精品一区二三赶尸艳谈 | 欧美一级全黄 | 香蕉久久av | 夜操| 国产精品欧美一区二区三区不卡 | 日本精品免费 | 一区二区国产精品 | 亚洲日日| 黑人精品 | 成人在线免费观看 | 在线色网站 | 在线观看国产视频 | 一区欧美| 欧美h版 | 国产中文字幕在线观看 | 成人国产精品久久久 | 亚洲人成在线观看 | 日韩欧美综合在线视频 | 一级一级一级毛片 | 精品久久久久久国产 | 国产a区 | 日本偷偷操 | 一区二区三区免费观看 | 欧美一区免费 | 超碰激情| 992tv人人草 久久精品超碰 | 亚洲成人精品在线 | 国产精品免费高清 | 在线观看视频91 | 一区二区三区在线看 | 本地毛片| 国产精品久久久久久久久久99 | 亚洲网站在线观看 |