Android 開發(fā)最佳實踐
持續(xù)更新
1摘要
選擇一個好用 IDE Andriod Studio
關(guān)于包的結(jié)構(gòu)
我建議具體業(yè)務(wù)相關(guān)的包結(jié)構(gòu)是將它們置入在一個包內(nèi)集侯。而不是在整個應(yīng)用包的根下
因為我們的業(yè)務(wù)是不斷的增加。就種增加也應(yīng)當(dāng)增相應(yīng)的包名攀芯。這樣的話包結(jié)構(gòu)的變化就是會明顯的變化
不利于穩(wěn)定引几。
越是公用的東西則應(yīng)該放置在明顯的地方丹允。如果工具類航瞭。
還有一些其他公用的管理類彤恶。這些東西可以放置在更高層級的類包下
這種做法使得其他小伙伴可以一眼看到钞钙,并且使用它們。
而與你協(xié)同開發(fā)的小伙伴可能根本不關(guān)心你的功能(業(yè)務(wù))声离。
但是包結(jié)構(gòu)的變化使得小伙伴分心芒炼。或是誤入到其他术徊。引起沖突等
關(guān)于依賴關(guān)系本刽,盡量做到單向依賴
這個也從包的層次表現(xiàn)出來,
越是靠近根目錄的文件赠涮,功能子寓,相當(dāng)于洋蔥的內(nèi)層,他是越是公用的笋除,核心的斜友。需要被依賴的。
越是遠(yuǎn)離根目錄的文件垃它,功能鲜屏,相當(dāng)于洋蔥的外層,他就越是私用的国拇,他依賴于核心的
關(guān)于包的結(jié)構(gòu)
module:業(yè)務(wù)模塊
utils:工具類
widget(視圖控件——含自定義view洛史,彈窗,浮窗贝奇,通知條虹菲。
service:后臺服務(wù)()
data:數(shù)據(jù)
common:常用的管理功能
base:不以業(yè)務(wù)相關(guān)的基本類
log:日志的打印
config:配置
entity:實體類
module:業(yè)務(wù)模塊是放置一個個獨立的模塊。
network:網(wǎng)絡(luò)
image:圖片
location:地理位置
locale:國際化(含多國語言的配置管理)
permission:權(quán)限
manager:
data :
創(chuàng)建線程池管理類掉瞳,統(tǒng)一管理線程的創(chuàng)建和銷毀毕源。減少系統(tǒng)不必要的開銷∩孪埃控制來內(nèi)存管理
接口化
定義內(nèi)層的輸入霎褐,輸出接口,是內(nèi)層自己的職責(zé)该镣。(內(nèi)層通常是最接近數(shù)據(jù)的冻璃,但又不能耦后外層,只是定義輸入輸出接口,這樣方便對接所有關(guān)心數(shù)據(jù)的人)
是不是過度復(fù)雜了省艳?
當(dāng)你習(xí)慣了就簡單了
我們希望數(shù)據(jù)流可以從外層流向內(nèi)層娘纷,反之亦然。但是依賴規(guī)則不允許跋炕。
Log 日志的打印要盡量還原真實場景赖晶,不要處理發(fā)生的時數(shù)據(jù)。不需要美化辐烂。他當(dāng)時發(fā)生的數(shù)據(jù)是什么就是什么遏插。
美化后的數(shù)據(jù)會隱蓋有用的信息【佬蓿可能會使得調(diào)查問題發(fā)生的原因出現(xiàn)偏差胳嘲。
在團(tuán)隊協(xié)作時,怎么能讓代碼的單向依賴原則不被破壞扣草,即內(nèi)層的包了牛,不使用外層的包。
1限制類德召,方法白魂,參數(shù)的訪問限制,
2使用依賴原則上岗。將代碼分劃成為模塊后福荸,外層的模塊依賴引入內(nèi)層的模塊,不允許內(nèi)層模塊引入外層的模塊肴掷。
3更不要跨層訪問
少寫注釋敬锐,多起一些有意義的名稱。有明確的方法名稱呆瞻,類名台夺,屬性名等。
公用的靜態(tài)方法放置在UTIL包下
如使web顯示頁面的痴脾,請使用WebView下的Html5Activity
如果使用自定義颤介,或是你要自己定義一個view.請將他們放置到Widget包里
C。是我們的常量類
Config是配置
service是服務(wù)的
entity是實體類赞赖。(實體類不要作涉業(yè)務(wù)的邏輯滚朵,不要依賴平臺, 保持他的純java特性)
module功能模塊
data數(shù)據(jù)。
base是基本父類前域。(作好的辕近,我們以后可以作一個開發(fā)框架)
工具類理應(yīng)能夠抽像化,公用化匿垄。也理應(yīng)不涉及具體業(yè)務(wù)細(xì)節(jié)移宅。
如果工具類只提供給某個業(yè)務(wù)使用归粉,那么他的命名上需要下一些工夫,表達(dá)出它的使用范
或是的包可以范圍應(yīng)該被控制在包內(nèi)可以訪問漏峰,避免外部誤用了糠悼。
內(nèi)層定義更抽象的部分,外層定義更具體的部分浅乔。
盡可能的作單向依賴绢掰,即是外圈使用內(nèi)圈的類,代碼童擎。反之內(nèi)圈不使用外圈的類,代碼攻晒。
如查你發(fā)現(xiàn)依賴倒置顾复,內(nèi)層依賴外層的類,代碼鲁捏,嘗試把他移動到內(nèi)圈芯砸。
如查你發(fā)現(xiàn)跨層依賴,或是新增一個中間件在內(nèi)層進(jìn)行處理给梅。不直接依賴使用假丧。
內(nèi)層的包不要使用外層的包
*定義輸入輸出接口是內(nèi)層的職責(zé)。
例如 Http協(xié)議定義的Content-Length
如果我們也有類似的字符动羽,也作相同的命名的話會與之有沖突包帚。不能正常區(qū)分,
這就里需要個可以區(qū)分的命名規(guī)范运吓。使用小駝峰命名
關(guān)于Android布局文件(layout)定義規(guī)范要求
關(guān)于layout 的命名規(guī)范
使用小寫字符渴邦,字符之間隔使用下橫線_
Activity使用的布局文件加上前綴activity_
Fragment使用的布局件加上前綴fragment_
自定義控制件使用的布局加前綴widget_
公用的布局件加上前綴layout_
Adapter使用的布局件加上前綴item_
代碼組織方面。Package Diagram對一些大型的項目特別有用拘哨。順便說一句谋梭,良好的代碼組織,對軟件的可維護(hù)性至關(guān)重要倦青,請認(rèn)真的規(guī)劃你的包結(jié)構(gòu)瓮床。下文將簡單介紹Package Diagram,主要分兩塊产镐,什么是Package隘庄,以及Package之間的關(guān)系。