代码命名规范

前言

代码命名规范在开发过程中极其重要,记得进第一家公司的时候,刚进入就丢了一份java的代码规范文档给我。写了个小demo给当时的主管,然后因为命名规范问题被叫去谈话了,由此可见公司的开发人员都非常重视代码命名。因为很多时候一个应用的开发工作并不是你一个人完成的,你可能会有一个小伙伴与你同时开发,也可能你开发完成后会有其他的小伙伴接替你的工作。如果这个时候别人看到你乱七八糟的代码不知道从哪里下手估计心里早就把你骂了千百遍。换位思考,如果你是接班人,或者和你合作的小伙伴代码写的乱七八糟的。想要用他封装的某个功能,结果毛都没看懂。心里肯定要骂娘呀。
作为一个伟大的程序员候选人,我们的目标是创造好用且优雅的代码。
啊哈哈,那首先走出第一步。代码命名和注释。

包名

首先说下Android包名的命名规则。

Andorid的包名一般采用域名的反转,单词全小写。域名为www.example.com的包名为com.example,省略www。

包名的开始是一个顶级域名,比如com,cn,org等,包名使用.做为分隔符。第二位一般是二级域名,也可以根据不同机构各自的命名。
后面的命名可以用部门,项目等进行区分(也可以没有),例如:

com.example.project
在项目内可以根据功能不同,按照模块划分不同的包名,com.example.project.user就是表示用户模块。

也可以根据层级的不同而划分不同的包名,比如:com.example.prokect.activity,就是Acitivity相关的包。

当然也可以在不同层级里面再按照模块划分包名,比如:com.example.project.activity.user,表示和用户有关的Activity。

总结,包名一般是以反转域名开始,后面跟有项目名称(缩写,也可以没有)。

后面可以采用的区分包名方式:

按照类功能 com.example.project.bean(实体类) com.example.project.network(存放网络层相关)

模块下区分层级 com.example.project.ui.user;(这边放user模块UI) com.example.project.ui.widger(一些自定义控件)

类和接口

类名是一个或多个单词组成,采用大驼峰命名,尽量要使类名简洁且利于描述,例如:SignInActivity,类名规则如下:

大驼峰命名
简洁而富有表达性
尽量不使用缩写(广泛使用的单词除外,比如URL,XML…)
多单词中采用 名词+动词的方式命名: LocationManage
对于缩写单词要全部大写比如:XMLManage
一个类如果继承了Android的组件,需在使用该组件的名称作为后缀,这样容易区分该类的作用,比如: SgnInActivity,UserInfoFragment,FileUploadService…

接口一般使用I开头,采用大驼峰命名规则,比如:IPullToRefresh。

变量

Android变量分为三种:成员变量,静态变量和常量。

成员变量

成员变量采用小驼峰命名规则,第一单词的首字母小写,其后的首字母大写。变量名一般不使用_和$开头。例如:

private Intent cropIntent;
变量名应简短且易于描述,选用规则尽量简单,易于记忆和联想。

非控件的类成员变量可以用m开头,比如 private UserInfo mUserInfo;

尽量避免单个字符的变量名,除非是用于一次性的临时变量,临时的整形变量一般命名为 i,j,k,m,n。字符型的变量一般使用c,d,e。

对于View变量的命名规则,如果View是一个单词的,采用第一个单词小写的方式+对应View的描述进行,例如:

private View viewUserInfo;
如果是两个单词组成的View,比如:TextView,一般采用缩写的方式,例如:

private TextView tvUserName;
一般情况下Button缩写为:btn。

静态变量

为了可以很方便的区分静态变量,静态变量的命名一般采用小写的s开头,后面单词的命名规则和成员变量保持一致,例如:

private static Map sCacheStrings;

常量

常量命名规则一般是所有的单词都是大写,中间使用_(下划线)分割,例如:

private static final float SCALE_RATE = 1.25f;
代码中不允许出现单独的字符串或数字常量,比如xx.equals(“1”),单独的字符串或数字不利于后期的维护。如果需要使用数据或字符,请按照他们的含义封装成静态常量,或者使用枚举,for语句除外。

方法

方法命名规则采用小驼峰命名法例如:onCreate(),onRun(),方法名一般采用动词或者动名词。
一般使用的方法名前缀。

getXX()返回某个值的方法
initXX() 初始化相关方法,比如初始化布局:initView()
checkXX()和isXX() 方法为boolean值的时候使用is或者check为前缀
saveXX() 保存数据
clearXX()和removeXX() 清除数据
updateXX() 更新数据
processXX() 对数据进行处理
dispalyXX() 显示某某信息
draswXX() 绘制数据或者效果
setXXX()配置某些信息

对于方法的其他一些规范:

方法的参数尽可能不超过4个,需要更多的参数的时候可以采用class的方法
方法参数中尽量少使用boolean,使用boolean传参不利于代码的阅读
方法尽量不超过15行,方法过长,说明当前方法业务逻辑过于复杂,需要进行方法拆分
一个方法只做一件事,
如果一个方法返回的是一个错误码,可以使用异常
不使用try catch 处理业务逻辑
尽可能不实用null,替代为异常或者使用空的变量,比如Collections.emptyList()

Layout

Layout的命名规则需要和使用他们的组件对应,方便查找和维护,比如我们在创建一个用户信息的UserInfoActivity,对应的Layout的命名就应该是activity_user_info.xml。

对应Andorid组件的Layout命名规则:

Activity -> activity_user_info.xml
Fragment -> fragment_sign_up.xml
Dialog -> dialog_change_password.xml
AdapterView Item -> item_user.xml
Layout只是一部分 -> partial_stats_bar.xml

string和color

项目中使用的string,和color的值原则上都是必须放在strings.xml和colors.xml中,不要放在Java代码中,这样的好处是可复用,提高维护性,减少非必要的代码。颜色是因为基本上颜色主题差不多如果有需要改颜色,只需要该一下colors的色值就可以了。string的优势是如果以后做国际化的话string的代码就不需要再次做修改了。如果项目很大这些都没做好想要改掉所有的中文是很麻烦的。

xml的资源命名,字母全部小写,多个单词之间使用_(下划线)分割.

建议color的命名中体现其ARGB值,比如:
color_blue_0000ff(看一下大致的颜色后面加上色值)
这样的写法对于代码提示更加的友好,有利于对照标注图查找颜色值。

id命名

建议使用驼峰式命名,使用名词或者名词词组,应该通过id的命名可以直接理解当前的View要实现的功能.在这里使用驼峰命名的优势是,打个下划线特别麻烦。而且你在类中要找到这个命名也很麻烦。比如 tvUserName = findViewById(R.id.tv_user_name);如果都使用驼峰命名,二者是一样的 tvUserName =findViewById(R.id.tvUserName);这样就可以使出copy paste 大招了!!!

例如:

@+id/tvUserName
id命名的第一个单词使用View的缩写,如果View只是一个单词,缩写就是当前单词。一般Button的缩写为:btn。

Drawable命名

Drawable的命名规则根据使用的控件来命名,控件的缩写在前面,后面使用表示其功能的一个或者多个单词,中间使用使用_下划线分割。

Action bar使用ab_,比如:abstacked.png
Button 使用btn

Dialgo 使用dialog
Divide 使用 divider

Icon 使用 ic
Menu 使用menu

Notification使用 notification
Tabs 使用tab

Drawable是有多个状态的,在命名中体现出状态的不同:

Normal 对应_normal结尾,比如btn_order_normal.9.png
Pressed 对应_pressed结尾
Focused 对应_focused结尾
Disabled 对应_disabled结尾
Selected 对应_selected结尾
其他资源文件的命名需要遵守Android的规范即可,比如arrays.xml数组文件,dimens.xml分辨的配置,style.xml样式的配置,资源文件的ID命名规则都是才是字母小写,使用下划线分割的原则。

暂时就想到这么多了,有漏的后面再做补充!!

By Xiaolong,每一天都值得被认真对待!