日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

if-else优化

發(fā)布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 if-else优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

過多if-else分支的優(yōu)化

超過3個就應該去優(yōu)化,說if-else過多的分支可以使用switch或者責任鏈模式等等方式來優(yōu)化。確實,這是一個小問題,不過我們還是可以整理一下這個小問題的重構方式。

為什么要優(yōu)化?

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

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

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

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

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

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

尋找代替分支判斷的方式

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

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

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

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

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

2. 枚舉:

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

3. 多態(tài):

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

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

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

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

轉載于:https://www.cnblogs.com/yuanjun1/p/4701869.html

總結

以上是生活随笔為你收集整理的if-else优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。