在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的。比如,大小写的区分,使用不同字母开头等等。但究其本,追其源,在为一个资源其名称的时候,应该本着描述性以及唯一性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆。
对于理解应用程序的逻辑流,命名方案是最有影响力的一种帮助。名称应该说明“什么”而不是“如何”。命名原则是:使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。以下几点是规范的命名方法。
(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 ,以便于维护和理解。
Java包的名字必须由小写单词组成。但是由于Java面向对象编程的特性,每一名Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。
例如:
com.goboosoft.<项目名>.db 数据库相关
com.goboosoft.<项目名>.bean 实体类
com.goboosoft.<项目名>.constants 常量
com.goboosoft.<项目名>.ui 界面activity及fragment
com.goboosoft.<项目名>.widget 自定义组件
com.goboosoft.<项目名>.utils 系统工具类
com.goboosoft.<项目名>.service 服务
com.goboosoft.<项目名>.reciver 广播接收者
com.goboosoft.<项目名>.net 网络操作
com.goboosoft.<项目名>.base 各种父类
类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestPage;如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。
实体类命名:
-UserEntity
-ProductEntity
…
常量类命名:
-URLConstants
-SharePrefsConstants
…
activity及fragment命名::
-MainActivity
-PersonFragment
…
Adapter命名:
-ListAdapter
-ViewPagerAdapter
…
自定义组件命名:
-RefreshView
-DateSelectView
…
工具类命名:
-FileUtils
-EncryptUtils
-NetUtils
-ImageUtils
…
service 命名:
-RefrshDataService
…
reciver 命名:
-RefrshDataReciver
…
各种父类命名:
-BaseApplication
-BaseActivity
-BaseFragment
…
方法的名字为动词或动名词,采用小驼峰命名法(第一个单词应以小写字母作为开头,后面的单词则用大写字母开头)。
例如: onCreate(),run()
方法 |
说明 |
initXX() |
初始化相关方法,使用init为前缀标识,如初始化布局initView() |
isXX() |
checkXX()方法返回值为boolean型的请使用is或check为前缀标识 |
getXX() |
返回某个值的方法,使用get为前缀标识 |
processXX() |
对数据进行处理的方法,尽量使用process为前缀标识 |
displayXX() |
弹出提示框和提示信息,使用display为前缀标识 |
saveXX() |
与保存数据相关的,使用sav为e前缀标识 |
resetXX() |
对数据重组的,使用reset前缀标识 |
clearXX() |
清除数据相关的 |
removeXXX() |
清除数据相关的 |
drawXXX() |
绘制数据或效果相关的,使用draw前缀标识 |
变量(variables)采用小驼峰命名法。类中控件名称必须与xml布局id保持一致。
用统一的量词通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。
量词列表:量词后缀说明
First 一组变量中的第一个
Last 一组变量中的最后一个
Next 一组变量中的下一个变量
Prev 一组变量中的上一个
Cur 一组变量中的当前变量
常量(Constants)全部大写,采用下划线命名法。
例如:MIN_WIDTH
动画文件全部存储于res/anim文件夹下,命名全部小写,采用下划线命名法,加前缀区分。
前面为动画的类型,后面为方向
动画命名例子 |
规范写法 |
备注 |
fade_in |
淡入 |
|
fade_out |
淡出 |
|
push_down_in |
从下方推入 |
|
push_down_out |
从下方推出 |
|
push_left |
推像左方 |
|
slide_in_from_top |
从头部滑动进入 |
|
zoom_enter |
变形进入 |
|
slide_in |
滑动进入 |
|
shrink_to_middle |
中间缩小 |
|
layout布局文件命名全部小写,采用下划线命名法。
命名例子 |
规范写法 |
备注 |
activity_main |
Activity布局命名 |
|
fragment_main |
Fragment 布局命名 |
|
user_item |
adapter子布局命名 |
|
person_view |
自定义View布局命名 |
|
include_head |
包含项:include_模块.xml |
|
dialog_time |
Dialog命名 |
|
资源文件(图片drawable文件夹下):全部小写,采用下划线命名法,加前缀区分
命名模式:activity名称_逻辑名称/common_逻辑名称
如果有多种形态如按钮等除外如btn_xx.xml(selector)
名称 |
功能 |
btn_xx |
按钮图片使用btn_整体效果(selector) |
btn_xx_normal |
按钮图片使用btn_正常情况效果 |
btn_xx_press |
按钮图片使用btn_点击时候效果 |
bg_head |
背景图片使用bg_功能_说明 |
def_search_cell |
默认图片使用def_功能_说明 |
icon_more_help |
图标图片使用icon_功能_说明 |
seg_list_line |
具有分隔特征的图片使用seg_功能_说明 |
sel_ok |
选择图标使用sel_功能_说明 |
命名后缀:
后缀 |
说明 |
unit |
在使用xml的tilemode来配图片时,element图片使用此后缀 |
nor |
图片的状态,代表普通状态 |
hl |
图片的状态,代表高亮状态 |
press |
图片的状态,代表按下状态 |
select |
图片的状态,代表其所占的view被选中 |
unselect |
图片的状态,代表其所占的view没有被选中 |
组件ID全部小写采用下划线命名法;
命名模式为:view缩写_模块名称_view的逻辑名称
view的缩写详情如下:
控件 |
缩写 |
LayoutView |
lv |
RelativeView |
rv |
TextView |
tv |
Button |
btn |
ImageButton |
ibtn或 image_btn |
ImageView |
Iv 或 image_view |
CheckBox |
chk或 check_box |
RadioButton |
rbtn或 radio_btn |
analogClock |
aclk或 |
DigtalClock |
dclk或 |
DatePicker |
dtpk或 |
EditText |
et 或 edit_text |
TimePicker |
tmpk |
toggleButton |
tgbtn |
ProgressBar |
probar 或 progress_bar |
SeekBar |
sbar 或sekk_bar |
AutoCompleteTextView |
autotv |
ZoomControls |
zctl |
VideoView |
vv 或 video_view |
WdbView |
wv或 web_view |
RantingBar |
ratbar |
Tab |
tab |
Spinner |
spn 或 spinner |
Chronometer |
cmt |
ScollView |
sv 或scoll_view |
TextSwitch |
txtswt 或 text_switch |
ImageSwitch |
imgswt 或 image_switch |
listView |
lv或list_view |
ExpandableList |
elt |
MapView |
mapv 或 map_view |
资源ID(resourcesid):全部小写采用下划线命名法。命名规范为“资源控件的缩写名”_“变量名”。注意:页面控件名称应该和控件id名保持一致
strings.xml,colors.xml等中的id命名:
命名模式:activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称/common_逻辑名称
strings.xml中,使用activity名称注释,将文件内容区分开来
例如:
name_colr
user_age
…
在应用开发初,对于基本组件(TextView、EditView、Button、ImageButton…)的默认字体颜色、字体大小、点击效果、默认图片等等,写入到应用Theme中。对于特殊的则在Style中进行单独书写调用。
在开发过程中对于layout中不断重现的style,提炼出通用的style通用组件,放到styles.xml中进行调用,并且写明注释。
在开发过程中对于通用的组件ID、color ID、dimen 等等,统一提炼出来写在资源文件的顶部,注释标明为通用资源。
在开发工程中对于需要通配的字符串不要使用多个view进行拼接,strings.xml中使用%1$s实现字符串的通配。
对于通用字符串统一提炼出来写在string.xml顶部,并写明注释。
数据一定要效验,例如:字符型转数字型,如果转换失败一定要有缺省值;服务端响应数据是否有效判断。
字符串进行判空时使用Android自带的工具类 TextUtils.isEmpty()进行判断,切勿使用if(null != a && !a.equals(""))进行判断。
在开发过程中,所有的 stirng字符串、颜色字符串、dimen必须全部写入到对应资源文件中。决不允许在 *.java 及 layout.xml 中存在写死的字符串。
代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。所以我们不是为写注释而写注释。下面是开发中使用的代码注释规范,供大家参考下。
1、注释形式统一
在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范。
2、注释内容准确简洁
内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。
1、基本注释(必须加)
(a)类(接口)的注释
(b)构造函数的注释
(c)方法的注释
(d)全局变量的注释
(e)字段/属性的注释
备注:简单的代码做简单注释,注释内容不大于10个字即可,另外,持久化对象或VO对象的getter、setter方法不需加注释。具体的注释格式请参考下面举例。
2、特殊必加注释(必须加)
(a)典型算法必须有注释。
(b)在代码不明晰处必须有注释。
(c)在代码修改处加上修改标识的注释。
(d)在循环和逻辑分支组成的代码中加注释。
(e)为他人提供的接口必须加详细注释。
备注:此类注释格式暂无举例。具体的注释格式自行定义,要求注释内容准确简洁。
a) 单行(single-line)注释:“//……”
b) 块(block)注释:“/*……*/”
c) 文档注释:“/**……*/”
d) javadoc 注释标签语法:
@author 对类的说明标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
1. /**
2. *类 <code>{类名称}</code>{此类功能描述}
3. *
4. *
5. *@author {作者中文名或拼音缩写}
6. *
7. * @version{版本,常用时间代替}
8. *
9. *@see java.lang.Class
10. *
11. * @since JDK{jdk版本}
12. * @createDate {创建时间}
13. */
14. public class Object {}
15.
1. /**
2.
3. * {方法的功能/动作描述}
4.
5. *
6.
7. * @param {引入参数名} {引入参数说明}
8.
9. * @return {返回参数名} {返回参数说明}
10.
11. * @exception {说明在某情况下,将发生什么异常}
12.
13. */
14.
15. public String substring(int beginIndex) {
16.
17. return substring(beginIndex, count);
18.
19. }
1. /*
2.
3. *调用持久化类,将数据保存到库{功能描述}
4.
5. *
6.
7. *判断是添加,还是修改{具体实现动作}
8.
9. */
10.
11. boolean ifSucc = false;
12.
13. if(request.getParameter("YINGLI_ID")==null){
14.
15. String GUID = new RandomGUID().toString();
16.
17. stressTestDataBean.setUSER_ID(Integer.toString(userId));
18.
19. stressTestDataBean.setSIGN_ISBN((String)vSectNum.get(0));
20.
21. stressTestDataBean.setSHENHE_JIEGUO("0");
22.
23. stressTestDataBean.setGUID(GUID);
24.
25. stressTestDataBean.setCREATE_DATE("getdate()");
26.
27. stressTestDataBean.setSTATE("A");
28.
29.
30.
31. ifSucc = StressTestDataDao.addStressTestData(db,stressTestDataBean);
32.
33. }else{
34.
35. ifSucc = StressTestDataDao.mendStressTestData(db,stressTestDataBean);
36.
37. }
38.
1. public class EmailEntity implements Serializable{
2.
3. private String id; //发件ID
4.
5. private String senderName;//发送人姓名
6.
7. private String title;//不能超过120个中文字符
8.
9. private String content;//邮件正文
10.
11. private String attach;//附件,如果有的话
12.
13. private String totalCount;//总发送人数
14.
15. private String successCount;//成功发送的人数
16.
17. private Integer isDelete;//0不删除 1删除
18.
19. private Date createTime;//目前不支持定时 所以创建后即刻发送
20.
21. privateSet<EmailList> EmailList;
22.
23. }