轉載自:http://blog.csdn.net/huangyabin001/article/details/30717841
一.編碼規範
1.命名基本原則
在面向對象編程中,對於類,對象,方法,變量等方面的命名應該本着描述性以及唯一標識性這兩大特徵來命名,才能保證資源之間不衝突,並且每一個都便於記憶。
命名原則是:使名稱足夠長以便有一定的意義,並且足夠短以避免冗長。
2.命名基本規範
2.1.編程基本命名規範
(1)避免難懂的名稱,如屬性名xxK8,這樣的名稱會導致多義性。
(2) 在面向對象的語言中,在類屬性的名稱中包含類名是多餘的,如Book.BookTitle,而是應該使用Book.Title。
(3)在允許函數重載的語言中,所有重載都應該執行相似的函數。
(4)使用動詞-名詞的方法來命名對給定對象執行特定操作的例程,如CalculateInvoiceTotal()。(例程是某個系統對外提供的功能接口或服務的集合)
(5)只要合適,在變量名的末尾或開頭加計算限定符(Avg、Sum、Min、Max、Index)。
(6)在變量名中使用互補對,如min/max、begin/end和open/close。
(7)布爾變量名應該包含Is,這意味着Yes/No 或 True/False 值,如 fileIsFound。
(8)即使對於可能僅出現在幾個代碼行中的生存期很短的變量,仍然使用有意義的名 稱。僅對於短循環索引使用單字母變量名,如 i 或 j。
(9)爲了幫助區分變量和例程,對例程名稱使用Pascal大小寫處理 (CalculateInvoiceTotal),其中每個單詞的第一個字母都是大寫的。對於變量名,使用 camel大小寫處理 (documentFormatType),其中除了第一個單詞外每個單詞的第一個字母都是大寫的。
(10)不要使用原義數字或原義字符串,而是使用命名常數,NUM_DAYS_IN_WEEK ,以便於維護和理解。
2.2.分類命名規範
(1)包的命名
包名全部小寫,連續的單詞只是簡單地連接起來,不使用下劃線。
採用反域名命名規則,全部使用小寫字母。一級包名爲com,二級包名爲xx(可以是公司或則個人的隨便),三級包名根據應用進行命名,四級包名爲模塊名或層級名。
例如:com.jiashuangkuaizi.kitchen
包名
此包中包含
com.xx.應用名稱縮寫.activity
頁面用到的Activity類 (activitie層級名用戶界面層)
com.xx.應用名稱縮寫.base
基礎共享的類
com.xx.應用名稱縮寫.adapter
頁面用到的Adapter類 (適配器的類)
com.xx.應用名稱縮寫.util
此包中包含:公共工具方法類(util模塊名)
com.xx.應用名稱縮寫.bean
下面可分:vo、po、dto 此包中包含:JavaBean類
com.xx.應用名稱縮寫.model
此包中包含:模型類
com.xx.應用名稱縮寫.db
數據庫操作類
com.xx.應用名稱縮寫.view (或者 com.xx.應用名稱縮寫.widget )
自定義的View類等
com.xx.應用名稱縮寫.service
Service服務
com.xx.應用名稱縮寫.receiver
BroadcastReceiver服務
注意:
如果項目採用MVP,所有M、V、P抽取出來的接口都放置在相應模塊的i包下,所有的實現都放置在相應模塊的impl下
(2)類的命名
類的名字必須由大寫字母開頭而單詞中的其他字母均爲小寫;如果類名稱由多個單詞組成,則每個單詞的首字母均應爲大寫例如TestPage;如果類名稱中包含單詞縮寫,則這個所寫詞的每個字母均應大寫,如:XMLExample,還有一點命名技巧就是由於類是設計用來代表對象的,所以在命名類時應儘量選擇名詞。
類
描述
例如
Activity 類
Activity爲後綴標識
歡迎頁面類WelcomeActivity
Adapter類
Adapter 爲後綴標識
新聞詳情適配器 NewDetailAdapter
解析類
Parser爲後綴標識
首頁解析類HomePosterParser
工具方法類
Util或Manager爲後綴標識(與系統或第三方的Utils區分)或功能+Util
線程池管理類:ThreadPoolManager日誌工具類:LogUtil(Logger也可)打印工具類:PrinterUtil
數據庫類
以DBHelper後綴標識
新聞數據庫:NewDBHelper
Service類
以Service爲後綴標識
時間服務TimeServiceBroadcast
Receiver類
以Receiver爲後綴標識
推送接收JPushReceiver
ContentProvider
以Provider爲後綴標識
自定義的共享基礎類
以Base開頭
BaseActivity,BaseFragment
測試類的命名以它要測試的類的名稱開始,以Test結束。
例如:HashTest 或 HashIntegrationTest。
接口(interface):命名規則與類一樣採用大駝峯命名法,多以able或ible結尾,如
interface Runnable ;
interface Accessible。
注意:
如果項目採用MVP,所有Model、View、Presenter的接口都以I爲前綴,不加後綴,其他的接口採用上述命名規則。
(3)方法的命名
方法的名字的第一個單詞應以小寫字母作爲開頭,後面的單詞則用大寫字母開頭。
例如: sendMessge
方法名通常是動詞或動詞短語。
方法
說明
initXX()
初始化相關方法,使用init爲前綴標識,如初始化佈局initView()
isXX() checkXX()
方法返回值爲boolean型的請使用is或check爲前綴標識
getXX()
返回某個值的方法,使用get爲前綴標識
handleXX()
對數據進行處理的方法,儘量使用handle爲前綴標識
displayXX()/showXX()
彈出提示框和提示信息,使用display/show爲前綴標識
saveXX()
與保存數據相關的,使用save爲前綴標識
resetXX()
對數據重組的,使用reset前綴標識
clearXX()
清除數據相關的
removeXXX()
清除數據相關的
drawXXX()
繪製數據或效果相關的,使用draw前綴標識
(4).常量的命名
常量的名字應該都使用大寫字母,並且指出該常量完整含義。如果一個常量名稱由多個單詞組成,則應該用下劃線來分割這些單詞。
例如: MAX_VALUE
(5).非常量字段的命名
非公有,非靜態字段命名以m開頭。
靜態字段命名以s開頭。
公有非靜態字段命名以p開頭。
公有靜態字段(全局變量)命名以g開頭。
public static final 字段(常量) 全部大寫,並用下劃線連起來。
例子:
public class MyClass {
public static final int SOME_CONSTANT = 42;
public int pField;
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
protected int mProtected;
public static int gField;
}
(6)參數的命名
參數的命名規範和方法的命名規範相同,而且爲了避免閱讀程序時造成迷惑,請在儘量保證參數名稱爲一個單詞的情況下使參數的命名儘可能明確。
(7)Javadoc註釋
Java除了可以採用我們常見的註釋方式之外,Java語言規範還定義了一種特殊的註釋,也就是我們所說的Javadoc註釋,它是用來記錄我們代碼中的API的。Javadoc註釋是一種多行註釋,以/**開頭,而以*/結束,註釋可以包含一些HTML標記符和專門的關鍵詞。使用Javadoc註釋的好處是編寫的註釋可以被自動轉爲在線文檔,省去了單獨編寫程序文檔的麻煩。
例如:
/**
* This is an example of
* Javadoc
*
* @author darchon
* @version 0.1, 10/11/2002
*/
在每個程序的最開始部分,一般都用Javadoc註釋對程序的總體描述以及版權信息,之後在主程序中可以爲每個類、接口、方法、字段添加Javadoc註釋,每個註釋的開頭部分先用一句話概括該類、接口、方法、字段所完成的功能,這句話應單獨佔據一行以突出其概括作用,在這句話後面可以跟隨更加詳細的描述段落。在描述性段落之後還可以跟隨一些以Javadoc註釋標籤開頭的特殊段落,例如上面例子中的@auther和@version,這些段落將在生成文檔中以特定方式顯示。
雖然爲一個設計低劣的程序添加註釋不會使其變成好的程序,但是如果按照編程規範編寫程序並且爲程序添加良好的註釋卻可以幫助你編寫出設計完美,運行效率高且易於理解的程序,尤其是在多人合作完成同一項目時編程規範就變得更加重要。俗話說“磨刀不誤砍柴工”,花費一點時間去適應一下Java編程規範是有好處的。
3.分類命名規範
3.1.基本數據類型命名規範
Integer:int+描述 Char:chr+描述 Boolean:bln+描述
Long:lng+描述 Short:shr +描述 Double:dbl+描述
String:str+描述 Float:flt+描述 Single:sng+描述
DataTime:dt+描述 Array:arr+描述 Object:obj+描述
如:String srtName;
3.2.控件命名規範
TextView :txt_+描述 |
Button :btn_+描述 |
ImageButton :ib_+描述 |
ImageView :img_+描述 |
CheckBox :chk_+描述 |
RadioButton :rb_+描述 |
AnalogClock :ac_+描述 |
DigitalClock :dc_+描述 |
DatePicker :dp_+描述 |
TimePicker :tp _+描述 |
ToggleButton :tb_+描述 |
EditText:edit_+描述 |
ProgressBar:pb_+描述 |
SeekBar:sb _+描述 |
AutoCompleteTextView:autotxt_+描述 |
MultiAutoCompleteTextView:mlautotxt_+描述 |
ZoomControls:zc_+描述 |
Include:ind_+描述 |
VideoView:vv_+描述 |
WebView:wv_+描述 |
RatingBar:ratbr_+描述 |
Tab:tab__+描述 |
Spinner:spin_+描述 |
Chronometer:chro_+描述 |
ScrollView:sv_+描述 |
TextSwitcher:tswi_+描述 |
Gallery:gal_+描述 |
ImageSwitcher:imgswi_+描述 |
GridView:gv_+描述 |
ListView:lv_+描述 |
ExpandableList: exl_+描述 |
MapView: mv_+描述 |
控件說明如下:
• TextView - 文本顯示控件
• Button - 按鈕控件
• ImageButton - 圖片按鈕控件
• ImageView - 圖片顯示控件
• CheckBox - 複選框控件
• RadioButton - 單選框控件
• AnalogClock - 鐘錶(帶錶盤的那種)控件
• DigitalClock - 電子錶控件
• DatePicker - 日期選擇控件
• TimePicker - 時間選擇控件
• ToggleButton - 雙狀態按鈕控件
• EditText - 可編輯文本控件
• ProgressBar - 進度條控件
• SeekBar - 可拖動的進度條控件
• AutoCompleteTextView - 支持自動完成功能的可編輯文本控件
• MultiAutoCompleteTextView - 支持自動完成功能的可編輯文本控件,允許輸入多值(多值之間會自動地用指定的分隔符 分開)
• ZoomControls - 放大/縮小按鈕控件
• Include - 整合控件
• VideoView - 視頻播放控件
• WebView - 瀏覽器控件
• RatingBar - 評分控件
• Tab - 選項卡控件
• Spinner - 下拉框控件
• Chronometer - 計時器控件
• ScrollView - 滾動條控件
• TextSwitcher - 文字轉換器控件(改變文字時增加一些動畫效果)
• Gallery –畫廊控件
• ImageSwitcher - 圖片轉換器控件(改變圖片時增加一些動畫效果)
• GridView - 網格控件
• ListView - 列表控件
• ExpandableList - 支持展開/收縮功能的列表控件
3.3.變量命名規範
變量命名:前綴+類型描述+意義描述
前綴:
成員變量:m_*** 局部變量:l_*** 形參:a_***
常量:大寫_*** 枚舉值:em_***
3.4.程序規範
工程的命名爲:描述
應用程序名的命名爲:描述+App
4.代碼書寫規範
(1)java代碼中不出現中文,最多註釋中可以出現中文
(2)使用shape和selector
(3)圖片儘量分拆成多個可重用的圖片
(4)服務端可以實現的,就不要放在客戶端
(5)引用第三方庫要慎重,避免應用大容量的第三方庫,導致客戶端包非常大
(6)處理應用全局異常和錯誤,將錯誤以郵件的形式發送給服務端
(7)使用靜態變量方式實現界面間共享要慎重
(8)不要重用父類的handler,對應一個類的handler也不應該讓其子類用到,否則會導致message.what衝突
(9)strings.xml中使用%1$s實現字符串的通配
(10)複雜佈局使用RelativeLayout
(11)自適應屏幕,使用dp替代pix
(12)使用animation-list製作動畫效果
(13))建立標準的縮進大小(如四個空格),並一致地使用此標準。用規定的縮進對齊代碼節。
(14)在發佈源代碼的硬拷貝版本時使用特定的字體以及字號(新宋體、小五號)。
(15)在括號對對齊的位置垂直對齊左括號和右括號,如:
for (i=0; i<100; i++)
{
;
}
(16)沿邏輯結構行縮進代碼使代碼更易於閱讀和理解,如:
if(expression)
{
if(expression )
{
//
//此處填寫你的代碼塊;
//
}
else
{
//
//此處填寫你的代碼塊;
//
}
}
(17)爲註釋和代碼建立最大的行長度,以避免不得不滾動源代碼編輯器,並且可以提供整齊的硬拷貝表示形式。
(18)當一行內容太長而必須換行時,在後面換行代碼中要使用縮進格式,如下:
string inserString ="Insert Into TableName(username,password,email,sex,address) "
+"Values( 'Soholife ', 'chenyp ', '[email protected] ', 'male ', '深圳福田 ') ";
(19)每一行上放置的語句避免超過一條。特殊循環如for(i =0;i<100;i++)等除外。
(20)編寫SQL語句時,對於關鍵字使用全部大寫,對於數據庫元素(如表、列和視圖)使用大小寫混合。
(21)
例如SELECT * FROM Table1;
將每個主要的SQL子句放在不同的行上,這樣更容易閱讀和編輯語句,例如:
SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA '
(22)在物理文件之間在邏輯上劃分源代碼
(23)使用空白爲源代碼提供結構線索。這樣做會創建代碼“段”,有助於讀者理解軟件的邏輯分段
(24)將大的複雜代碼段分爲較小的、易於理解的模塊。
5.註釋
軟件文檔以兩種形式存在:外部的和內部的。外部文檔(如規範、幫助文件和設計文檔)在源代碼的外部維護。內部文檔由開發人員在開發時在源代碼中編寫的註釋組成。
不考慮外部文檔的可用性,由於硬拷貝文檔可能會放錯地方,源代碼清單應該能夠獨立存在。外部文檔應該由規範、設計文檔、更改請求、錯誤歷史記錄和使用的編碼標準組成。 以下幾點是規範的註釋方法:
(1)一個工程應有一個統一的頭文件註釋,以說明整個工程的信息、創建日期、版本等等
(2)對重要的程序加註釋進行說明
(3)修改代碼或刪除時,將原代碼用註釋的方法屏蔽,同時要加開發者自身對修改操作的註釋。格式爲:
//原代碼
//Added/(Modified/ Deleted) by 開發者姓名 年-月-日;
//因爲業務原因修改的,要註明修改或刪除原因)
新代碼
(4)使用XML文檔格式,如下面方法的註釋:
/// <summary>
/// 得到某人的年齡
/// </summary>
/// <param name= "userName "> 用戶名 </param>
/// <returns> 用戶年齡 </returns>
public int GetUserAge(string userName)
{
//
//此處寫你的程序代碼
//
}
(5)避免雜亂的註釋,而是應該使用空白將註釋同代碼分開。
(6)移除所有臨時或無關的註釋,以避免在日後的維護工作中產生混亂。
(7)註釋應對代碼進行準確的說明,不應存在歧義。
(8)在整個應用程序中,使用具有一致的標點和結構的統一樣式來構造註釋。
二.性能優化
http請求按照業務需求,分爲是否可以緩存和不可緩存,那麼在無網絡的環境中,仍然通過緩存的httpresponse瀏覽部分數據,實現離線閱讀。
2.listview 性能優化
1).複用convertView
在getItemView中,判斷convertView是否爲空,如果不爲空,可複用。如果couvertview中的view需要添加listerner,代碼一定要在if(convertView==null){}之外。
2).異步加載圖片
item中如果包含有webimage,那麼最好異步加載
3).快速滑動時不顯示圖片
當快速滑動列表時(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處於其他兩種狀態(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來
3.使用線程池,分爲核心線程池和普通線程池,下載圖片等耗時任務放置在普通線程池,避免耗時任務阻塞線程池後,導致所有異步任務都必須等待
4.異步任務,分爲核心任務和普通任務,只有核心任務中出現的系統級錯誤纔會報錯,異步任務的ui操作需要判斷原activity是否處於激活狀態
5.儘量避免static成員變量引用資源耗費過多的實例,比如Context
6.使用WeakReference代替強引用,弱引用可以讓您保持對對象的引用,同時允許GC在必要時釋放對象,回收內存。對於那些創建便宜但耗費大量內存的對象,即希望保持該對象,又要在應用程序需要時使用,同時希望GC必要時回收時,可以考慮使用弱引用。
7.超級大胖子Bitmap
及時的銷燬(Activity的onDestroy時,將bitmap回收)
設置一定的採樣率
8.巧妙的運用軟引用
drawable對應resid的資源,bitmap對應其他資源8.保證Cursor 佔用的內存被及時的釋放掉,而不是等待GC來處理。並且 Android明顯是傾向於編程者手動的將Cursor close掉
9.線程也是造成內存泄露的一個重要的源頭。線程產生內存泄露的主要原因在於線程生命週期的不可控
10.如果ImageView的圖片是來自網絡,進行異步加載
11.應用開發中自定義View的時候,交互部分,千萬不要寫成線程不斷刷新界面顯示,而是根據TouchListener事件主動觸發界面的更新
2.使用styles,複用樣式定義
3.軟鍵盤的彈出控制,不要讓其覆蓋輸入框
4.數字、字母和漢字混排佔位問題:將數字和字母全角化。由於現在大多數情況下我們的輸入都是半角,所以 字母和數字的佔位無法確定,但是一旦全角化之後,數字、字母的佔位就和一個漢字的佔位相同了,這樣就可以避免由於佔位導致的排版問題。
5.英文文檔排版:textview自動換行時要保持單詞的完整性,解決方案是計算字符串長度,然後手動設定每一行顯示多少個字母並加上‘n‘
6.複雜佈局使用RelativeLayout
7.自適應屏幕,使用dp替代pix
8.使用android:layout_weight或者TableLayout製作等分佈局
9.使用animation-list製作動畫效果