如何減少專案中if else巢狀

2021-09-25 00:17:05 字數 3681 閱讀 6157

一般建議if-else巢狀不超過三層

原始**

bean類

private

class

shareitem

public

inte***ce

sharelistener

定義分享介面

public

void

share

(shareitem item,sharelistener listener)

else}}

else

if(item.type==type_image)

else}}

else

if(item.type==type_text)

else}}

else

if(item.type==type_image_text)

else}}

else}}

else

}}

目前來看思路清晰,但share方法分支15條,意味著每次回看**都的考慮15種情況,並把15中情況全部測試,如果增加效其他功能又要增加多條分支,還要讀**改**。我們的腦力不該花費在無止境的分支語句裡。分析**上面**分支原因:null判斷、業務判斷、狀態判斷

多次判斷是否為null時可以介面分層

1、方法一:介面分層

所謂介面分層指:把介面分為內部和外部介面,所有空值判斷放在外部介面完成,只處理一次;而內部介面傳入的變數有內部介面保證不為空,從而減少null

public

void

share

(shareitem item,sharelistener listener)

return;}

if(listener==null)};

}shareimpl

(item,listener);}

private

void

shareimpl

(shareitem item,sharelistener listener)

else

}else

if(item.type==type_image)

else

}else

if(item.type==type_text)

else

}else

if(item.type==type_image_text)

else

}else

}

上面**分為外部介面share和內部介面shareimpl,shareitem和sharelistener的判斷都放在share裡完成,那麼shareimpl就減少了if-else巢狀,這樣巢狀就不超過3層

但shareimpl了還是包含分享型別的判斷,即業務判斷,分享的型別隨時可能改變或新增,我們用多型解決,多型不但能應付業務改變的情況,也可以減少if-else巢狀

2、方法二:利用多型

利用多型,每種業務單獨處理,在介面不再做任何業務判斷。把shareitem抽象出來,作為基礎類,然後針對每種業務各自實現其子類

public

abstract

class

shareitem

public

abstract

void

doshare

(sharelistener listener);}

public

class

link

extends

shareitem

@override

public

void

doshare

(sharelistener listener)

}public

class

image

extends

shareitem

@override

public

void

doshare

(sharelistener listener)

}public

class

text

extends

shareitem

@override

public

void

doshare

(sharelistener listener)

}public

class

imagetext

extends

shareitem

@override

public

void

doshare

(sharelistener listener)

}

注意:上面每個子類的構造方法還對每個欄位做了空值處理,為空的話,賦值default,這樣如果使用者傳了空值,在除錯就會發現問題。

實現多型後,分享介面就簡單多了:

public

void

share

(shareitem item,sharelistener listener)

return;}

if(listener==null)};

}shareimpl

(item,listener);}

private

void

shareimpl

(shareitem item,sharelistener listener)

public shareitem createlinkshareitem

(string link,string title,string content)

public shareitem createimageshareitem

(string imagepath)

public shareitem createtextshareitem

(string content)

public shareitem createimagetextshareitem

(string imagepath,string content)

或者有人會說,這樣使用者也需要額外來了解多幾個方法,其實讓使用者多了解幾個方法好過多了解幾個類,而方法名一看就知道意圖,成本還是挺小的,時可以接受的。

其實這種情況,更多人想到的是工廠模式,但工廠模式使用者也需要額外了解多今幾個type型別,而且工廠模式難免要引入分支,我們可以用map消除分支。

3、方法三:使用map代替分支語句

把所有分享型別預先快取在map裡,那麼就可以直接get獲取具體型別,消除分支:

private map?extends

shareitem

>> map=

newhashmap

<

>()

;private

void

init()

public shareitem creatshareitem

(int type)

catch

(exception e)

}

減少專案中的dll數量

unity有了packagemanager後,我們可以匯入很多我們想要的功能,比如lwrp,ecs之類。但是如果我們隨意匯入然後不管他們的話我們在library scriptassemblies會發現有非常多的dll檔案。這些dll就是我們匯入一些package時所需要的 比如我們在引用lwrp的時...

在前端開發中如何減少或取代if else

最近在開發過程中時常因為專案比較忙,都是先考慮實現功能,最近回首看 發現很多冗長的if else判斷,今日就寫一些自己在替代if else的一些方案。需求 當a 為或假的時候b的取值也隨之發生變化 let a true,b null console.time time1 if a else cons...

專案中的if else太多了,該怎麼重構?

if msgtype 文字 else if msgtype else if msgtype else 就是根據訊息的不同型別有不同的處理策略,每種訊息的處理策略 都很長,如果都放在這種if else 快中,很難維護也很醜,所以我們一開始就用了策略模式來處理這種情況。策略模式還挺簡單的,就是定義乙個介...