我的心聲
做 android 時間不算短了闽坡,雖說 android 的 api 基本都熟悉了伶贰,但是自己寫出來的 java 還是菜的可以啊。痛定思痛娃肿,急需夯實 java 基礎(chǔ)了咕缎。在平時的學(xué)習(xí)和工作中是可以明顯的體會到 java 基礎(chǔ)的重要啊珠十,你看開源的網(wǎng)絡(luò)框架,自己寫多線程任務(wù)凭豪,有其是自己封裝基礎(chǔ)類庫焙蹭,業(yè)務(wù)代碼,工具類等都是深深到自己 java 這塊的代碼是在是太欠缺了嫂伞。雖然知道一些代碼封裝的點孔厉,但是為啥這樣寫,應(yīng)該怎么分析帖努,復(fù)雜一些的業(yè)務(wù)模塊該怎么設(shè)計類撰豺,怎么封裝,這都是我做不好的拼余。曾經(jīng)寫過日志和埋點的業(yè)務(wù)模塊污桦,當(dāng)時感覺把自己會的都用上了,現(xiàn)在在回頭一看匙监,不倫不類凡橱,封裝的不好用,不好維護亭姥,邏輯都是扭過來的梭纹,太難看了。
有感于此致份,從這幾天開始研究如何封裝代碼,在學(xué)習(xí)的過程中础拨,我認(rèn)知到代碼的封裝的思想大部分源于設(shè)計模式氮块,基礎(chǔ)的有23種設(shè)計模式,還有更多的設(shè)計模式種類诡宗,基本的我們能把基礎(chǔ)的23種設(shè)計模式用好就很 NB 了滔蝉。
啥是設(shè)計模式,就是根據(jù)經(jīng)驗總結(jié)出來的代碼封裝使用套路塔沃,這些套路是經(jīng)過長時間沉淀下來的蝠引,是大家公認(rèn),都去學(xué)習(xí)使用的蛀柴。用設(shè)計模式的思想封裝出來的代碼螃概,我是的確感覺比之前自己野路子強太多了:
- 首先代碼結(jié)構(gòu)清晰多了,類名起好了鸽疾,光看看包結(jié)構(gòu)就能大概了解整個系統(tǒng)的代碼結(jié)構(gòu)吊洼,哪些類是干什么的,起什什么作用制肮,真是一眼就能看出來了冒窍,省時省力
- 結(jié)構(gòu)清晰了递沪,代碼可以快速定位,大大減少代碼維護修改的難度综液。不像之前款慨,改些代碼,需要根據(jù)邏輯一步一步的走谬莹,才能找到修改的類檩奠,修改的位置
- 結(jié)構(gòu)清晰了,類之間功能劃分才能做到清晰明確届良,修改邏輯笆凌,增加功能可以很快的實現(xiàn)代碼的修改,類士葫,功能乞而,方法的添加
總的來說就是寫代碼,看代碼慢显,改代碼爪模,添代碼省時省力多了,眼不暈了荚藻,頭部疼了屋灌,從此媽媽再也不擔(dān)心我寫代碼了。真的应狱,效果就是這么顯著共郭,就是去研究開源框架,都是好理解好多了疾呻,因為大家都是遵從同一套思路除嘹,這就是所謂的套路...... 我一直覺得代碼的世界充斥著各種套路,我們學(xué)習(xí)使用這些套路岸蜗,就是我們快速進步的思路尉咕。
學(xué)習(xí)過程
這里我說下我代碼封裝學(xué)習(xí)的過程,代碼封裝是個不小的命題啊璃岳,除了需要平時的積累外年缎,還需要一個正確的學(xué)習(xí)過程,這里說下我的經(jīng)驗:
-
先去學(xué)習(xí)下基礎(chǔ)知識铃慷,設(shè)計模式单芜,MVP。設(shè)計模式是我們代碼封裝的基礎(chǔ)犁柜,理論指導(dǎo)缓溅,基礎(chǔ)中最重要的部分。MVP 是我們學(xué)習(xí)的入手點赁温,是做 andriod 項目必備必會坛怪,最應(yīng)該先深入學(xué)習(xí)的部分淤齐。
- 先去看設(shè)計模式,我是看的《Android 進階之光》這本書的設(shè)計模式章節(jié)袜匿,里面只講了常用的10來種設(shè)計模式更啄,講的都是很淺顯,但是好理解居灯,這是之前沒有系統(tǒng)接觸過設(shè)計模式的萌新的不二選擇祭务。我看過一遍就 OK 了,對我?guī)椭艽蠊窒樱?dāng)然這本書講的太過于淺顯义锥,易懂了。大家想要繼續(xù)深入學(xué)習(xí)岩灭,看《Android設(shè)計模式》這本書拌倍,這本書講的很深,會結(jié)合很多例子來講解噪径,有其是套用設(shè)計模式的思路去分析 部分android 經(jīng)典源碼
- 既然我們是結(jié)合 MVP 來一步步深入學(xué)習(xí)柱恤,實踐代碼封裝,那么看過設(shè)計模式之后呢找爱,我們就來看看 MVP/MVVM 的相關(guān)梗顺,對于萌新來說還是推薦《Android 進階之光》這本書,MVP 講的很請清晰车摄,MVVM 里面我們會接觸到 Dat a Binding寺谤,Dagger2,有其這2個開源框架對于代碼封裝來說也是很重要的組成部分吮播。
基礎(chǔ)知識學(xué)習(xí)過后矗漾,我們按照從易到難的順序開始寫我們自己的 MVP 框架。
項目地址 - BW-MVPDemo
2.1 我們先來搭建 MVP 中最基礎(chǔ)薄料,最簡單的基礎(chǔ)顯示框架部分,先不要管各種功能泵琳,只要我們的頁面能在 MVP 框架結(jié)構(gòu)支持下正常顯示即可摄职,這部分是示例項目中 step1的部分,期中分成7個小項目获列,是根據(jù)代碼封裝的思路一步一步的寫下來的谷市,盡量模擬出代碼封裝從易到難的過程,希望幫到有困難的朋友
2.2 基礎(chǔ)顯示接結(jié)構(gòu)搭建完畢击孩,我們就要考慮如何封裝 MVP 中涉及到的諸多功能迫悠,比如:生命周期函數(shù),statview 缺省頁巩梢,頁面緩存等常用的功能创泄。這里就要用到組合的思路了艺玲,我們可以把 MVP 當(dāng)做一個完整的系統(tǒng),生命周期函數(shù)鞠抑,statview 缺省頁饭聚,頁面緩存這些功能是 MVP 這個系統(tǒng)中的子系統(tǒng),我們根據(jù)模式和代碼設(shè)計模式的思路搁拙,抽象功能接口秒梳,組合這個小功能到 MVP 中,形成一個完整的系統(tǒng)箕速,未來設(shè)計到某一個功能的修改和擴展也不影響MVP 中其他的部分酪碘,也容易修改。
- 項目 step2_1:封裝的生命周期函數(shù)功能盐茎,主要是整合處理 view 中生命周期函數(shù)中可變的部分給 P 層兴垦,讓具體的 P 層對象來實現(xiàn)具體的代碼,是模板模式的思路庭呜,基類中處理公共邏輯滑进,具體實現(xiàn)處理可變部分,是優(yōu)秀合理的代碼分離思路募谎,這對我們以后是很有幫助的扶关,這個思路在 android 項目中使用的例子太多了。
- 項目 step2_2:封裝 stateview 功能数冬,這里使用了代理設(shè)計模式的思路节槐,展示狀態(tài)頁本就是 view 該干的事,這里我們把這部分功能從 view 中分離出來的拐纱,形成單獨實現(xiàn)铜异,把功能對象傳遞給 view,由 view 去使用這個 stateview 功能對象實現(xiàn)邏輯秸架。好處是易擴展揍庄,要是 stateview 需求不同的話,我們只需要更換 stateview 對象即可东抹,然不用修改其他蚂子。
我理解的 MVP
MVP 是 MVC 的金進化版,一般認(rèn)為是 Android 特有的缭黔,其實很早之前就提出來的食茎,并非是有了 android 才提出來的
MVC:
- M - modle 數(shù)據(jù)層
- V - view 視圖層
- C - Avtivity/Fragment 控制層
MVC 的模式都是最早的 android 開發(fā)寫法,商業(yè)app 12年就不在再用了馏谨,是在弊端太多别渔,是早期的特征
MVP:
- M - modle 數(shù)據(jù)層
- V - Avtivity/Fragment 視圖層
- P - Persenter 控制層
經(jīng)典的就是 google 官方的例子了,把頁面中邏輯控制抽象出來形成新的控制器 P,但是 P 也頁不是救命稻草啊哎媚,傳統(tǒng) V 層的代碼膨脹的嚴(yán)重喇伯,我們把邏輯抽象出來成 P,難倒 P 的邏輯就精簡了抄伍,代碼該臃腫還是臃腫啊艘刚,只是從 V 層轉(zhuǎn)移到了 P 層,所以說 MVP 不是救命稻草截珍,真正實現(xiàn)我們想要的代碼經(jīng)驗攀甚,邏輯清晰的效果,只能是在設(shè)計模式的指導(dǎo)下岗喉,以策略模式為思想秋度,抽象分割頁面中的各種功能,抽象出相應(yīng)的接口钱床,由獨立的功能類實現(xiàn)荚斯,這樣才能把結(jié)構(gòu)臃腫的 P 層,抽象分割成一個個功能聚攏查牌,獨立的功能類事期,通過繼承,接口實現(xiàn)來搭建頁面系統(tǒng)的類結(jié)構(gòu)纸颜。這樣一個基礎(chǔ)優(yōu)秀的頁面框架才能形成兽泣。
小到 android 中簡單的頁面框架,大道各種業(yè)務(wù)模塊胁孙,基礎(chǔ)功能框架類庫唠倦,都是在這個基礎(chǔ)套路下寫的。
說真的涮较,設(shè)計模式太重要了稠鼻,但是也有人說不能因為設(shè)計模式而設(shè)計模式,誠然這個看自己的技術(shù)水平吧狂票,設(shè)計模式也是為了解決實際問題的候齿,一切以實現(xiàn)需求和效果為準(zhǔn)啊,設(shè)計模式是思想闺属,不要太死板的使用慌盯,我們只要使用了設(shè)計模式的思路就行,具體的代碼套路就只能完全看自己的積累了屋剑。
另外 UML 類圖的繪制技能也是很有幫助的,尤其是自己設(shè)計框架結(jié)構(gòu)诗眨,平時沒事可以自己畫 UML 類圖的方式練習(xí)框架設(shè)計唉匾,省時省力。學(xué)習(xí)開源框架時畫 UML 類圖也是一個學(xué)習(xí)的突破口,可以幫助我們快速搞懂開源框架
我很喜歡這一段評價 MVP 的話巍膘,取自:T-MVP
Android開發(fā)中厂财,總會遇到大量的繁雜模版代碼,重復(fù)無味的樣板方法峡懈,冗長雜余的套路寫法璃饱,占據(jù)了大量的開發(fā)時間,并且容易手誤出錯肪康,極大地降低了編程效率和代碼的優(yōu)雅荚恶。
傳統(tǒng)MVP給人的第一感覺通常是接口和類的暴漲,將Activity中除V之外的繁雜操作搬到P之后依然臃腫不堪磷支。MVP從來都不是救命稻草谒撼,只能錦上添花,不能雪中送炭雾狈。也許在權(quán)衡利弊之后廓潜,很多人會對MVP望而卻步。 現(xiàn)在 我們換一個思路善榛,取其精華辩蛋,去其糟粕,完成T-MVP大變身移盆。
學(xué)習(xí)文章目錄:
- 從 MVP學(xué)習(xí)代碼封裝 (2) - 搭建 MVP 最基礎(chǔ)框架
- 從 MVP學(xué)習(xí)代碼封裝 (3) - 抽象 V 層生命周期模板
- 從 MVP學(xué)習(xí)代碼封裝 (4) - 給 MVP 添加 stateView狀態(tài)頁功能
ps: 項目地址 - BW-MVPDemo