转载自: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 ', 'soholife@sina.com ', '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制作动画效果