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

CTO寫的代碼,真是絕了!

新聞
本文通過一個簡單的例子來展示如何通過枚舉巧妙地干掉 if-else,使代碼看起來更佳優雅。

 最近我看到某廠的 CTO 寫的代碼,被全網吐槽,我們一起來欣賞一下!

[[338627]]
圖片來自 Pexels

 

本文通過一個簡單的例子來展示如何通過枚舉巧妙地干掉 if-else,使代碼看起來更佳優雅。

場景:當我們接收到一些數據需要對其進行處理時,由于它們來自于不同的渠道(如:騰訊,頭條),不同渠道所需的處理方式不同,下面我們寫一個簡單 Demo 來實現該的場景。

解決思路

①首先構建一個 GeneralChannelRule 基礎規則抽象類,定義一個抽象方法process(),不同的渠道都需要實現該抽象方法。

  1. public abstract class GeneralChannelRule { 
  2.  public abstract void process(); 

②編寫一個騰訊的規則類,定義具體對于騰訊渠道數據的處理邏輯。

代碼如下:

  1. public class TencentChannelRule extends GeneralChannelRule 
  2.    @Override 
  3.     public void process() { 
  4.         // Tencent處理邏輯 
  5.     } 

③編寫一個頭條的規則類,定義具體對于頭條數據的處理邏輯。

代碼如下:

  1. public class TouTiaoChannelRule extends GeneralChannelRule 
  2.    @Override 
  3.     public void process() { 
  4.         // TouTiao處理邏輯 
  5.     } 

④建立一個簡單的枚舉類。

代碼如下:

  1. public enum ChannelRuleEnum { 
  2.     /** 
  3.      * 頭條 
  4.      */ 
  5.     TOUTIAO("TOUTIAO"), 
  6.     /** 
  7.      * 騰訊 
  8.      */ 
  9.     TENCENT("TENCENT"), 
  10.     ; 
  11.   .... 

⑤使用規則對數據進行處理。

代碼如下:

  1. public static void main(String[] args) { 
  2.         //這里我們模擬接收到的數據,其渠道為為TOUTIAO,來自頭條的數據 
  3.         String sign = "TOUTIAO"
  4.         GeneralChannelRule rule
  5.         //根據對應渠道獲取對應的具體規則實現類 
  6.         if (ChannelRuleEnum.TENCENT.code.equals(sign)) { 
  7.             rule = new TencentChannelRule(); 
  8.         } else if (ChannelRuleEnum.TOUTIAO.code.equals(sign)) { 
  9.             rule = new TouTiaoChannelRule(); 
  10.         } else { 
  11.             //匹配不到 
  12.         } 
  13.         //執行 
  14.         rule.process(); 
  15.     } 

解析:如果通過上面的方式,則存在則兩個缺點。

a.當我們需要新增新的渠道的時候,需要對 main 方法中的邏輯進行修改調整。

這違背了設計模式中的開放封閉規則。開放封閉原則的核心的思想是軟件實體是可擴展,而不可修改的。也就是說,對擴展是開放的,而對修改是封閉的。

b.新增渠道后,修改代碼會產生大量的 if else,不太優雅。

為了解決以上的兩個問題,我們可以借助枚舉類來巧妙優化。

新的思路

①下面我們調整一下枚舉類,增加一個 GeneralChannelRule 屬性,并且給對應渠道構建對應的 GeneralChannelRule 實現類,新增一個 match() 匹配方法。

代碼如下:

  1. public enum ChannelRuleEnum { 
  2.  
  3.     /** 
  4.      * 頭條 
  5.      */ 
  6.     TOUTIAO("TOUTIAO",new TouTiaoChannelRule()), 
  7.     /** 
  8.      * 騰訊 
  9.      */ 
  10.     TENCENT("TENCENT",new TencentChannelRule()), 
  11.     ; 
  12.  
  13.     public String name
  14.  
  15.     public GeneralChannelRule channel; 
  16.  
  17.     ChannelRuleEnum(String name, GeneralChannelRule channel) { 
  18.         this.name = name
  19.         this.channel = channel; 
  20.     } 
  21.  
  22.   //匹配 
  23.     public static ChannelRuleEnum match(String name){ 
  24.         ChannelRuleEnum[] values = ChannelRuleEnum.values(); 
  25.         for (ChannelRuleEnum value : values) { 
  26.             if(value.name.equals(name)){ 
  27.                 return value; 
  28.             } 
  29.         } 
  30.         return null
  31.     } 
  32.     public String getName() { 
  33.         return name
  34.     } 
  35.  
  36.     public GeneralChannelRule getChannel() { 
  37.         return channel; 
  38.     } 

②改寫程序,代碼如下:

  1. public static void main(String[] args) { 
  2.         String sign = "TOUTIAO"
  3.         ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign); 
  4.         GeneralChannelRule rule = channelRule.channel; 
  5.         rule.process(sign); 
  6.     } 

解析:通過使用枚舉類,在枚舉中將 key 與規則具體實現進行綁定。

通過改變:

  • 可以減少 if-else 使得代碼更加優雅。
  • 如果需要新增渠道,我們只需要在編寫具體規則實現類并繼承 GeneralChannelRule 抽象類,并在枚舉類中新增的枚舉,而不需要改動到原先的任何代碼。這符合了開發封閉原則。

最后

以上是通過枚舉來巧妙干掉 if-else 的方案,對于減少 if-else 還有很多有趣的解決方案(如:狀態設計模式等),感興趣的朋友去查閱相關的資料。

作者:聚 IT

編輯:陶家龍

出處:toutiao.com/i6847406631983153672

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-10-10 09:09:21

CTOCRUD設計

2021-07-20 06:37:33

CTO代碼程序員

2021-03-02 20:01:08

寫代碼開發工具idea

2021-10-18 08:15:12

CTO代碼裁員

2018-09-30 09:36:58

CTO代碼程序員

2020-10-28 11:40:08

MySQL索引數據庫

2021-03-01 08:57:41

CTO代碼架構師

2021-12-29 07:44:51

Proto代碼微服務

2012-07-03 09:59:03

程序員

2021-04-21 10:27:17

JavaScript代碼項目

2021-02-25 11:30:17

代碼開發技術

2021-10-20 13:59:38

技術資訊

2020-09-22 14:51:41

數據類型變量

2016-08-30 18:14:43

管理51CTO技術

2021-08-09 23:53:50

排序中國

2020-11-03 11:14:38

Java方法代碼

2014-11-11 14:52:28

程序員工程師

2014-02-28 13:46:35

Angular代碼

2019-07-10 08:56:58

代碼互聯網網絡

2020-03-12 07:42:49

代碼程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩久久久久 | 国产视频中文字幕 | 欧美一区二区三区国产精品 | 欧美日韩电影一区二区 | 亚洲一区二区三区视频 | 亚洲一区二区日韩 | 亚洲精品一区二区 | 中文字幕国产精品 | 暖暖日本在线视频 | 97色在线视频 | 啪啪网页 | 国产精品视频一区二区三区 | 成人国产免费视频 | 国产精品入口麻豆www | 亚洲精品视频在线 | 亚洲成人精品久久久 | 欧美激情久久久 | 大学生a级毛片免费视频 | 久久性av| 91在线免费视频 | 亚洲国产精品日韩av不卡在线 | 欧美精品久久久久久久久久 | 激情国产 | 国产精品一码二码三码在线 | 精品91久久久 | 久久av一区二区三区 | 午夜在线影院 | 亚洲欧洲精品一区 | 欧美黄色片 | 欧美日韩最新 | 少妇久久久 | 色吧综合 | 亚洲欧美视频一区二区 | 欧美一区二区三区四区视频 | 日韩成人精品在线观看 | 久精品久久 | 欧美一区二区三区在线播放 | 久久r精品| 日韩av三区 | 一区二区三区亚洲 | 亚洲一区亚洲二区 |