iOS App組件化開發實踐之需要思考的問題
以下討論內容都基于這個方案
問題:沒法使用 closing issues via commit messages 怎么辦?
1.測試人員不能準確知道bug需要發給哪個業務組件或是哪個弱業務組件,甚至有時候這個bug是基礎功能組件造成的。
2.因為原因1,所以導致測試人員需要把bug統一發給主App的git project。根據我們的CI流程,我們沒有辦法把某個業務組件的信息(比如某個commit里的message是:Fix#213)通過提merge request的方式帶給主App。
解決
這個問題并沒有很好的解決。修復bug還是需要手動關閉issues。幸好的是,測試人員會即時通過郵件收到。
問題:發版效率低怎么辦?
1.package這一步要編譯多個Architecture,造成CI流程耗時。
2.發版lint這一步需要Test/Lint源碼/Lint二進制,造成CI流程耗時。
3.會同時有多個庫需要跑CI。有些只是例行的Test,有些是走發版流程,有些是其他App的CI。尤其是在周五,大家都準備今天發個版回家,都集中在了一起。這種情況造成排隊,需要等待長時間。
4.git runner數量少,造成排隊。也無法充分利用gitlab runner的pipelines并行操作。
解決
1.首先是盡量多搞幾臺runner。比如嘗試使用docker?發動大家把機器都做成runner。
2.減化流程。發版lint這一步可以不考慮Test,因為平時dev分支普通commit都會觸發Test。當merge到master發版時其實可以不用Test。也可以考慮不lint二進制,實際情況告訴我們,一般報錯或警告都是源碼部分,二進制沒有什么問題。
3.package時依賴庫盡量使用二進制庫。
4.避免周五大家都發版。平時能發版就發版。
問題:一旦某個偏底層的庫升級main版本號,而又不得不使用它時;依賴它的所有庫都要發版,工作量大怎辦?
造成這個問題的原因是API不兼容或有重大重構。而且還會在發版效率低這個問題上雪上加霜。
解決
必須發版,這個是沒辦法的。
1.在設計之初,充分考慮和驗證,盡量避免這種情況出現。
2.如果是重大重構問題,必須盡量保證API向前兼容,做好充分地測試。
3.盡量避免“不得不使用它”這種情況。
問題:一旦某個偏底層的庫升級main版本號,誰來推動和通知大家把依賴它的庫也升級?
這個問題在小團隊中是不存在的,大家吼一聲就行了。剩下的都是體力活。
但如果是大團隊,多團隊,異地,多公司這種情況。就很難辦了。
解決
盡量不要,盡量不要,盡量不要。重要的事情說三遍。
問題:自己改自己的,還是大家一起改?
我發現我依賴的一個基礎功能組件有一個bug導致了我這個業務組件有一個bug。但這個基礎功能組件不是我維護的。我是提一個merge request呢,還是直接把它去改了?提merge reqeust效率低,可能維護者在其他Team,在異地,沒有上班,正在忙等等。自己去改效率高,但是風險高。我也不確定會不會搞掛其他東西,如果沒有測試那更是不敢改。感覺也不符合規矩。
大多數情況下不是bug,而是需求滿足不了。我需要加新需求。
無論是重用的資源或是重用的代碼,它們最終都會變成一個組件。而這個組件目的就是給大家服務的。到底是大家一起改,還是有專人維護?
解決
沒有解決方案。
我們小團隊對于這個問題目前不是很棘手。大家都有權限去改組件,只要你走正常發版流程。
問題:業務不能準確劃分。你中有我,我中有你怎么辦?
一開始我們太單純了,認為業務一就是一,二就是二。就算業務出現交叉,也只是A業務的AViewContrller需要push B業務的BViewController而已。其實不然!
比如首頁。首頁是這個App的第一個頁面,每個重要的業務組件都希望在首頁占有一席之地。那這些業務的UI和logic寫在哪里呢?寫在PBHomePageBusinessModule里面?不是說好要解耦的么,這樣不就耦合在一起了?
那分散在各個業務組建里面,又如何集成到PBHomePageBusinessModule里面。既解耦,又能正常工作呢?
解決
現在有PBTradeBusinessModule、PBLotteryBusinessModule、PBHomePageBusinessModule這三個業務組件。大家都依賴一個基礎功能組件,里面提供一個基類YTXInjectedIntoVCManager。大家都知道這個基類。
PBTradeBusinessModule提供一個Object Method返回一個YTXInjectedIntoVCManager子類實現。
PBLotteryBusinessModule提供一個Object Method返回一個YTXInjectedIntoVCManager子類實現。
PBHomePageBusinessModule會通過URL獲取兩個YTXInjectedIntoVCManager注入到自己的ViewController里。
YTXInjectedIntoVCManager里面提供一個rootView表示UI部分。再定義協商一些方法,讓PBHomePageBusinessModule的ViewController調用;使用delegate反向傳遞信息。
這樣的好處是即避免了耦合,也避免了知道太多業務的細節(行為/UI)。
比如
#pragma mark - 自生行為
- (void)updateUI:(nullable NSDictionary *) dict;//更新UI
- (void)updateData:(nullable NSDictionary *) dict;//更新數據
#pragma mark - 對應VC生命周期
- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
來自:http://www.yiqixiabigao.com/ios-appzu-jian-hua-kai-fa-shi-jian-zhi-bu-neng-hu-shi-de-wen-ti/