參考資料
1)纯续、https://github.com/ribot/android-guidelines
首推使用Android Studio,因?yàn)樗怯晒雀栝_發(fā),最接近Gradle,默認(rèn)使用最新的工程結(jié)構(gòu)祝迂,已經(jīng)到release階段(目前已經(jīng)有release 2.2了),它就是為Android開發(fā)定制的铁材。并使用Square's Java and Android projects code style settings作為code style。
常用結(jié)構(gòu)參考Google's guide on Gradle for Android
小任務(wù)除了(shell, Python, Perl, etc)這些腳本語(yǔ)言著觉,你也可以使用Gradle 制作任務(wù)。 更多信息請(qǐng)參考Gradle's documentation惊暴。
密碼在做版本release時(shí)你app的build.gradle你需要定義signingConfigs.此時(shí)你應(yīng)該避免以下內(nèi)容:
不要做這個(gè). 這會(huì)出現(xiàn)在版本控制中饼丘。
signingConfigs {release {storeFile file("myapp.keystore")storePassword"password123"keyAlias"thekey"keyPassword"password789"}}
而是,建立一個(gè)不加入版本控制系統(tǒng)的gradle.properties文件辽话。
KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789
那個(gè)文件是gradle自動(dòng)引入的肄鸽,你可以在buld.gradle文件中使用,例如:
signingConfigs {release {try{storeFile file("myapp.keystore")storePasswordKEYSTORE_PASSWORDkeyAlias"thekey"keyPasswordKEY_PASSWORD}catch(ex) {thrownewInvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")}}}
使用 Maven 依賴方案代替使用導(dǎo)入jar包方案如果在你的項(xiàng)目中你明確使用了 jar文件油啤,那么它們可能成為永久的版本典徘,如2.1.1.下載jar包更新他們是很繁瑣的, 這個(gè)問(wèn)題Maven很好的解決了益咬,這在Android Gradle構(gòu)建中也是推薦的方法逮诲。你可 以指定版本的一個(gè)范圍,如2.1.+,然后Maven會(huì)自動(dòng)升級(jí)到制定的最新版本幽告,例如:
dependencies {compile'com.netflix.rxjava:rxjava-core:0.19.+'compile'com.netflix.rxjava:rxjava-android:0.19.+'compile'com.fasterxml.jackson.core:jackson-databind:2.4.+'compile'com.fasterxml.jackson.core:jackson-core:2.4.+'compile'com.fasterxml.jackson.core:jackson-annotations:2.4.+'compile'com.squareup.okhttp:okhttp:2.0.+'compile'com.squareup.okhttp:okhttp-urlconnection:2.0.+'}
規(guī)則:使用駝峰命名,前綴+邏輯名稱评腺,類變量名和布局文件id名稱保持一致帘瞭,不需要下劃線分割
控件縮寫前綴
TextView/EditTexttext
ImageViewimg
Button/RadioButton/ImageButtonbtn
RelativeLayout/LinearLayout/FrameLayoutlayout
ListViewlistView
WebViewwebView
CheckBoxcheckBox
ProgressBarprogressBar
seekBarseekBar
其他控件控件名首字母縮寫作為前綴
如:TextView @+id/textTitle
如:EditView @+id/textName
如:Button @+id/btnSearch
規(guī)則:使用前綴_邏輯名稱命名,單詞全部小寫蒿讥,單詞間以 下劃線 分割。
布局類型布局前綴
Activityactivity_
Fragmentfragment_
Includeinclude_
Dialogdialog_
PopupWindowpopup_
Menumenu_
Adapterrecycler_item_
規(guī)則:使用前綴_用途命名,單詞全部小寫芋绸,單詞間以 下劃線 分割媒殉。
圖片資源文件命名
前綴說(shuō)明
bg_xxx各類背景圖片
btn_xxx這種按鈕沒(méi)有其他狀態(tài)
ic_xxx圖標(biāo),一般用于單個(gè)圖標(biāo)
bg_描述_狀態(tài)1[_狀態(tài)2]用于控件上的不同狀態(tài)
btn_描述_狀態(tài)1[_狀態(tài)2]用于按鈕上的不同狀態(tài)
chx_描述_狀態(tài)1[_狀態(tài)2]選擇框摔敛,一般有2態(tài)和4態(tài)
第三方資源文件廷蓉,不管在value、drawable
必須攜帶第三方資源前綴
umeng_socialize_style.xml
pull_refresh_attrs.xml
規(guī)則:使用駝峰規(guī)則马昙,首字母必須大寫桃犬,使用名詞或名詞詞組。要求簡(jiǎn)單易懂行楞,富于描述攒暇,不允許出現(xiàn)無(wú)意義或錯(cuò)誤單詞。
類描述例如
Application類Application為后綴標(biāo)識(shí)XXXApplication
Activity類Activity為后綴標(biāo)識(shí)閃屏頁(yè)面類SplashActivity
解析類Handler為后綴標(biāo)識(shí)
公共方法類Utils或Manager為后綴標(biāo)識(shí)
線程池管理類ThreadPoolManager
日志工具類LogUtils
數(shù)據(jù)庫(kù)類以DBHelper后綴標(biāo)識(shí)MySQLiteDBHelper
Service類以Service為后綴標(biāo)識(shí)播放服務(wù):PlayService
BroadcastReceiver類以Broadcast為后綴標(biāo)識(shí)時(shí)間通知:TimeBroadcast
ContentProvider類以Provider為后綴標(biāo)識(shí)單詞內(nèi)容提供者:DictProvider
直接寫的共享基礎(chǔ)類以Base為前綴BaseActivity,BaseFragment
規(guī)則:使用駝峰規(guī)則子房,首字母必須小寫形用,使用動(dòng)詞。要求簡(jiǎn)單易懂证杭,富于描述田度,不允許出現(xiàn)無(wú)意義或錯(cuò)誤單詞。
方法說(shuō)明
initXX()初始化相關(guān)方法解愤,使用init為前綴標(biāo)識(shí)镇饺,如初始化布局initView()
httpXX()http業(yè)務(wù)請(qǐng)求方法,以http為前綴標(biāo)識(shí)
getXX()返回某個(gè)值的方法送讲,使用get為前綴標(biāo)識(shí)
saveXX()與保存數(shù)據(jù)相關(guān)的奸笤,使用save為前綴標(biāo)識(shí)
deleteXX()刪除操作
resetXX()對(duì)數(shù)據(jù)重組的,使用reset前綴標(biāo)識(shí)
clearXX()清除數(shù)據(jù)相關(guān)的
isXX()方法返回值為boolean型的請(qǐng)使用is或check為前綴標(biāo)識(shí)
processXX()對(duì)數(shù)據(jù)進(jìn)行處理的方法李茫,盡量使用process為前綴標(biāo)識(shí)
displayXX()彈出提示框和提示信息揭保,使用display為前綴標(biāo)識(shí)
drawXXX()繪制數(shù)據(jù)或效果相關(guān)的,使用draw前綴標(biāo)識(shí)
規(guī)則:使用駝峰規(guī)則魄宏,首字母必須小寫秸侣,使用名詞或名詞詞組。要求簡(jiǎn)單易懂宠互,富于描述味榛,不允許出現(xiàn)無(wú)意義或錯(cuò)誤單詞。
成員變量命名予跌,自定義變量前添加m前綴搏色,布局控件變量不用添加m前綴
常量命名,全部大寫券册,單詞間用下劃線隔開
命名遵循前綴表明類型的習(xí)慣垂涯,形如type_foo_bar.xml。例如:fragment_contact_details.xml,view_primary_button.xml,activity_main.xml.
組織布局文件若果你不確定如何排版一個(gè)布局文件航邢,遵循一下規(guī)則可能會(huì)有幫助耕赘。
考慮使用Designtime attributes 設(shè)計(jì)時(shí)布局屬性,Android Studio已經(jīng)提供支持膳殷,而不是硬編碼android:text(譯者注:墻內(nèi)也可以參考stormzhang的這篇博客鏈接)操骡。
作為一個(gè)經(jīng)驗(yàn)法則,android:layout_****屬性應(yīng)該在 layout XML 中定義,同時(shí)其它屬性android:****應(yīng)放在 style XML中。此規(guī)則也有例外赚窃,不過(guò)大體工作的很好册招。這個(gè)思想整體是保持layout屬性(positioning, margin, sizing) 和content屬性在布局文件中,同時(shí)將所有的外觀細(xì)節(jié)屬性(colors, padding, font)放在style文件中勒极。
例外有以下這些:
android:id明顯應(yīng)該在layout文件中
layout文件中android:orientation對(duì)于一個(gè)LinearLayout布局通常更有意義
android:text由于是定義內(nèi)容是掰,應(yīng)該放在layout文件中
有時(shí)候?qū)ndroid:layout_width和android:layout_height屬性放到一個(gè)style中作為一個(gè)通用的風(fēng)格中更有意義,但是默認(rèn)情況下這些應(yīng)該放到layout文件中河质。
使用styles幾乎每個(gè)項(xiàng)目都需要適當(dāng)?shù)氖褂胹tyle文件冀惭,因?yàn)閷?duì)于一個(gè)視圖來(lái)說(shuō)有一個(gè)重復(fù)的外觀是很常見的。 在應(yīng)用中對(duì)于大多數(shù)文本內(nèi)容掀鹅,最起碼你應(yīng)該有一個(gè)通用的style文件散休,例如:
@dimen/font_normal@color/basic_black
應(yīng)用到TextView 中:
你或許需要為按鈕控件做同樣的事情,不要停止在那里乐尊。將一組相關(guān)的和重復(fù)android:****的屬性放到一個(gè)通用的style中戚丸。
將一個(gè)大的style文件分割成多個(gè)文件你可以有多個(gè)styles.xml文件。Android SDK支持其它文件扔嵌,styles這個(gè)文件名稱并沒(méi)有作用限府,起作用的是在文件 里xml的標(biāo)簽。因此你可以有多個(gè)style文件styles.xml,style_home.xml,style_item_details.xml,styles_forms.xml痢缎。 不用于資源文件路徑需要為系統(tǒng)構(gòu)建起的有意義胁勺,在res/values目錄下的文件可以任意命名。
colors.xml是一個(gè)調(diào)色板在你的colors.xml文件中應(yīng)該只是映射顏色的名稱一個(gè)RGBA值独旷,而沒(méi)有其它的署穗。不要使用它為不同的按鈕來(lái)定義RGBA值。
不要這樣做
#FFFFFF#2A91BD#5F5F5F#939393#FFFFFF#FF9D2F...#323232
使用這種格式嵌洼,你會(huì)非常容易的開始重復(fù)定義RGBA值案疲,這使如果需要改變基本色變的很復(fù)雜。同時(shí)麻养,這些定義是跟一些環(huán)境關(guān)聯(lián)起來(lái)的褐啡,如button或者comment, 應(yīng)該放到一個(gè)按鈕風(fēng)格中,而不是在color.xml文件中鳖昌。
相反备畦,這樣做:
#FFFFFF#323232#888888#dddddd#999999#27D34D#2A91BD#FF9D2F#FF432F
向應(yīng)用設(shè)計(jì)者那里要這個(gè)調(diào)色板低飒,名稱不需要跟"green", "blue", 等等相同。 "brand_primary", "brand_secondary", "brand_negative" 這樣的名字也是完全可以接受的萍恕。 像這樣規(guī)范的顏色很容易修改或重構(gòu)逸嘀,會(huì)使應(yīng)用一共使用了多少種不同的顏色變得非常清晰车要。 通常一個(gè)具有審美價(jià)值的UI來(lái)說(shuō)允粤,減少使用顏色的種類是非常重要的。
像對(duì)待colors.xml一樣對(duì)待dimens.xml文件與定義顏色調(diào)色板一樣翼岁,你同時(shí)也應(yīng)該定義一個(gè)空隙間隔和字體大小的“調(diào)色板”类垫。 一個(gè)好的例子,如下所示:
22sp18sp15sp12sp40dp24dp14dp10dp4dp60dp40dp32dp
布局時(shí)在寫 margins 和 paddings 時(shí)琅坡,你應(yīng)該使用spacing_****尺寸格式來(lái)布局悉患,而不是像對(duì)待String字符串一樣直接寫值。 這樣寫會(huì)非常有感覺榆俺,會(huì)使組織和改變風(fēng)格或布局是非常容易售躁。
避免深層次的視圖結(jié)構(gòu)有時(shí)候?yàn)榱藬[放一個(gè)視圖,你可能嘗試添加另一個(gè)LinearLayout茴晋。你可能使用這種方法解決:
即使你沒(méi)有非常明確的在一個(gè)layout布局文件中這樣使用陪捷,如果你在Java文件中從一個(gè)view inflate 到其他views當(dāng)中,也是可能會(huì)發(fā)生的诺擅。
可能會(huì)導(dǎo)致一系列的問(wèn)題市袖。你可能會(huì)遇到性能問(wèn)題,因?yàn)樘幚砥鹦枰幚硪粋€(gè)復(fù)雜的UI樹結(jié)構(gòu)烁涌。 還可能會(huì)導(dǎo)致以下更嚴(yán)重的問(wèn)題StackOverflowError.
因此盡量保持你的視圖tree:學(xué)習(xí)如何使用RelativeLayout, 如何optimize 你的布局和如何使用標(biāo)簽.
小心關(guān)于WebViews的問(wèn)題.如果你必須顯示一個(gè)web視圖苍碟, 比如說(shuō)對(duì)于一個(gè)新聞文章,避免做客戶端處理HTML的工作撮执, 最好讓后端工程師協(xié)助微峰,讓他返回一個(gè) "純" HTML。WebViews 也能導(dǎo)致內(nèi)存泄露當(dāng)保持引他們的Activity抒钱,而不是被綁定到ApplicationContext中的時(shí)候蜓肆。 當(dāng)使用簡(jiǎn)單的文字或按鈕時(shí),避免使用WebView继效,這時(shí)使用TextView或Buttons更好症杏。
style="@style/TextAppearance.AppCompat.Display4"style="@style/TextAppearance.AppCompat.Display3"style="@style/TextAppearance.AppCompat.Display2"style="@style/TextAppearance.AppCompat.Display1"style="@style/TextAppearance.AppCompat.Headline"style="@style/TextAppearance.AppCompat.Title"style="@style/TextAppearance.AppCompat.Subhead"style="@style/TextAppearance.AppCompat.Body2"style="@style/TextAppearance.AppCompat.Body1"style="@style/TextAppearance.AppCompat.Caption"style="@style/TextAppearance.AppCompat.Button"
如果項(xiàng)目比較小的話:
app——Application Activity Fragment Presenter等的頂級(jí)父類
config——API,常量表等
model——數(shù)據(jù)層
entities——數(shù)據(jù)模型
presenter——MVP的P
view——MVP的V
utils——工具類集合
widget——各個(gè)可復(fù)用View集合
如果項(xiàng)目比較大瑞信,上面的方式一定會(huì)造成presenter和view里近百個(gè)文件厉颤。 推薦下列方式:
app
config
model
entities
module——將界面層以功能模塊分配包。
launch
main
account
news
music
……
utils
widget
#6凡简、配置主題
##6.1 先在color.xml中寫好需要的顏色:
#ff5722#673AB7#311B92#fff#888888#dddddd#999999
注意color.xml是配色表逼友。應(yīng)該是描述顏色而不是對(duì)字體顏色精肃,背景顏色等的定義。這樣能防止相近的顏色重復(fù)定義帜乞,而導(dǎo)致界面顏色不統(tǒng)一司抱。
##6.2 在style.xml里定義主題:
@color/DeepPurple@color/DeepPurple900@color/Orange
在res目錄下,創(chuàng)建一個(gè)values-v21目錄黎烈,再創(chuàng)建一個(gè)style.xml:
true?colorPrimaryDark
然后在AndroidManifest.xml文件中修改application的theme屬性為上面定義的AppTheme习柠,即可實(shí)現(xiàn)沉浸式狀態(tài)欄。
Activity繼承BaseFragmentActivity或SwipeBackActivity资溃,可以使用ButterKnife注解代替findViewById
方法
拆分臃腫方法,每個(gè)方法只作一件事
做同一個(gè)邏輯的方法烈炭,盡量靠近放到一塊溶锭,方便查看
不要使用 try catch 處理業(yè)務(wù)邏輯
使用JSON工具類,不要手動(dòng)解析和拼裝數(shù)據(jù)
控制語(yǔ)句
減少條件嵌套符隙,不要超過(guò)3層
if判斷使用“衛(wèi)語(yǔ)句”趴捅,減少層級(jí)if(obj != null) { doSomething(); }修改為:if(obj == null) { return; } doSomething();
if語(yǔ)句必須用{}包括起來(lái),即便是只有一句
處理“魔數(shù)”等看不懂的神秘?cái)?shù)字
代碼中不要出現(xiàn)數(shù)字,特別是一些標(biāo)識(shí)不同類型的數(shù)字霹疫。
所有意義數(shù)字全部抽取到Constant公共類中拱绑,避免散布在各位類中。
空行:空行將邏輯相關(guān)代碼段隔開更米,簡(jiǎn)潔清楚欺栗,提高可讀性
成員變量之間,根據(jù)業(yè)務(wù)形成分組加空行
方法之間加空行
用好TODO標(biāo)記
記錄想法征峦,記錄功能點(diǎn)迟几,開發(fā)過(guò)程中可以利用TODO記錄一下臨時(shí)想法或?yàn)榱瞬淮驍_思路留下待完善的說(shuō)明
刪除無(wú)用TODO,開發(fā)工具自動(dòng)生成的TODO栏笆,或則已經(jīng)完善的TODO类腮,一定要?jiǎng)h除。
##8蛉加、寫在最后
什么是架構(gòu) 軟件架構(gòu)絕對(duì)不只是框架的堆砌蚜枢,架構(gòu)是為了方便軟件可維護(hù)、可擴(kuò)展针饥、安全性厂抽、易理解。
##9丁眼、附錄A軟件設(shè)計(jì)六大原則:
單一職責(zé)原則 - Single Responsibility Principle
應(yīng)該有且僅有一個(gè)原因引起類的變更筷凤。(如果類需要變更,那么只可能僅由某一個(gè)原因引起)
里氏替換原則 - Liskov Substitution Principle
所有引用基類的地方,都能透明地替換成其子類對(duì)象藐守。只要父類能出現(xiàn)的地方挪丢,子類就可以出現(xiàn)。
依賴倒置原則 - Dependence Inversion Principle:
即“面向接口編程”: 高層模塊不應(yīng)該依賴低層模塊卢厂,兩者都應(yīng)該依賴其抽象乾蓬;——模塊間的依賴通過(guò)抽象發(fā)生。實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系(eg. 類B被用作類A的方法中的參數(shù))慎恒,其依賴關(guān)系是通過(guò)接口或抽象類產(chǎn)生的任内; 抽象不應(yīng)該依賴細(xì)節(jié);——接口或抽象類不依賴于實(shí)現(xiàn)類巧号; 細(xì)節(jié)應(yīng)該依賴抽象族奢;——實(shí)現(xiàn)類依賴接口或抽象類。
接口隔離原則 - Interface Segregation Principle
客戶端只依賴于它所需要的接口丹鸿;它需要什么接口就提供什么接口,把不需要的接口剔除掉棚品。 ——類間的依賴關(guān)系應(yīng)建立在最小的接口上靠欢。 即,接口盡量細(xì)化铜跑,接口中的方法盡量少门怪。
迪米特法則 - Law of Demeter
又稱最少知識(shí)原則(Least Knowledge Principle),一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象有最少的了解锅纺。 一個(gè)類對(duì)自己依賴的類知道的越少越好掷空。也就是說(shuō),對(duì)于被依賴的類來(lái)說(shuō)囤锉,無(wú)論邏輯多么復(fù)雜坦弟,都盡量地的將邏輯封裝在類的內(nèi)部,對(duì)外除了提供的public方法官地,不對(duì)外泄漏任何信息酿傍。
開閉原則 -Open Closed Principle
對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉驱入。一個(gè)軟件實(shí)體應(yīng)該通過(guò)擴(kuò)展來(lái)實(shí)現(xiàn)變化赤炒,而不是通過(guò)修改已有代碼來(lái)實(shí)現(xiàn)變化。 一個(gè)軟件實(shí)體應(yīng)該通過(guò)擴(kuò)展來(lái)實(shí)現(xiàn)變化亏较,而不是通過(guò)修改已有的代碼來(lái)實(shí)現(xiàn)變化莺褒。——but雪情,并不意味著不做任何修改遵岩;底層模塊的擴(kuò)展,必然要有高層模塊進(jìn)行耦合旺罢。 “變化”可分為三種類型: 邏輯變化——不涉及其他模塊旷余,可修改原有類中的方法绢记; 子模塊變化——會(huì)對(duì)其他模塊產(chǎn)生影響,通過(guò)擴(kuò)展來(lái)完成變化正卧; 可見視圖變化——界面變化蠢熄,有時(shí)需要通過(guò)擴(kuò)展來(lái)完成變化。
原文:https://github.com/qsxiaogang/android-code-style