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

CTO寫的代碼,真是絕了!

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

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

[[338627]]
圖片來自 Pexels

 

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

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

解決思路

①首先構(gòu)建一個 GeneralChannelRule 基礎(chǔ)規(guī)則抽象類,定義一個抽象方法process(),不同的渠道都需要實現(xiàn)該抽象方法。

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

②編寫一個騰訊的規(guī)則類,定義具體對于騰訊渠道數(shù)據(jù)的處理邏輯。

代碼如下:

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

③編寫一個頭條的規(guī)則類,定義具體對于頭條數(shù)據(jù)的處理邏輯。

代碼如下:

  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.   .... 

⑤使用規(guī)則對數(shù)據(jù)進行處理。

代碼如下:

  1. public static void main(String[] args) { 
  2.         //這里我們模擬接收到的數(shù)據(jù),其渠道為為TOUTIAO,來自頭條的數(shù)據(jù) 
  3.         String sign = "TOUTIAO"
  4.         GeneralChannelRule rule
  5.         //根據(jù)對應(yīng)渠道獲取對應(yīng)的具體規(guī)則實現(xiàn)類 
  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.         //執(zhí)行 
  14.         rule.process(); 
  15.     } 

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

a.當(dāng)我們需要新增新的渠道的時候,需要對 main 方法中的邏輯進行修改調(diào)整。

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

b.新增渠道后,修改代碼會產(chǎn)生大量的 if else,不太優(yōu)雅。

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

新的思路

①下面我們調(diào)整一下枚舉類,增加一個 GeneralChannelRule 屬性,并且給對應(yīng)渠道構(gòu)建對應(yīng)的 GeneralChannelRule 實現(xiàn)類,新增一個 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 與規(guī)則具體實現(xiàn)進行綁定。

通過改變:

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

最后

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

作者:聚 IT

編輯:陶家龍

出處:toutiao.com/i6847406631983153672

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2020-10-10 09:09:21

CTOCRUD設(shè)計

2021-07-20 06:37:33

CTO代碼程序員

2021-03-02 20:01:08

寫代碼開發(fā)工具idea

2021-10-18 08:15:12

CTO代碼裁員

2018-09-30 09:36:58

CTO代碼程序員

2020-10-28 11:40:08

MySQL索引數(shù)據(jù)庫

2021-03-01 08:57:41

CTO代碼架構(gòu)師

2021-12-29 07:44:51

Proto代碼微服務(wù)

2012-07-03 09:59:03

程序員

2021-02-25 11:30:17

代碼開發(fā)技術(shù)

2021-10-20 13:59:38

技術(shù)資訊

2021-04-21 10:27:17

JavaScript代碼項目

2021-08-09 23:53:50

排序中國

2020-11-03 11:14:38

Java方法代碼

2020-09-22 14:51:41

數(shù)據(jù)類型變量

2016-08-30 18:14:43

管理51CTO技術(shù)

2014-11-11 14:52:28

程序員工程師

2014-02-28 13:46:35

Angular代碼

2019-07-10 08:56:58

代碼互聯(lián)網(wǎng)網(wǎng)絡(luò)

2025-02-26 10:00:00

開發(fā)APIJava
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线四虎| 日韩一区在线播放 | 欧美区日韩区 | 青青草免费在线视频 | 亚洲播放一区 | 日韩成人免费视频 | 亚洲免费观看 | 天天插天天操 | 成年人在线观看视频 | 欧美在线精品一区 | 在线观看视频一区 | 国产一区在线免费观看 | 日韩欧美精品在线播放 | 亚洲精品二三区 | 亚洲国产精品99久久久久久久久 | 国产成人精品999在线观看 | 成人在线中文字幕 | 久久日韩精品 | 国产一区二区在线观看视频 | 99精品在线观看 | 2022精品国偷自产免费观看 | 激情网站 | 国产精品成人在线观看 | 久久大陆 | 精品国产青草久久久久福利 | 欧美福利 | 亚洲永久字幕 | 免费在线看a | 国内自拍偷拍 | 中文字幕乱码一区二区三区 | 成人蜜桃av | 欧美日韩中文在线 | 天天看天天操 | 三级国产三级在线 | 欧美精品久久 | 国产视频精品视频 | 国产精品成人在线播放 | h片免费在线观看 | www.青青草| 国产精品欧美精品 | 日本免费黄色 |