一般建議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 快中,很難維護也很醜,所以我們一開始就用了策略模式來處理這種情況。策略模式還挺簡單的,就是定義乙個介...