自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

CTO寫的代碼,真是絕了!

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

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

[[338627]]
圖片來自 Pexels

 

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

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

解決思路

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

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

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

代碼如下:

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

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

代碼如下:

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

④建立一個(gè)簡(jiǎn)單的枚舉類。

代碼如下:

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

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

代碼如下:

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

解析:如果通過上面的方式,則存在則兩個(gè)缺點(diǎn)。

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

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

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

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

新的思路

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

通過改變:

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

最后

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

作者:聚 IT

編輯:陶家龍

出處:toutiao.com/i6847406631983153672

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

2020-10-10 09:09:21

CTOCRUD設(shè)計(jì)

2021-07-20 06:37:33

CTO代碼程序員

2021-03-02 20:01:08

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

2018-09-30 09:36:58

CTO代碼程序員

2021-10-18 08:15:12

CTO代碼裁員

2020-10-28 11:40:08

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

2021-03-01 08:57:41

CTO代碼架構(gòu)師

2021-12-29 07:44:51

Proto代碼微服務(wù)

2012-07-03 09:59:03

程序員

2021-10-20 13:59:38

技術(shù)資訊

2021-02-25 11:30:17

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

2021-04-21 10:27:17

JavaScript代碼項(xiàng)目

2021-08-09 23:53:50

排序中國(guó)

2020-09-22 14:51:41

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

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

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

2025-02-26 10:00:00

開發(fā)APIJava

2020-03-12 07:42:49

代碼程序員
點(diǎn)贊
收藏

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