Szhangbiao's blog

记录一些让自己可以回忆的东西

0%

Android开发过程中的命名规范

最近在组内分享一些提升组员开发能力的文章,起因是去年我刚加入公司时重做了一款内部自研的项目,正好这个项目最近也接近尾声,领导希望我参照新旧项目的对比,把我在重构过程中运用的一些实用开发技能给分享出来,来帮助其他开发人员提升开发能力,命名规范是其中比较基础且重要的部分,下面就做一些简单的总结。

前言

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. 常量
  2. 字段
  3. 构造函数
  4. 重写函数和回调
  5. 公有函数
  6. 私有函数
  7. 内部类或接口

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends Activity {

private static final String TAG = MainActivity.class.getSimpleName();

private String mTitle;
private TextView mTvTitle;// 或者tvTitle

@Override
public void onCreate() {
...
}

public void setTitle(String title) {
mTitle = title;
}

private void setUpView() {
...
}

static class AnInnerClass {

}
}

如果类继承于 Android 组件(例如 Activity 或 Fragment),那么把重写函数按照他们的生命周期进行排序是一个非常好的习惯,例如,Activity 实现了 onCreate()、onDestroy()、onPause()、onResume(),它的正确排序如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends Activity {
//Order matches Activity lifecycle
@Override
public void onCreate() {}

@Override
public void onResume() {}

@Override
public void onPause() {}

@Override
public void onDestroy() {}
}

资源命名

类别 具体规则 举例说明
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 开发规范