業(yè)務(wù)處理現(xiàn)狀
Activity需要跟多個(gè)頁(yè)面組件交互處理結(jié)果,代碼可能就會(huì)變成這樣,A到K 11個(gè)分支處理。如果分支還有嵌套分支,那么代碼的閱讀成本、維護(hù)成本就會(huì)成倍增加。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
CODE_A -> {
}
CODE_B -> {
}
CODE_C -> {
}
CODE_D -> {
}
CODE_E -> {
}
CODE_F -> {
}
CODE_G -> {
}
CODE_H -> {
}
CODE_I -> {
}
CODE_J -> {
}
CODE_K -> {
}
}
}
痛點(diǎn)
1.閱讀成本高
以上代碼是從實(shí)際項(xiàng)目中抽取處理的,經(jīng)過(guò)了刪減勉勉強(qiáng)強(qiáng)還是可讀的。但實(shí)際情況是,分支嵌套分支,代碼一屏無(wú)法展示完,相當(dāng)難受了。
2.維護(hù)成本高
所有業(yè)務(wù)分支處理都堆在一起,其中一個(gè)業(yè)務(wù)需要修改,就得把其他業(yè)務(wù)分支也過(guò)一邊,以免其受到影響。原本只需要修改A業(yè)務(wù),其他B\C\E業(yè)務(wù)我都得過(guò)一邊,維護(hù)成本直線往上升了。
如何解決?
方案1:函數(shù)封裝業(yè)務(wù)
一個(gè)函數(shù)對(duì)應(yīng)一種業(yè)務(wù)處理,在分支比較少的情況下,還是比較適合的,但分支過(guò)多,就不太適應(yīng),因?yàn)榇a無(wú)論如何轉(zhuǎn)移都是在Activity中,勢(shì)必會(huì)造成其不斷地膨脹。
方案2:類封裝業(yè)務(wù)
一個(gè)類對(duì)應(yīng)一種業(yè)務(wù)處理,其中一種業(yè)務(wù)發(fā)生變化,不會(huì)影響其他業(yè)務(wù),適合業(yè)務(wù)分支較多、業(yè)務(wù)處理較復(fù)雜的情況。
以下會(huì)基于類封裝業(yè)務(wù)來(lái)解決,具體方案
1.定義ResultHandler 接口,描述業(yè)務(wù)處理的統(tǒng)一入口,每種業(yè)務(wù)處理都要實(shí)現(xiàn)它。
interface ResultHandler {
abstract fun onResult(intentData: Intent?)
}
2.定義結(jié)果分發(fā)器ResultDispatcher ,根據(jù)requestCode來(lái)分發(fā)。
object ResultDispatcher {
private const val CODE_A = 1
private const val CODE_B = 2
private val handlers = mutableMapOf<Int, ResultHandler>().apply {//1
put(CODE_A, AResultHandler())
put(CODE_B, BResultHandler())
}
fun dispatch(requestCode: Int, intentData: Intent?) {//2
handlers[requestCode]?.onResult(intentData)
}
}
注釋1:維護(hù)requestCode和ResultHandler的對(duì)應(yīng)關(guān)系,一對(duì)一;
注釋2:根據(jù)requestCode查找對(duì)應(yīng)的ResultHandler來(lái)處理也出;
3.各業(yè)務(wù)處理器的實(shí)現(xiàn)
//A業(yè)務(wù)處理
class AResultHandler : ResultHandler {
override fun onResult(intentData: Intent?) {
//do something
}
}
//B業(yè)務(wù)處理
class BResultHandler : ResultHandler {
override fun onResult(intentData: Intent?) {
//do something
}
}
4.調(diào)用處
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
ResultDispatcher.dispatch(requestCode, data)
}
以上分析有不對(duì)的地方,請(qǐng)指出,互相學(xué)習(xí),謝謝哦!