日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

接手了個項目,被if..else搞懵逼了

來源: 責編: 時間:2024-01-15 09:21:05 263觀看
導讀背景領導:“這個項目,今后就給你維護了啊,仔細點。” 小貓:“好,沒問題”。 可當滿懷信心的小貓打開項目工程包翻看一些代碼之后,瞬間懵逼沒了信心。是這樣的:還是這樣的:平級的if else密密麻麻就算了,但是深套五六層的if else

背景

領導:“這個項目,今后就給你維護了啊,仔細點。” 小貓:“好,沒問題”。 可當滿懷信心的小貓打開項目工程包翻看一些代碼之后,瞬間懵逼沒了信心。PZA28資訊網——每日最新資訊28at.com

PZA28資訊網——每日最新資訊28at.com

是這樣的:PZA28資訊網——每日最新資訊28at.com

PZA28資訊網——每日最新資訊28at.com

還是這樣的:PZA28資訊網——每日最新資訊28at.com

PZA28資訊網——每日最新資訊28at.com

平級的if else密密麻麻就算了,但是深套五六層的if else甚至七八層的真的是讓人摸不著北。PZA28資訊網——每日最新資訊28at.com

開啟優化

那么就上面小貓遇到的這種情況,面對著幾代程序員精心堆積的屎山,試問閣下該如何應對?不慌,老貓羅列了以下解決方案,如果各位還有比較好的優化方法也歡迎留言。PZA28資訊網——每日最新資訊28at.com

PZA28資訊網——每日最新資訊28at.com

我們對著上述目錄從簡單的開始介紹吧:PZA28資訊網——每日最新資訊28at.com

1.提前return法

當我們遇到空對象或者有部分滿足條件之后才能執行的時候,不要只想著正向邏輯,其實可以逆向思維,把不滿足條件的優先排除掉。這樣可以有效避免if else的深嵌套。 優化前代碼:PZA28資訊網——每日最新資訊28at.com

if(condition){//doSomething}else{}return;

優化后如下:PZA28資訊網——每日最新資訊28at.com

if(!condition){  return;}

2.能省則省,規避最后的else

原來的代碼:PZA28資訊網——每日最新資訊28at.com

public Result addUser() { if (StrUtil.equals(userStatus, "online")) {     return doStep1(); } else {  return doStep2(); } // else 后面沒有其他業務時,可省略最后的else,使代碼簡潔}

優化后的代碼:PZA28資訊網——每日最新資訊28at.com

public Result addUser() { if (StrUtil.equals(userStatus, "online")) {      return doStep1(); }  return doStep2();}

當然這里面要注意的點是,一定要確認是最后的else,并沒有其他的業務邏輯。PZA28資訊網——每日最新資訊28at.com

3.三目運算符

還是基于上面的代碼,如果只有兩種業務的話,其實在一個方法里面直接用三目運算法進行執行即可。如下改造:PZA28資訊網——每日最新資訊28at.com

public Result addUser() {  return StrUtil.equals(userStatus, "online")) ?doStep1() : doStep2();}

一個方法一行代碼搞定。PZA28資訊網——每日最新資訊28at.com

4.使用optional

很多業務場景下,其實我們寫if 是為了判空,自從java8之后其實多了一個Optional神器,Optional 是個容器,它可以保存類型 T 的值,或者僅僅保存null。Optional 提供了很多方法,這樣我們就不用顯式進行空值檢測。Optional 類的引入很好的解決空指針異常。我們看下下面的優化方式: 代碼優化前:PZA28資訊網——每日最新資訊28at.com

if (user == null) {    throw new Exception("未查詢到用戶信息");}if (user != null) {    update(user); // 執行方法調用}

代碼優化后:PZA28資訊網——每日最新資訊28at.com

Optional.ofNullable(user).orElseThrow(() -> new Exception("未查詢到用戶信息"));Optional.ofNullable(user).ifPresent(user -> update(user));

隱式調用相當優雅。PZA28資訊網——每日最新資訊28at.com

5.設計模式優化法

設計模式優化法其實也是針對不同的場景使用不同的設計模式從而簡化多余的if else。PZA28資訊網——每日最新資訊28at.com

(1) 第一種,合理使用責任鏈模式。PZA28資訊網——每日最新資訊28at.com

我們再具體結合一種場景,比方說現在頁面上有新注冊的用戶,他需要提交相關的身份信息進行認證,此時,我們底層往往會對他提交的信息做相關的校驗處理。 底層我們的校驗方式(1)需要驗證基本字非空性 (2)需要驗證身份信息基礎字段合法性 (2)需要調用第三方進行要素認證。 原始代碼如下:PZA28資訊網——每日最新資訊28at.com

public void addUser(User user) { // 1.非空校驗 if (StrUtil.isBlank(user.getUsername())) {  throw new RuntimeException("用戶名為空!"); } if (StrUtil.isBlank(user.getPassword())) {  throw new RuntimeException("密碼為空!"); } ...  // 2.格式校驗 if (!ValidUtil.isIdCardNo(user.getIdCardNo())) {  throw new RuntimeException("身份證號格式錯誤!"); } if (!ValidUtil.isEmail(user.getEmail())) {  throw new RuntimeException("手機號格式錯誤!"); } if (!ValidUtil.isEmail(user.getEmail())) {   throw new RuntimeException("郵箱格式錯誤!"); }    ... // 3.要四素認證校驗  if(!doFourStampVerify(User user)){   throw new RuntimeException("四要素認證失敗!");  }}

此處可能還有很多其他的省略的場景。所以單個文件中的If else可能比想象中多的多。那么我們如何用責任鏈模式進行優化呢? 改造代碼如下,首先定義一個處理器接口:PZA28資訊網——每日最新資訊28at.com

/** * 處理器鏈接口 */public interface UserChainHandler {    void handler(User user);}

剩下不同的場景校驗只要去實現這個接口就可以了,不過需要定義好順序PZA28資訊網——每日最新資訊28at.com

@Component@Order(1) // 指定注入順序public class UserParamNullValidChainHandler implements UserChainHandler {    @Override    public void handler(User user) {     // 1.非空校驗     if (StrUtil.isBlank(user.getUsername())) {   throw new RuntimeException("用戶名為空!");  }  if (StrUtil.isBlank(user.getPassword())) {   throw new RuntimeException("密碼為空!");  }}@Component@Order(1) // 指定注入順序public class UserParamNullValidChainHandler implements UserChainHandler {    @Override    public void handler(User user) {     // 1.非空校驗     if (StrUtil.isBlank(user.getUsername())) {   throw new RuntimeException("用戶名為空!");  }    ...}/** * 格式校驗處理器 */@Component@Order(2) // 指定注入順序public class UserParamFormatValidChainHandler implements UserChainHandler {     @Override    public void handler(User user) {     // 2.格式校驗  if (!ValidUtil.isIdCardNo(user.getIdCardNo())) {   throw new RuntimeException("身份證號格式錯誤!");  }    ...}/** * 四要素處理器 */@Component@Order(3) // 指定注入順序public class FourElementVerifyChainHandler implements UserChainHandler {     @Override    public void handler(User user) {     // 2.格式校驗  if (!doFourStampVerify(User user)) {   throw new RuntimeException("四要素認證失敗!");  }}
//進行組裝@Component@RequiredArgsConstructorpublic class UserChainContext {        private final List<UserChainHandler> userChainHandlerList; // 自動注入責任鏈處理器        /**     * 責任鏈組件執行     *     * @param requestParam 請求參數     */    public void handler(User user) {        // 此處根據 Ordered 實際值進行排序處理        userChainHandlerList.forEach(x -> x.handler(user));    }}

最終咱們的原來的add方法進行這樣調用就好了:PZA28資訊網——每日最新資訊28at.com

public void addUser(User user) { // 執行責任鏈 userChainContext.handler(user);}

(2) 第二種,合理使用策略模式+工廠模式。PZA28資訊網——每日最新資訊28at.com

假設我們遇到這樣一個場景,我們目前底層是一個會員系統,目前系統需要計算各種會員套餐的價格,然后套餐的具體模式主要是由上層系統傳遞指定給我們。如果只關注業務直接擼代碼的話,應該是如下。PZA28資訊網——每日最新資訊28at.com

public Result calcPrice(CalcPriceParam calcPriceParam){  //判斷對應的計算價格的場景  Integer type = judgeType(calcPriceParam);  //根據場景調用不同的方法 ,建議更好的編碼習慣是把type改成枚舉類型哈~  if(type == 1){    return calcPriceForTypeOne();  }  if(type == 2){    return calcPriceForTypeTwo();  }  if(type == 3){    return calcPriceForTypeThree();  }  .....  if(typr == 10){    return calcPriceForTypeTen();  }}

顯而易見隨著會員價格場景套餐越來越多,我們的if也會越來越多。 但是如果使用策略模式的話,我們可以做到如下:PZA28資訊網——每日最新資訊28at.com

public interface Strategy {  Result calcPrice(CalcPriceParam calcPriceParam);  int getBizType();}@Servicepublic Class firstStragy implement Strategy {  Result calcPrice(CalcPriceParam calcPriceParam) {    ....    return result;  }  int getBizType() {    return 1;  }}public Class secondStragy implement Strategy {  Result calcPrice(CalcPriceParam calcPriceParam) {    ....    return result;  }  int getBizType() {    return 2;  }}@Servicepublic class StrategyContext{  Map<Integer,CalcPriceInterface> strategyContextMap = new HashMap<>();  //注入對應的策略類  @Autowired  Strategy[] strategys;      @PostConstruct  public void setStrategyContextMap(){    for(Stragegy stragegy:strategys){        strategyContextMap.put(stragegy.getCode,stragegy);    }  }  //根據場景調用不同的方法   public Result calcPrice(CalcPriceParam calcPriceParam){   Integer type = judgeType(calcPriceParam);    CalcPriceInterface calcPriceInstance = strategyContextMap.get(type);    return calcPriceInstance.calcPrice(calcPriceParam);  }}

這樣一來,咱們上面的第一個方法中的If else的實現將會變得很簡單,如下:PZA28資訊網——每日最新資訊28at.com

@AutowiredStrategyContext strategyContext;public Result calcPrice(CalcPriceParam calcPriceParam){  strategyContext.calcPrice(calcPriceParam);}

這樣即使新增新的計算模式,我們只需去實現Strategy接口并且重寫里面兩個方法即可完成后續業務的拓展。代碼優雅簡單,可維護性強。 以上就是用設計模式針對大量if else進行改造。PZA28資訊網——每日最新資訊28at.com

6.表驅動法

這種方式個人覺得有點像策略模式,但是又不需要單獨抽出相關類去承載注冊方法,而是簡單地將方法通過函數式的方式放到Map中,等到需要使用的時候再進行調用。 原始爛代碼,我們還是參考上述會員費用金額計算的場景。我們可以進行如下方式優化:PZA28資訊網——每日最新資訊28at.com

Map<String, Function<?> action> actionMap = new HashMap<>();action.put("type1",() -> {calcPriceForTypeOne()});action.put("type2",() -> {calcPriceForTypeTwo()});action.put("type3",() -> {calcPriceForTypeThree()});...// 使用actionMap.get(action).apply();

當然如果想要再優化得好一些的話,可以進行接口抽取,然后進行實現,在此不展開,留下給小伙伴們思考一下。PZA28資訊網——每日最新資訊28at.com

7.其他場景靈活運用,干掉if else

我們再回到之前小貓遇到的那兩個代碼截圖,其實我們可以看到有個大量if else并排的代碼其實主要是想要比較相關的屬性有沒有發生變化,如果發生變化,那么則返回false,沒有變化則返回true。其實我們想想是不是可以通過重寫LogisticDO這個對象的equals方法來進行實現呢?這樣是不是也規避了大量的if else。PZA28資訊網——每日最新資訊28at.com

還有其他一些當然也是根據具體場景來解決,比方說,我需要根據不同的type類型,進行獲取不同的描述信息,那么此時我們是不是可以使用enum去維護呢? 如下:PZA28資訊網——每日最新資訊28at.com

if(status.equals(1)){   return "訂單未支付";}else if(status.equals(2)){   return "訂單已支付"}else if(status.equals(3)){   return "訂單已發貨"}.....

優化后:PZA28資訊網——每日最新資訊28at.com

@Getter@AllArgsConstructorpublic enum OrderStatusEnum {    UN_PAID("1","訂單未支付"),    PAIDED("2","訂單已支付"),    SENDED("3","訂單已發貨"),    .....;    private String status;    private String statusDes;    static OrderStatusEnum of(String status) {        for (OrderStatusEnum statusEnum : OrderStatusEnum.values()) {            if (statusEnum.getStatus().equals(status)) {                return statusEnum;            }        }        return null;    }}String orderStatusDes = OrderStatusEnum.of(orderStatus).getStatusDes();

等等還有其他一些,由于這些優化個人認為是沒法標準化的優化原則,不同的業務場景都不同,所以在此,老貓不將其放在通用優化中,認為這個是其他優化方式。PZA28資訊網——每日最新資訊28at.com

結束語

之前在某個技術論壇上看到大家在爭論這么一個問題“如何避免將維護的項目發展成屎山?”大家發言踴躍。有說前期做好設計,有人說代碼質量需要高一些,合理場景套用一些設計模式等等。 不過老貓認為項目無法避免發展成屎山,只是快慢而已,我也認為項目無法避免發展成“屎山”。其原因有三點:PZA28資訊網——每日最新資訊28at.com

  • 項目代碼維護者經過好幾輪,每次開發技術水平參差不齊,代碼風格也不同。
  • 項目迭代中途有很多突發狀況,比方說為了解決Hotfix臨時上線,為了趕項目臨時上線,大家為了趕工完成業務需求,代碼質量可能就可想而知了。
  • 雖然經過好幾輪研發之手,有的研發害怕改出業務問題,所以選擇繼續堆屎山。

說了這么多,其實老貓最終想表達的是,雖然項目會最終淪為屎山,但是作為一個有追求的研發,我們就應當從每個小的if else著手,至少讓當前這個項目在你維護期間,讓其發展成屎山的速度變慢一些,或者能替之前的老前輩還掉一些技術債才是最好的,各位小伙伴你們覺得呢?PZA28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-60958-0.html接手了個項目,被if..else搞懵逼了

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 終究還是拿下字節!強度拉滿!

下一篇: Java 新技術:虛擬線程使用指南

標簽:
  • 熱門焦點
  • 跑分安卓第一!Redmi K60至尊版8月發布!盧偉冰:目標年度性能之王

    8月5日消息,Redmi K60至尊版將于8月發布,在此前舉行的戰略發布會上,官方該機將搭載搭載天璣9200+處理器,安兔兔V10跑分超177萬分,是目前安卓陣營最高的分數
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創佳績。今年618期間,一加手機全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
免费不卡亚洲欧美| 欧美亚洲视频一区二区| 影音先锋在线一区| 国产亚洲欧洲一区高清在线观看| 国产日韩欧美视频在线| 黄色成人免费观看| 亚洲日本乱码在线观看| 夜夜狂射影院欧美极品| 午夜宅男欧美| 久久亚洲精品中文字幕冲田杏梨| 欧美国产综合视频| 欧美三级免费| 国产一区日韩欧美| 亚洲日本在线视频观看| 亚洲精品一区二区三区99| 亚洲一级网站| 久久激五月天综合精品| 欧美国产高清| 国产精品欧美日韩| 在线播放精品| 亚洲一区久久久| 美女图片一区二区| 欧美午夜一区二区| 黄色成人91| 亚洲午夜在线观看视频在线| 久久免费高清视频| 欧美日韩亚洲高清| 在线看成人片| 午夜精品在线看| 欧美精品电影| 红桃视频成人| 亚洲男人的天堂在线观看| 免费观看在线综合| 国产精品伊人日日| 亚洲伦理中文字幕| 久久久五月天| 欧美视频在线观看免费| 亚洲大片在线| 欧美一区高清| 欧美日韩国产精品成人| 红桃视频成人| 欧美专区亚洲专区| 国产精品成人免费精品自在线观看| 在线精品国产欧美| 欧美一区二区视频在线观看| 欧美日韩亚洲一区| 亚洲电影av| 久久精品国产亚洲aⅴ| 欧美色图五月天| 亚洲欧洲中文日韩久久av乱码| 欧美在线视频一区二区| 国产精品va在线| 亚洲国产精品免费| 久久se精品一区二区| 国产精品久久久久毛片大屁完整版 | 国产精品99久久久久久久久久久久 | 欧美91大片| 国产一区二区三区黄| 亚洲一区尤物| 欧美日韩精品一区二区三区四区 | 午夜在线观看免费一区| 欧美三区在线| 亚洲三级免费| 欧美高清视频www夜色资源网| 一区二区三区自拍| 久久成年人视频| 国产精品毛片大码女人| 一区二区日韩| 欧美日韩精品一区二区三区四区 | 国产精品亚发布| 亚洲一区二区在线观看视频| 欧美日韩高清在线播放| 亚洲破处大片| 欧美精品久久久久久| 亚洲激情自拍| 欧美伦理91i| 亚洲日本一区二区| 欧美精品免费看| 亚洲毛片在线看| 欧美日韩1区2区| 一本色道久久综合亚洲91| 欧美日韩午夜在线| 亚洲午夜电影在线观看| 国产精品九九久久久久久久| 亚洲综合好骚| 国产女同一区二区| 性8sex亚洲区入口| 国产一区二区成人久久免费影院| 欧美一区二区在线看| 国产一区二区三区丝袜 | 欧美成人在线免费观看| 亚洲激情影视| 欧美另类高清视频在线| 亚洲作爱视频| 国产精品av一区二区| 午夜精品久久久久久久久久久久 | 久久婷婷综合激情| 亚洲国产精品久久久久久女王| 欧美国产视频在线| 99精品视频一区二区三区| 欧美体内谢she精2性欧美| 亚洲女同精品视频| 国产亚洲欧美色| 久久一区二区三区四区| 亚洲日本va午夜在线电影| 欧美日韩高清免费| 亚洲在线中文字幕| 国产精品社区| 久久精品一区| 亚洲国产精品尤物yw在线观看| 欧美日韩国产免费| 亚洲一区二区三区四区视频| 国产精品网站在线观看| 久久精品国产999大香线蕉| 亚洲电影观看| 欧美日韩国产一区二区| 亚洲欧美精品在线观看| 激情久久综合| 欧美国产视频在线观看| 亚洲一区二区三区高清 | 免费亚洲一区二区| 一区二区三区三区在线| 国产日韩欧美三区| 欧美成人日韩| 亚洲综合精品四区| 亚洲国产精品va在线看黑人| 欧美日韩三级在线| 欧美在线综合视频| 亚洲人成网站在线观看播放| 国产精品人成在线观看免费 | 久久久久99精品国产片| 亚洲乱码国产乱码精品精可以看| 国产精品久久久一区麻豆最新章节 | 黄色亚洲在线| 欧美日韩国产综合网| 欧美一级电影久久| 亚洲人www| 国产三区精品| 欧美人体xx| 久久久久久久久久久成人| 一本色道久久综合| 国产一区二区三区在线观看精品| 欧美精品九九| 久久久久久高潮国产精品视| 99av国产精品欲麻豆| 国产一区二区三区四区五区美女 | 欧美在线观看网站| 日韩视频免费观看高清在线视频| 国产视频精品免费播放| 欧美日韩国产限制| 久久爱另类一区二区小说| 在线视频精品| 亚洲激情亚洲| 狠狠综合久久av一区二区小说 | 欧美日韩一区在线观看| 久久精品国产精品亚洲综合| 夜夜嗨av一区二区三区四季av| 国产一区二区三区视频在线观看| 欧美日韩岛国| 欧美v日韩v国产v| 欧美在现视频| 亚洲手机在线| 亚洲精品小视频在线观看| 韩日成人av| 国产欧美一区二区精品性| 欧美日韩国产综合新一区| 美女啪啪无遮挡免费久久网站| 欧美影院精品一区| 亚洲免费视频成人| 一本色道久久88精品综合| 亚洲激精日韩激精欧美精品| 国语自产精品视频在线看| 国产精品日韩精品欧美在线 | 狠狠综合久久| 国产亚洲欧美中文| 国产精品羞羞答答| 国产精品成人一区二区三区吃奶| 欧美激情女人20p| 免费久久99精品国产自在现线| 欧美在线影院| 欧美一区二区高清在线观看| 亚洲一区二区三区在线| 一本大道久久a久久综合婷婷| 亚洲黄色成人久久久| 在线看片成人| 精品白丝av| 激情成人av在线| 国内精品久久久久久影视8| 国产精品自拍一区| 国产精品美女久久| 国产精品久久久久天堂| 欧美无砖砖区免费| 欧美性天天影院| 国产精品福利久久久| 欧美亚州在线观看| 欧美午夜激情在线| 欧美性理论片在线观看片免费| 欧美日韩影院| 欧美日韩在线免费观看| 欧美日韩在线精品| 欧美小视频在线| 国产精品草草| 国产精品国产三级国产专播品爱网| 欧美午夜精品一区|