大廠常問iOS面試題--組件化篇

1.組件化有什么好處?

  • 業(yè)務(wù)分層、解耦,使代碼變得可維護(hù);

  • 有效的拆分、組織日益龐大的工程代碼,使工程目錄變得可維護(hù);

  • 便于各業(yè)務(wù)功能拆分、抽離,實現(xiàn)真正的功能復(fù)用;

  • 業(yè)務(wù)隔離,跨團(tuán)隊開發(fā)代碼控制和版本風(fēng)險控制的實現(xiàn);

  • 模塊化對代碼的封裝性、合理性都有一定的要求,提升開發(fā)同學(xué)的設(shè)計能力;

  • 在維護(hù)好各級組件的情況下,隨意組合滿足不同客戶需求;(只需要將之前的多個業(yè)務(wù)組件模塊在新的主App中進(jìn)行組裝即可快速迭代出下一個全新App)

2.你是如何組件化解耦的?

  • 分層

    基礎(chǔ)功能組件:按功能分庫,不涉及產(chǎn)品業(yè)務(wù)需求,跟庫Library類似,通過良好的接口拱上層業(yè)務(wù)組件調(diào)用;不寫入產(chǎn)品定制邏輯,通過擴(kuò)展接口完成定制;

    基礎(chǔ)UI組件:各個業(yè)務(wù)模塊依賴使用,但需要保持好定制擴(kuò)展的設(shè)計

    業(yè)務(wù)組件:業(yè)務(wù)功能間相對獨(dú)立,相互間沒有Model共享的依賴;業(yè)務(wù)之間的頁面調(diào)用只能通過UIBus進(jìn)行跳轉(zhuǎn);業(yè)務(wù)之間的邏輯Action調(diào)用只能通過服務(wù)提供;

  • 中間件:target-action,url-block,protocol-class

3.為什么CTMediator方案優(yōu)于基于Router的方案?

Router的缺點(diǎn):

  • 在組件化的實施過程中,注冊URL并不是充分必要條件。組件是不需要向組件管理器注冊URL的,注冊了URL之后,會造成不必要的內(nèi)存常駐。注冊URL的目的其實是一個服務(wù)發(fā)現(xiàn)的過程,在iOS領(lǐng)域中,服務(wù)發(fā)現(xiàn)的方式是不需要通過主動注冊的,使用runtime就可以了。另外,注冊部分的代碼的維護(hù)是一個相對麻煩的事情,每一次支持新調(diào)用時,都要去維護(hù)一次注冊列表。如果有調(diào)用被棄用了,是經(jīng)常會忘記刪項目的。runtime由于不存在注冊過程,那就也不會產(chǎn)生維護(hù)的操作,維護(hù)成本就降低了。 由于通過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又不存在于當(dāng)前業(yè)務(wù)領(lǐng)域,于是當(dāng)前業(yè)務(wù)就不得不依賴public Protocol。這對于將來的業(yè)務(wù)遷移是有非常大的影響的。

CTMediator的優(yōu)點(diǎn):

  • 調(diào)用時,區(qū)分了本地應(yīng)用調(diào)用和遠(yuǎn)程應(yīng)用調(diào)用。本地應(yīng)用調(diào)用為遠(yuǎn)程應(yīng)用調(diào)用提供服務(wù)。

  • 組件僅通過Action暴露可調(diào)用接口,模塊與模塊之間的接口被固化在了Target-Action這一層,避免了實施組件化的改造過程中,對Business的侵入,同時也提高了組件化接口的可維護(hù)性。

  • 方便傳遞各種類型的參數(shù)。

4.基于CTMediator的組件化方案,有哪些核心組成?

  • CTMediator中間件:集成就可以了

  • 模塊Target_%@:模塊的實現(xiàn)及提供對外的方法調(diào)用Action_methodName,需要傳參數(shù)時,都統(tǒng)一以NSDictionary*的形式傳入。

  • CTMediator+%@擴(kuò)展:擴(kuò)展里聲明了模塊業(yè)務(wù)的對外接口,參數(shù)明確,這樣外部調(diào)用者可以很容易理解如何調(diào)用接口。

更多iOS面試題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容