組件化
1.組件化有什么好處?
1.1業(yè)務(wù)分層,解耦,使代碼變得可維護;
1.2有效的拆分,組織日益龐大的工程代碼,使工程目錄變得可維護;
1.3便于各業(yè)務(wù)功能拆分,抽離,實現(xiàn)真正的功能復(fù)用;
1.4業(yè)務(wù)隔離,跨團隊開發(fā)代碼控制和版本風(fēng)險控制的實現(xiàn);
1.5模塊化對代碼的封裝性,合理性都有一定的要求,提升開發(fā)同學(xué)的設(shè)計能力;
1.6在維護好各級組件的情況下,隨意組合滿足不同客戶需求;(只需要將之前的多個業(yè)務(wù)組件模塊在新的APP中進行組裝即可快速迭代出下一個全新APP)。
2.如何組件化解耦的?
2.1分層
基礎(chǔ)功能組件:按功能分庫,不涉及產(chǎn)品業(yè)務(wù)需求,跟庫Library類似,通過良好的接口供上層業(yè)務(wù)組件調(diào)用;不寫入產(chǎn)品定制邏輯,通過擴展接口完成定制;
基礎(chǔ)UI組件:各個業(yè)務(wù)模塊依賴使用,但需求保持好定制擴展的設(shè)計;
業(yè)務(wù)組件:業(yè)務(wù)功能間相對獨立,相互間沒有Model共享的依賴;業(yè)務(wù)之間的頁面調(diào)用只能通過UIBus進行跳轉(zhuǎn);業(yè)務(wù)之間的邏輯Action調(diào)用只能通過服務(wù)提供;
2.2中間件:target-action,url-block,protocol-class
3.為什么CTMediator方案優(yōu)于基于Router的方案?
Router的缺點:
3.1在組件的實施過程中,注冊URL并不是充分必要條件。組件是不需要向組件管理器注冊URL的,注冊了URL之后,會造成不必要的內(nèi)存常駐。注冊URL的目的其實是一個服務(wù)發(fā)現(xiàn)的過程,在iOS領(lǐng)域中,服務(wù)發(fā)現(xiàn)的方式是不需要通過主動注冊的,使用runtime就可以了。另外,注冊部分的代碼的維護是一個相對麻煩的事情,每一次支持新調(diào)用時,都要去維護一次注冊列表。如果有調(diào)用被棄用了,是經(jīng)常會忘記刪項目的。runtime由于不存在注冊列表。那就也不會產(chǎn)生維護的操作,維護成本就降低了。由于通過runtime做到了服務(wù)的自動發(fā)現(xiàn),拓展調(diào)用接口的任務(wù)就僅在于各自的模塊,任何一次新接口添加,新業(yè)務(wù)添加,都不必去主工程做操作,十分透明。
在iOS領(lǐng)域里,一定是組件化的中間件為openURL提供服務(wù),而不是openURL方式為組件化提供服務(wù)。如果在給App實施組件化方案的過程中是基于openURL的方案的話,有一個致命缺陷:非常規(guī)對象(不能被字符串化到URL中的對象,例如UIImage)無法參與本地組件間調(diào)度。
在本地調(diào)用中使用URL的方式其實是不必要的,如果業(yè)務(wù)工程師在本地間調(diào)度時需要給出URL,那么就不可避免要提供params,在調(diào)用時要提供哪些params是業(yè)務(wù)工程師很容易懵逼的地方。
為了支持傳遞非常規(guī)參數(shù),蘑菇街的方案采用了protocol,這個會侵入業(yè)務(wù)。由于業(yè)務(wù)中的某個對象需要被調(diào)用,因此必須要符合某個可被調(diào)用的protocol,然而這個protocol又不存在于當前業(yè)務(wù)領(lǐng)域,于是當前業(yè)務(wù)就不得不依賴public
Protocol。這對于將來的業(yè)務(wù)遷移是有非常大的影響的。
CTMediator的優(yōu)點:
調(diào)用時,區(qū)分了本地應(yīng)用調(diào)用和遠程應(yīng)用調(diào)用。本地應(yīng)用調(diào)用為遠程應(yīng)用調(diào)用提供服務(wù)。
組件僅通過Action暴露可調(diào)用接口,模塊與模塊之間的接口被固化在了Target-Action這一層,避免了實施組件化的改造過程中,對Business的侵入,同時也提高了組件化接口的可維護性。
方便傳遞各種類型的參數(shù)。
4.基于CTMediator的組件化方案,有哪些核心組成?
CTMediator中間件:集成就可以了
模塊Target_%@:模塊的實現(xiàn)及提供對外的方法調(diào)用Action_methodName,需要傳參數(shù)時,都統(tǒng)一以NSDictionary*的形式傳入。
CTMediator+%@擴展:擴展里聲明了模塊業(yè)務(wù)的對外接口,參數(shù)明確,這樣外部調(diào)用者可以很容易理解如何調(diào)用接口。