笔记|滴滴iOS客户端的架构,组件化,技术选型
筆記來源infoq:滴滴iOS客戶端的架構(gòu)演變之路
1,狀態(tài)機(jī),把訂單中的階段,例如:出租車的等待搶單、出租車的等待接駕、專車的等待搶單、專車的等待接駕,都當(dāng)成一種獨(dú)立的狀態(tài),每 個(gè)狀態(tài)機(jī)只需要知道可能要導(dǎo)向的狀態(tài)機(jī),從而做到了相對(duì)獨(dú)立,狀態(tài)機(jī)滿足了出租車、專車雙業(yè)務(wù)線的需求。
狀態(tài)機(jī)是什么?簡(jiǎn)單的概括為:用一個(gè)枚舉類型的變量(它通常是單例全局變量或本文件有效的靜態(tài)局部變量) ,根據(jù)這個(gè)變量當(dāng)前的狀態(tài)進(jìn)行對(duì)應(yīng)處理。
狀態(tài)機(jī)不只用在數(shù)據(jù)再加工,視圖(UIView)加載和變換,頁面跳轉(zhuǎn),業(yè)務(wù)線切換,也用在連續(xù)操作或處理控制。
狀態(tài)機(jī)都可以畫出對(duì)應(yīng)的狀態(tài)機(jī)切換圖。在狀態(tài)機(jī)切換圖上,它通常都是從不穩(wěn)定狀態(tài)向穩(wěn)定狀態(tài)定向遷移,狀態(tài)機(jī)都有方向性。
狀態(tài)機(jī)在復(fù)雜邏輯具有很大的使用空間,看了狀態(tài)機(jī)遷移圖,讓人一看就知道它的處理邏輯。能形象的表達(dá)復(fù)雜邏輯。
像【長(zhǎng)篇高能】ReactiveCocoa 和 MVVM 入門這篇文章說的能替換狀態(tài)機(jī),那是它不知道狀態(tài)機(jī)的真正使用范圍有多廣,并非它理解的僅僅是數(shù)據(jù)加工那么簡(jiǎn)單。
2,“代碼治理”,可以“分而治之”的目標(biāo)。
在各個(gè)業(yè)務(wù)線各自開發(fā)的情況下防止代碼大面積腐化,方便未來再做更加細(xì)致的架構(gòu)重構(gòu), 采用CocoaPods的方式進(jìn)行拆分;組件化之后,公共部分拆分為技術(shù)組件、公用業(yè)務(wù)組件,每個(gè)業(yè)務(wù)線是單獨(dú)組件,如出租車組件、專車組件、快車組件; 通過把不同功能的組件代碼拆分到不同的 pod 里,實(shí)現(xiàn)了業(yè)務(wù)線僅依賴于公共就可以迭代開發(fā),改善了功能開發(fā)和協(xié)同發(fā)版。組件化只是做了治理的第一步,后面的架構(gòu)優(yōu)化還任重而道遠(yuǎn)。
3,目前滴滴的 iOS 架構(gòu)采用 MVCS 和 MVVM 的架構(gòu)方式。MVCS 的 S 是 Store 的意思,包括服務(wù)器訪問接口控制、數(shù)據(jù)共享、數(shù)據(jù)緩存的能力,每個(gè) Store 處理一類情況,例如:訂單 Store 會(huì)包括發(fā)單、取消訂單、結(jié)束訂單、評(píng)價(jià)訂單等,常用地址 Store 會(huì)包含編輯常用地址、刪除常用地址、拉取常用地址等。MVCS 這種方式的思考邏輯是希望做到組件無狀態(tài),完全依賴于 Store 所返回的各種狀態(tài)信息,這種思想是非常類似于 React Native + Redux 的思路。
4,滴滴iOS客戶端的組件化是如何劃分的,采用什么技術(shù)實(shí)現(xiàn)?
我們?cè)?5年后半年實(shí)施了組件化,組件包括技術(shù)組件和業(yè)務(wù)組件,技術(shù)組件是可以跨 App 使用的,例如:網(wǎng)絡(luò)組件(長(zhǎng)連接和短連接)、界面導(dǎo)航管理組件(統(tǒng)一界面轉(zhuǎn)場(chǎng)方式,模塊間界面轉(zhuǎn)場(chǎng),通過openURL方式解耦);根據(jù)業(yè)務(wù)功能,已經(jīng)實(shí) 現(xiàn)了支付、登錄、消息、定位、廣告SDK、數(shù)據(jù)統(tǒng)計(jì)、分享等組件,每個(gè)組件是獨(dú)立的CocoaPods。
組件采用私有 CocoaPods 來實(shí)現(xiàn),并采用了 Local Pods 的方式,可以在本地不提交代碼的情況下,組件與調(diào)用方實(shí)現(xiàn)調(diào)試。組件間的頁面間跳轉(zhuǎn)支持 openURL 的方式,由 ONERoute 模塊進(jìn)行管理,頁面在 +(void)load 方法中完成注冊(cè),ONERoute 內(nèi)部保存一份 URL 與 Class 的對(duì)應(yīng)表,當(dāng)調(diào)用 openURL 時(shí),會(huì)查找到對(duì)應(yīng)的類,然后生成對(duì)應(yīng)的實(shí)例對(duì)象。這種方式可以通過 URL 解耦具體的類名稱,方便從 H5 拉起 Native 頁面,未來還可以實(shí)現(xiàn)流程的可配置化。在設(shè)置頁面里,還是直接依賴類的方式,避免過度使用 openURL。為了增加安全性,每個(gè)頁面會(huì)設(shè)置是否允許外部打開,僅有允許外部打開的頁面才可以通過系統(tǒng)的 openURL 方式打開。
筆記來源infoq:滴滴出行技術(shù)總監(jiān):關(guān)于技術(shù)選型的那些事兒
技術(shù)選型要謹(jǐn)慎。
技術(shù)選型關(guān)鍵需要思考三個(gè)角度:技術(shù)、業(yè)務(wù)和人。
技術(shù)
第一,要取其長(zhǎng)避其短;第二,要關(guān)注技術(shù)的發(fā)展前景。
技術(shù)的“前景”可以從幾個(gè)維度來判斷,有沒有長(zhǎng)期規(guī)劃、有沒有持續(xù)投入的人或者社區(qū)、問題解決的速度如何、業(yè)界使用案例及口碑、源碼質(zhì)量。
新技術(shù)實(shí)踐后的積累,有案例和背后的細(xì)節(jié),踩的坑,和避免這些坑。
業(yè)務(wù)
新技術(shù)往往被早期創(chuàng)業(yè)團(tuán)隊(duì)或大公司的新興業(yè)務(wù)使用
人
技術(shù)選型也非常依賴于人的能力。選型是一件很難被標(biāo)準(zhǔn)化的過程,選型的決策質(zhì)量跟人的眼界、經(jīng)驗(yàn)、業(yè)務(wù)敏感度、邏輯性等息息相關(guān)。就我自己來說,我在面臨一個(gè)選型問題時(shí)首先考慮的是去學(xué)習(xí),看看公司內(nèi)外類似的問題如何解決的,避免自己閉門造車,然后思考所有的可能性,列舉最核心需要考慮的因素,心里列一個(gè)方案優(yōu)劣對(duì)比,最后將這些邏輯整理清楚,落地成一個(gè)決策。
想做好技術(shù)選型還是挺難的,要想做好得有足夠的知識(shí)積累和實(shí)際踩坑的經(jīng)歷才行。
如何學(xué)習(xí)
最后難在信息究竟如何存入知識(shí)索引,知識(shí)太零散形成不了體系,建不了索引怎么辦。最入門的做法是看書,看別人是怎么將知識(shí)變成一個(gè)個(gè)章節(jié)的信息。要想掌握建立索引背后的方法論,我的經(jīng)驗(yàn)是先從兩個(gè)相近的技術(shù)開始,找到建索引的感覺,然后再鋪開去學(xué)習(xí)更多知識(shí)。有這樣困惑的開發(fā)者往往在學(xué)習(xí)方面有些貪心,覺得自己記性好可以囫圇吞棗式的將知識(shí)強(qiáng)行內(nèi)化,這樣做短期可以,長(zhǎng)期還是會(huì)遺忘,也形成不了經(jīng)驗(yàn)。
其實(shí)技術(shù)知識(shí)之間非常像,有很多共性的點(diǎn)可以挖掘。比如客戶端和前端開發(fā),各個(gè)框架在 View 生命周期管理、消息派發(fā)機(jī)制等方面非常像,后端開發(fā)則更加的套路化,無論用那種語言,最基本的分布式服務(wù)原理、緩存、隊(duì)列、數(shù)據(jù)庫等基礎(chǔ)組件原理,都萬變不離其宗。
如果我們更宏觀的看每個(gè)領(lǐng)域,甚至于都能發(fā)現(xiàn)領(lǐng)域之間的知識(shí)體系劃分也很類似。作為表現(xiàn)層的前端和客戶端,知識(shí)體系都可以分為語言、API、工程化、框架和設(shè)計(jì)模式。比如前端的語言包括 HTML、CSS、Java 和一些稍小眾的 Type、Coffee 等,API 就是各種標(biāo)準(zhǔn)、接口的使用、能夠?qū)崿F(xiàn)的效果、平臺(tái)限制等,工程化就是各種打包工具、代碼轉(zhuǎn)化工具、輔助開發(fā)工具等,框架就是像 Vue、React 等,設(shè)計(jì)模式就是像 PWA、redux 等。
相應(yīng)的,剛剛說的這些知識(shí)都能找到在 iOS 或 Android 里幾乎對(duì)應(yīng)的知識(shí),無非換了一些細(xì)節(jié),這里我就不繼續(xù)展開了。服務(wù)端也是這樣,知識(shí)體系最頂層的部分也很少,具體到細(xì)節(jié),只是要了解每一個(gè)實(shí)現(xiàn)背后的優(yōu)劣。
我在創(chuàng)業(yè)階段,每一年寫十萬行代碼。但我進(jìn)入滴滴后,寫代碼的價(jià)值可能就不是那么多了,但我還是喜歡寫代碼。
總結(jié)
以上是生活随笔為你收集整理的笔记|滴滴iOS客户端的架构,组件化,技术选型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。