兩個方法幹掉程式碼中那些複雜的if-else

01導讀

在專案中你有沒有遇到過這樣的程式碼:(虛擬碼如下)

if(type==0){ return “01”; }else if(type==1){ return “03”; }else if(type==2){ return “04”; }else if(type==3){ return “05” } //……

上面這種一大堆判斷,看著是不是很讓人頭皮發麻,如果某天需求還需要增加判斷是不是還得往下增加判斷條件,這種大量的if/else if/……/else寫在專案中估計程式碼review時會被罵死。

為了使程式碼看起來更加的簡潔以及擴充套件性更強,今天我們就改造一下這種程式碼(其實這種大量的if/else if/else也有一點好處就是邏輯看著比較簡單易懂)。

02程式碼改造(簡單的業務)

如果只是上面這種簡單的

根據條件進行判斷返回固定的值

,我們可以利用map的特性來進行最佳化(

在map中一個key只會繫結一個指定的value

)。所以根據這個特性我們把上面的程式碼改造如下:

private static final HashMap HASH_MAP =new HashMap<>();static { HASH_MAP。put(0,“01”); HASH_MAP。put(1,“03”); HASH_MAP。put(2,“04”); HASH_MAP。put(3,“05”); //如果還有其他往後面加;}

在需要返回值的地方

直接使用HASH_MAP。get(type)

就可以得到你想要的值了,這種方法是不是簡單明瞭也避免了使用大量的if/esle if/……

上面的這個key或者value值也可以用列舉,這樣的話也便於後面使用時可以進行統一管理;

03程式碼改造(複雜的業務)

可能在有些業務場景下,不一定只是根據條件去返回固定的值,而是在判斷裡面還要做一些其他的業務邏輯,虛擬碼如下:

if (type==0){ doSomething(); System。out。println(“我是火影忍者鳴人:”+type); }else if (type==1){ doSomething(); System。out。println(“我是火影忍者卡卡西”+type); }else if(type==2){ doSomething(); System。out。println(“我是木葉三忍自來也”+type); }

像上面這種在條件判斷之後還需要做其他操作的業務,顯然上面那種map的方式不能夠滿足了,這個時候我們可以使用

策略+工廠

的方法進行改造。

1:首先我們需要新建一個介面,如下:

public interface Handler extends InitializingBean { public void doSomething(Integer type);}

2:實現上面的介面把if條件裡面的操作給抽取出來,這裡我就寫一個實現類,剩下的大家可以直接複製就行,程式碼如下:

@Componentpublic class HandlerImpl implements Handler{ @Override public void doSomething(Integer type) { System。out。println(“我是火影忍者鳴人:”+type); } //類初始化之後會執行這個方法 @Override public void afterPropertiesSet() throws Exception { Factory。putHandler(0,this); }}

上面的

Factory。putHandler(type,this)

可能暫時看得有點懵逼,彆著急往下繼續看。程式碼在下面。

3:這個時候我們就可以新建一個工廠來把if/else if/。。。。最佳化掉,程式碼如下:

public class Factory { //map裡面儲存的是判斷條件以及對應的Handle處理類; private static Map HANDLER_MAP= new HashMap(); //根據條件type得到對應的handler; public static Handler getHandler(Integer type){ return HANDLER_MAP。get(type); } public static void putHandler(Integer type,Handler handler){ HANDLER_MAP。put(type,handler); }}

4:到這裡基本上快要改造完了,現在我們再回頭看把最上面的if業務改造,程式碼如下:

@Test public void typeDo(){ Integer type=0; Handler handler = Factory。getHandler(type); handler。doSomething(type); }

執行結果也達到了預期的效果,如下圖01:

兩個方法幹掉程式碼中那些複雜的if-else

01

總結

上面我只是列了兩種怎麼最佳化大量的if/else if/。。。。。/else的方法,在實際專案中大家還是根據實際情況來處理使用,不要為了使用而使用!

作者:wangyuancun

微信公眾號:wangyuancun

原創:02

兩個方法幹掉程式碼中那些複雜的if-else