最近在组内分享一些提升组员开发能力的文章,起因是去年我刚加入公司时重做了一款内部自研的项目,正好这个项目最近也接近尾声,领导希望我参照新旧项目的对比,把我在重构过程中运用的一些实用开发技能给分享出来,来帮助其他开发人员提升开发能力,命名规范是其中比较基础且重要的部分,下面就做一些简单的总结。
前言
Android 开发规范涉及到很多方面,包括 Android Stuido 规范、命名规范、代码样式规范、注释规范和测试规范等,这里我列举列其中比较常用的部分也就是 Android 项目涉及到的各种命名规范。通过这些规范去统一项目的整体风格。
模块及包名命名
这里的模块是指 Android Studio 里的 module,对项目做模块化拆分时会用到
类别 | 具体规则 | 举例说明 |
---|---|---|
模块名 | 全部小写,连续的单词可以用“-”连接,也可以根据 文件夹去分类,主要传达出简洁,明确的信息 |
core-common,core-storage,feature-mian 等或者 core/common,core/storage,feature/main 等 |
包名 | 反域名命名规则,全部小写,连续的单词只是简单地连接起来,不使用下划线 | 1.一级包名是顶级域名,通常为 com、edu、gov、net、org 等 2.二级包名为公司名 3.三级包名根据应用进行命名 4.更多级别的包名则根据 PBF 来划分(按功能分包 Package By Feature) |
PBF 分包有诸多好处,例如:
- 包内高内聚,包间低耦合,包内的类可以进行高度抽象
- 包内有私有作用域(package-private scope),避免不同包名下的类交叉调用
- 容易管理,如果后期功能不再使用可以连同包名一同移除
- 可以在此基础上进一步的进行模块化
类、字段和方法命名
类别 | 具体规则 | 举例说明 |
---|---|---|
类名 | 基本上采用大驼峰命名法,尽量避免缩写,除非大家一些熟知的像 UML、URL 等且都是大写 | 四大组件:以对应的 Activity、Service、Receiver 和 Provider 结尾 共享的基础类:以 Base 开头,像 BaseActivity、BaseFragment、BaseAdapter 等 其它等都是以固有名词结尾,像工具类 Utils、适配器类 Adapter、解析类 Parser 和测试类 Test 等 |
方法名 | 采用小驼峰命名法,也就是 lowerCamelCase 风格,一些场景下拥有固有的前缀或后缀 | 初始化相关:initXX(), 返回值为 boolean 类型的:isXX()或 checkXX(), 一个字段的 get/set:getXX()/setXX(), 数据处理:handleXX()或 processXX(), 弹出框或提示:displayXX()/showXX(), 数据的 CURD:插入或保存 - insertXX()/saveXX(), 更新 - updateXX(), 重置 - resetXX(), 清除 - clearXX(), 移除 - removeXX()/deleteXX() 绘制数据或效果相关:drawXXX() |
字段名 | 常量一般都是 static final 字段,全部大写且以下划线分割,非常量字段则是 lowerCamelCase 风格 | 常量表示一个实例是不可变的,这种情况下则用大写表示,如果是可变的则不是常量,比如用 static final 表示的内容可变的 List、Set 或 Map 等,则不必用大写 非常量字段根据修饰符和用途会有所不一样,比如: 1. 非公有且非静态字段一般以 m 开头 2. 静态字段命名以 s 开头 3. Andrdoid 控件为了和普通成员变量区分,一般以控件缩写作为前缀 |
其它 | 这里方法参数名和局部变量名按照 lowerCamelCase 风格编写,临时变量简单即可 | 除了临时变量和循环变量,参数名和局部变量名应避免使用单字符进行命名 |
关于 Java 命名规范还可以参考 阿里巴巴 Java 开发手册
这里额外说一下代码样式规范,这个规范没有唯一的答案,尽量往提高代码可读性方向去做,比如类和方法的行数一般都不建议太长,太长的话就是需要做重构的标志了,下面是类成员在类中的排列顺序的推荐写法
- 常量
- 字段
- 构造函数
- 重写函数和回调
- 公有函数
- 私有函数
- 内部类或接口
例如:
1 | public class MainActivity extends Activity { |
如果类继承于 Android 组件(例如 Activity 或 Fragment),那么把重写函数按照他们的生命周期进行排序是一个非常好的习惯,例如,Activity 实现了 onCreate()、onDestroy()、onPause()、onResume(),它的正确排序如下所示:
1 | public class MainActivity extends Activity { |
资源命名
类别 | 具体规则 | 举例说明 |
---|---|---|
anim/ | {模块名_}+逻辑名称 | 逻辑名称可有多个单词加下划线组成,例如:淡入 - fade_in, 滑动进入 - slide_in 等 |
color/ | 类型+{模块名}+逻辑名称 | {} 中的内容可选,例如:sel_btn_font |
drawable/ | 类型+{模块名}+逻辑名称或者 类型+{模块名}+颜色 |
res/drawable 目录下存放位图文件(.png、.9.png、.jpg、.gif)或编译为可绘制对象资源子类型的 XML 文件,而 res/mipmap 目录放的是不同屏幕密度下的启动图标 类型可以是可绘制对象资源类型(selector、shape 或 layer-list 等),也可以是控件类型,最后可加后缀_small 表示小图,_big 表示大图 例如:btn_main_about,btn_back,ic_search,bg_home 等 |
layout/ | 类型+{模块名}+逻辑名称 | {}中的内容可选,类型主要有:activity、fragment、dialog、item 等,自定义控件以 view、layout 或 widget 等为前缀 |
values/colors | 根据项目实际情况决定 | 如果以控件类型命名则不可避免的会有重复,一般来讲会按设计图上的定义来 |
values/dimens | 根据项目实际情况决定 | 这个很难避免重复,一般也是根据设计图来定义,尽量做到通用不重复,比如 margin 和 padding 可以用 spacing_前缀定义 |
values/strings | {模块名_}+逻辑名称 | 一般同一页面下的 string 定义到一起,这样方便查找 |
values/styles | 使用大驼峰命名法 | 一般项目有一个通用的 sytles.xml 文件,同样需要根据设计图来总结出通用的 style,像标题,正文,描述,按钮等等这些拥有相同的 size 或 color 的可以使用同一 style |
values 下的资源文件命名一般是以 s 结尾,也可以根据模块进行划分,比如 colors_home.xml、strings_main.xml 等
控件 ID 命名
id 命名规则:控件缩写 + {模块名} + 页面功能名,{}的内容是可选的, 比如:tv_main_title, iv_search,btn_back 等下面是 UI 控件缩写表
名称 | 缩写 |
---|---|
Button | btn |
CheckBox | cb |
EditText | et |
FrameLayout | fl |
GridView | gv |
ImageButton | ib |
ImageView | iv |
LinearLayout | ll |
ListView | lv |
ProgressBar | pb |
RadioButtion | rb |
RecyclerView | rv |
RelativeLayout | rl |
ScrollView | sv |
SeekBar | sb |
Spinner | spn |
TextView | tv |
ToggleButton | tb |
VideoView | vv |
WebView | wv |
ConstraintLayout | cl |
包括自定义控件或者 Google 官方后续新出的控件,控件的缩写都是首字母小写拼在一起,如果跟已有的控件缩写重复则多添加一个单词做区分
另外还有通用的单词缩写:
名称 | 缩写 |
---|---|
average | avg |
background | bg |
buffer | buf |
control | ctrl |
current | cur |
default | def |
delete | del |
document | doc |
error | err |
escape | esc |
icon | ic |
increment | inc |
information | info |
initial | init |
image | img |
Internationalization | I18N |
length | len |
library | lib |
message | msg |
password | pwd |
position | pos |
previous | pre |
selector | sel |
server | srv |
string | str |
temporary | tmp |
window | win |
总结
开发规范是一个团队在开发过程中需要达成共识的部分,可以有效的降低项目维护成本和团队成员之间的沟通成本,提高项目代码可读性,其中命名规范是其中比较重要的一部分。
上面所列举的命名规范细则是比较通用的部分,实际开发过程中肯定要掺杂一些个人的开发习惯与偏好,另外还需要根据项目的类型、开发周期、人员配置和项目要求等等做一些调整,可以采用项目负责人主导制,一个项目要有一个主要负责人,这个项目后期大概率由这个人负责开发和维护,那么关于开发规范方面则主要由这个负责人主导。其他人的代码要经过负责人审核,来匹配项目的整体风格。
更多细节部分可参考掘金文章 Android 开发规范