个人认为,模仿编码(别人怎么写我就怎么写)、自主编码(我想怎么写我就怎么写)、规范编码(思考程序应该怎么写),是程序员编码过程中基本都会经历的过程。
前两个没什么好说的,最后一个“规范编码”,大概是程序员进阶所必备技能吧。
毕竟,统一并遵守合理的编码规范,是提高个人开发能力、降低团队沟通协同成本、提升团队开发效率等所不可不做的事情。
本文将对主要适用于 Android 的编码规范进行探讨。
至于同样适用于 Android 的 Java 编码规范,本文不再涉及,建议各位阅读阿里巴巴出品的《码出高效——Java开发手册》一书,其在 Java 编码的规范性及规范的完备性上,大概无出其右了。
大驼峰法:形如 FirstApplicationHelloWorld,包含第一个单词在内,所有单词首字母大写,其他字母小写
小驼峰法:形如 firstApplicationHelloWorld,除了第一个单词首字母外,所有单词首字母大写,其他字母小写
注意:任何命名,都应尽量少用缩写,尤其要避免自定义缩写。
全称 | 缩写 | 描述 |
---|---|---|
icon | ic | app图标 |
background | bg | view及viewgroup 背景 |
buffer | buf | |
delete | del | |
document | doc | |
error | err | |
infomation | info | |
image | img | |
length | len | |
library | lib | |
message | msg | |
password | pwd | |
position | pos | |
string | str | |
temp | tmp | |
—— | —— | —— |
省份标识缩写:
安徽,皖:Anhui,简称AH
北京,京:Beijing,简称BJ
福建,闽:Fujian,简称FJ
甘肃,甘:Gansu,简称GS
广东,粤:Guangdong,简称GD
广西,桂:Guangxi,简称GX
贵州,黔:Guizhou,简称GZ
海南,豫:Hainan,简称HI
河北,冀:Hebei,简称HE
河南,豫:Henan,简称HA
黑龙江,黑:Heilongjiang,简称HL
湖北,鄂:Hubei,简称HB
湖南,湘:Hunan,简称HN
吉林,吉:Jilin,简称JL
江苏,苏:Jiangsu,简称JS
江西,赣:Jiangxi,简称JX
内蒙古自治区,蒙:Inner Mongoria IM 简称NM
宁夏,宁:Ningxia 简称NX
青海,青:Qinghai,简称QH
山东,鲁:Shandong,简称SD
山西,晋:Shanxi,简称SX
陕西,陕:Shaanxi,简称SN
上海,沪:Shanghai,简称SH
四川,川:Sichuan,简称SC
天津,津:Tianjing,简称TJ
西藏,藏:Tibet,简称XZ
新疆,新:Xinjiang,简称XJ
云南,滇:Yunnan,简称YN
浙江,浙:Zhejiang,简称ZJ
重庆,渝:Chongqing,简称CQ
澳门,澳:Macao,简称MO
香港,港:Hongkong ,简称HK
台湾,台:Taiwan,简称TW
几点说明:
1)要观名知义
2)不要怕长
3)避免出现英文与汉语拼音混用的情况(中文绝对不允许)
4)尽量避免使用缩写,除非是约定俗成的缩写形式,若使用缩写,所有字母都要大写,如 DB、HTML 等
任何命名都需遵从上述说明。
重要重要重要!!!
规则:com.drumbeat
.项目名.渠道.分公司名
解释:全部小写,以 . 分割,不允许出现下划线等其他符号,不允许出现个人信息
补充:
1)、applicationId 是应用的唯一性标识,当两个应用的 applicationId 不巧的一致时,将被 Android 系统及 Android 应用市场视为同一应用,故以反写的公司域名作为前缀,是比较有效的能够保证 applicationId 唯一性的做法;
2)、当公司内有多款应用,及同一应用需要分成多个可共存于 Android 系统的分身时,按照上述多层级的规则确定应用的 applicationId 是十分必要的。
示例:
com.drumbeat.supplychain.oppo.zhihe
com.drumbeat.supplychain.oppo.shengyu
com.drumbeat.supplychain.vivo.morocco
1、moduleName
规则:采用小驼峰法,不使用下划线“_” 短横线“-”等符号进行连接
解释:
1)由于 projectName 会标识项目名,所以 module 名仅需要关心项目下细分的渠道、分公司等层级即可;
2)moduleName 会与 module 包结构及 module 内资源前缀相关,一定要规范起来,分好层级
1.1 application moduleName
规则:以 app 开头,后跟渠道、分公司等信息
示例:
appOppoZhihe
1.2 业务 moduleName
规则:以 main 开头,后跟 业务模块标识、渠道、分公司等信息
解释:
1)前期是一个 main 打天下,包含全部业务代码;
示例:main
2)随着项目变大,某些业务模块需要拆分出来;
示例:mainGoods
3)随着公司发展,有了不同渠道不同分公司,业务上会有差别,某些业务代码需要单独列模块进行处理;
示例:
mainGoodsVivo
maiGoodsVivoMorocco
1.3 library moduleName
规则:以 lib 开头,后跟 library 功能标识
示例:
libBase
libFingerprint
2、module 包结构
(重要)
规则:com.drumbeat.项目名.moduleName
解释:
1)全部小写,以 . 分割,不允许出现下划线“_”等其他符号, 不允许出现个人信息
2)由于 moduleName 是采用的小驼峰法,所以可将其中的大写首字母转为小写,并加 . 分割后作为 module 包结构
在 module 包结构(下面以xxx表示)的后面,就是涉及代码的包结构了。
可能大家常见这种形式:
xxx.activity、xxx.fragment、xxx.adapter、xxx.bean、xxx.utils、xxx.view ……
项目小,代码量又小,采用这种方式也未尝不可;但一旦项目变大,代码量变大,页面增多,要找到某一个activity、某一个adapter,就会变得困难。
建议采用下述形式:
规则:xxx.功能模块名.功能模块细分. ~ .className
解释:从功能模块的维度对 class 进行分层细分,便于查找,便于功能模块的独立。
示例:
1)xxx.消息模块.列表模块细分:
xxx.msg.list.MsgListActivity.class
xxx.msg.list.MsgListAdapter.class
2)xxx.消息模块.详情模块细分:
xxx.msg.details.MsgetailsActivity.class
xxx.msg.details.MsgDetailsBean.class
规则:
1)采用大驼峰法
2)业务相关的 ClassName,团队内要统一协调定义
下面是一些常用类型的类的统一前缀或后缀:
类型 | 后缀 | 前缀 | 描述 |
---|---|---|---|
Activity | XxxActivity | ||
Fragment | XxxFragment | ||
Adapter | XxxAdapter | ||
Service | XxxService | ||
BroadcastReceiver | XxxBroadcast | ||
ContentProvider | XxxProvider | ||
实体 | XxxBean | 注意别错用为 XxxPojo、XxxEntity | |
帮助类 | XxxHelper | ||
数据库操作类 | XxxDBHelper | ||
功能类 | XxxUtils | 没有 util 这种形式,utils 不是 util 的复数(util 跑龙套) | |
基础共享类 | BaseXxx | ||
自定义类 | CustomXxx | ||
…… | …… | …… | …… |
规则:
1)采用小驼峰法
2)采用 “谓宾” 结构
3)最好动词开头
示例:
getXxx()
checkXxx()
下面是一些常用的方法形式:
方法 | 说明 | 示例 |
---|---|---|
initXxx() | 初始化相关方法,使用init为前缀标识 | 如 初始化布局,initView() |
isXxx() | 返回值为boolean型的方法 | 如 邮箱格式判断,isEmail() |
onSuccessXxx | 执行成功的回调方法 | 如 获取消息列表的成功回调, onSuccessGetMsgList() |
onFailXxx | 执行失败的回调方法 | |
showXxx() | UI 显示,包括提示、弹窗、UI控件、页面数据加载或者更新等 | 如 警告框,showWarnningDialog();如 加载消息列表,showMsgList() |
hideXxx() | UI 隐藏,包括提示、弹窗、UI控件等 | 如 隐藏取消按钮,hideCancelBtn() |
saveXxx() | 与保存数据相关的方法 | 如 获取消息列表,getMessageList() |
getXxx() | 查询、获取某些数据的方法 | 如 获取消息列表,getMessageList() |
removeXxx() | 移除数据 | 如 从消息列表的数据源中移除某条消息,removeMsgList(int position) |
clearXxx() | 清空数据的 | 如 清除消息列表的数据源,clearMsgList() |
resetXxx() | 重置 | 如 用户点击重置按钮重置搜索提交,resetParams() |
drawXxx() | UI 绘制 | 如绘制圆形 drawCircle() |
measureXxx() | 测量 | |
…… | …… | …… |
通过设置资源前缀的形式,可避免自己的 module 间,或者自己的 module 与 第三方 module 出现资源冲突。
设置方法是在 module 的 gradle 中配置如下代码:
allprojects {
afterEvaluate {
android {
resourcePrefix "${project.name}_"
}
}
}
需要注意的有:
1)此方法对 图片 资源无效(.jpg、.png等),对除 图片 资源外的其他资源,如 layout、strings、colors、styles、drawable(.xml形式)等有效;
2)当资源名没有以设置的资源前缀开头时,编译器会报红警告;
规则:
1)全部小写
2)下划线”_“分割
下面是一些常用的 layout 类型(moduleName以"xxx“表示):
类型 | 规则 | 示例 | 描述 |
---|---|---|---|
activity 布局 | xxx_activity_业务名称 | xxx_activity_login | |
fragment 布局 | xxx_fragment_业务名称 | xxx_fragment_home | |
列表条目布局 | xxx_item_业务名称 | xxx_item_msg | |
布局组成元素布局 | xxx_view_业务名称 | xxx_view_share | 可通过 include 方式引入 |
—— | —— | —— | —— |
规则:
1、采用小驼峰法
2、避免使用下划线”_“ 短横线”-“ 等分隔符
3、UI 控件类型缩写开头,如 btnAdd、tvCancel
4、严禁使用无含义名称,如 tv1、textview1
5、可与所属页面名结合在一起
下表是一些常见类型 UI 控件的 缩写 形式:
全称 | 缩写 |
---|---|
button | btn |
textView | tv |
editText | et |
radioGroup | rg |
radioButton | rb |
checkbox | cb |
imageView | iv |
listView | lv |
recyclerView | rv |
—— | —— |
规则:
1)全部小写
2)下划线”_“分割
3)体现实现的动画效果
4)体现动画的起止状态
下表是几个示例:
动画效果 | 命名示例 |
---|---|
淡入 | xxx_fade_in |
淡出 | xxx_fade_out |
从下方推入 | xxx_push_down_in |
放大/缩小 变形进入 | xxx_zoom_enter |
—— | —— |
规则:
moduleName_pageName_功能
解释:
1)全部小写
2)下划线”_“分割
3)要体现应用的模块、页面等信息,将 moduleName 的大写转为小写并用 ”_“ 分割
示例:
app_oppo_splash_welcome
main_home_title