Android作為目前移動(dòng)互聯(lián)網(wǎng)領(lǐng)域當(dāng)中的主流系統(tǒng),其開(kāi)發(fā)無(wú)疑成為行業(yè)大熱。 Android開(kāi)發(fā)人員在工作中不可避免的將遇到項(xiàng)目架構(gòu)的設(shè)計(jì)的問(wèn)題,對(duì)于這個(gè)問(wèn)題,很多開(kāi)發(fā)人才雖然具有開(kāi)發(fā)經(jīng)驗(yàn),但卻不一定能很好地進(jìn)行解釋。對(duì)于這個(gè)問(wèn)題,中培偉業(yè)《Android APP開(kāi)發(fā)應(yīng)用實(shí)踐》培訓(xùn)專(zhuān)家劉老師給出了專(zhuān)業(yè)回答。
劉老師指出,對(duì)很多開(kāi)發(fā)新人來(lái)說(shuō),這個(gè)問(wèn)題體現(xiàn)著項(xiàng)目分層、功能模塊劃分以及公共模塊提取等基本意識(shí),以及對(duì)一些經(jīng)典架構(gòu)的理解,比如MVCMVPMVVMCLEAN等。其主要涉及到以下幾個(gè)方面的問(wèn)題。
1.你為什么選擇使用MVC而不是MVP或者其他架構(gòu)?
這個(gè)問(wèn)題實(shí)際考察的是你對(duì)市面上主流的Android架構(gòu)模式的了解。你至少需要知道每種架構(gòu)的大致結(jié)構(gòu),然后了解一下它們各自解決的是其它架構(gòu)無(wú)法解決的什么問(wèn)題。最后,在談你自己的選擇時(shí),結(jié)合項(xiàng)目的特點(diǎn)來(lái)說(shuō)就可以了。其實(shí),大部分學(xué)生時(shí)期的項(xiàng)目用個(gè)MVC就足夠了,如果你代碼行數(shù)最多的Activity都不到百行,那么使用MVP或者其它架構(gòu)給你帶來(lái)的額外負(fù)擔(dān)恐怕要比你的收益高很多,切忌矯枉過(guò)正。不過(guò),抱著學(xué)習(xí)心態(tài)去使用這些架構(gòu)都是值得鼓勵(lì)的。
2.寫(xiě)過(guò)BaseActivityBaseFragment怎么設(shè)計(jì)的?
劉老師的觀點(diǎn)是:一是在項(xiàng)目開(kāi)始階段可以先提出一個(gè)基類(lèi),但不用花太多時(shí)間想著怎么填充內(nèi)容進(jìn)去,很可能得不償失,其實(shí)隨著你項(xiàng)目的進(jìn)展,那些重復(fù)實(shí)現(xiàn)的內(nèi)容就會(huì)慢慢浮現(xiàn),這些內(nèi)容就是需要你在基類(lèi)里實(shí)現(xiàn)的。二是在你實(shí)在不知道BaseActiviy里要放些什么的時(shí)候,至少可以編寫(xiě)各個(gè)生命周期方法中的的log,以及像eventbus這類(lèi)第三方庫(kù)的初始化以及銷(xiāo)毀操作。
3.你項(xiàng)目中的package劃分,是按照層次劃分的呢,還是按照功能劃分的呢為什么?
按層次劃分的package這個(gè)大家可能比較常用,那么按功能劃分呢可以看下面這張圖。 這么做的好處是什么呢看到代碼結(jié)構(gòu)你就能辨別這個(gè)app是干嘛的更加模塊化代碼切換更容易更高級(jí)別的抽象功能和層都分離開(kāi)來(lái)了可讀性更強(qiáng)以及更易維護(hù)的結(jié)構(gòu)更高的內(nèi)聚更易擴(kuò)展更少遇到改動(dòng)無(wú)關(guān)類(lèi)或者文件的情況添加或者移除功能要容易很多更多可復(fù)用的模塊。 我這里并不是說(shuō)按功能劃分就比按層次劃分好,只是想讓大家看看別的思路。這題沒(méi)有絕對(duì)的答案,但一定說(shuō)出你在劃分時(shí)的思考。
4.了解過(guò)AOP項(xiàng)目中有用到過(guò)么?
AOP面向切面編程與面向?qū)ο缶幊虒?duì)應(yīng)。我們都知道面向?qū)ο竺枋龅氖强v向上的關(guān)系,從父到子再到孫。而面向切面解決的是橫向的問(wèn)題,這些問(wèn)題可以簡(jiǎn)單地理解為與業(yè)務(wù)邏輯無(wú)關(guān)的代碼重用問(wèn)題。大家在自己的項(xiàng)目其實(shí)都或多或少的用到過(guò),比如在處理Http, SharedPreferences, Json, Xml, File, Device, System, Log, 格式轉(zhuǎn)換等是,我們提取出來(lái)的公共類(lèi)。 這樣做能夠使得App整體的結(jié)構(gòu)更清晰合理,避免局部的代碼臃腫,方便開(kāi)發(fā)、測(cè)試以及后續(xù)的維護(hù)。