之前写Demo的时候,因为代码量比较小,对于命名规范没有什么概念,直到我现在完成了这个APP以后我就发现命名规范的重要性,因为APP的代码量和原来的小Demo不是一个级别的,并且APP存在很多问题,我去问学长,学长说我的代码看起来比较费劲,然后学长就希望我能学习一下代码规范,但是因为之前已经完成了一部分了,不好中途修改,到现在的测试阶段我才开始修改项目中的一些命名规范,我在修改的过程中遇到了很多非命名的问题,正好借这个博客总结一下。
(PS:我的项目GitHub地址:戳这里)希望能有大佬能给我一点建议
命名规范
说命名规范之前,先主要说下当前主要的标识符命名法以及英文缩写规则
标识符命名法:
- 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写。
- 帕斯卡(pascal)命名法:又称大驼峰命名法,所有单词的第一个字母大写
- 下划线命名法:单词与单词间用下划线做间隔。
- 匈牙利命名法:广泛应用于微软编程环境中,在以Pascal命名法的变量前附加小写序列说明该变量的类型。 量的取名方式为:
<scope_> + <prefix_> + <qualifier>
范围前缀,类型前缀,限定词。
英文缩写规则:
- 较短的单词可通过去掉“元音”形成缩写
- 较长的单词可取单词的头几个字母形成缩写
- 此外还有一些约定成俗的英文单词缩写
(PS:单词不要用缩写,除非缩写是约定俗成的)
常见英文单词缩写
英文单词 | 缩写 |
---|---|
icon | ic (主要用在app的图标) |
color | cl(主要用于颜色值) |
divider | di(主要用于分隔线,不仅包括Listview中的divider,还包括普通布局中的线) |
selector | sl(主要用于某一view多种状态,不仅包括Listview中的selector,还包括按钮的selector) |
average | avg |
background | Bg(主要用于布局和子布局的背景) |
buffer | buf |
control | ctrl |
delete | del |
document | doc |
error | err |
escape | esc |
increment | inc |
infomation | info |
initial | init |
image | img |
Internationalization | I18N |
length | len |
library | lib |
message | msg |
password | pwd |
position | pos |
server | srv |
string | str |
temp | tmp |
window | wnd(win) |
包名
包(packages): 采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为xx(可以是公司或则个人的随便),三级包名根据应用进行命名,四级包名为模块名或层级名
包类型 | 包名 |
---|---|
自定义view 或者是View接口 | com.xxx.xxx.view |
activity类 | com.xxx.xxx.activities |
fragment类 | com.xxx.xxx.fragments |
适配器相关 | com.xxx.xxx.adapter |
公共工具类 | com.xxx.xxx.utils |
实体类 | com.xxx.xxx.bean |
service服务 | com.xxx.xxx.service |
广播接收器 | com.xxx.xxx.broadcast |
数据库操作类 | com.xxx.xxx.db |
中间对象 | com.xxx.xxx.persenter |
数据处理类 | com.xxx.xxx.model |
类名
类(classes):名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。
类类型 | 类名 |
---|---|
Activity | xxxActivity.java |
Application | xxxApplication.java |
Fragment | xxxFragment.java |
Service | xxxService.java |
BroadcastReceiver | xxxBroReceiver.java |
ContentProvider | xxxProvider.java |
Adapter | xxxAdapter.java |
Handler | xxxHandler.java |
接口 | xxxInter.java |
接口实现类 | xxxImpl.java |
Persenter | xxxPersenter.java |
公共父类 | BaseActivity.java、BaseFragment.java、- BaseAdapter.java等 |
util类 | LogUtil.java |
数据库类 | BaseSQLiteDBHelper.java |
布局文件名
布局文件类型 | 布局文件名 |
---|---|
Activity | activity_xxx.xml(activity+_+去掉后缀的Activity类进行命名) |
fragment | fragment_xxx.xml(fragment+_+去掉后缀的Fragment类进行命名) |
Dialog | dialog_描述 |
PopupWindow命名 | ppw_描述.xml |
列表项命名 | listitem_描述.xml |
包含项命名 | include_模块.xml |
adapter的子布局命名 | 功能模块_item.xml |
资源文件名
资源文件的命名规则主要是下划线命名法,通常第一个单词是作用的控件或者功能的缩写
名称 | 功能 |
---|---|
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_功能_说明 |
变量名/常量名
变量类型 | 变量名 |
---|---|
成员变量 | mFileName(m+大驼峰命名法) |
静态变量 | sInstance(s+大驼峰命名法) |
常量 | TYPE_COURSE |
局部变量 | myName(小驼峰命名法) |
对于控件的命名,很多人是建议采用【控件缩写】+【控件逻辑名称】的方式,但是你也可以使用【控件逻辑名称】+【控件缩写】的方式,下面是控件的缩写
控件 | 布局文件中缩写 | 代码中缩写 |
---|---|---|
LinearLayout | xxx_layout | xxxLLayout |
RelativeLayout | xxx_layout | xxxRLayout |
FrameLayout | xxx_layout | xxxFLayout |
TextView | xxx_tv | xxxTv |
EditText | xxx_et | xxxEt |
Button | xxx_btn | xxxBtn |
ImageView | xxx_iv | xxxIv |
CheckBox | xxx_chk | xxxChk |
RadioButton | xxx_rbtn | xxxRbtn |
ProgressBar | xxx_pbar | xxxPbar |
ListView | xxx_lv | xxxLv |
WebView | xxx_wv | xxxWv |
GridView | xxx_gv | xxxGv |
方法命名
与java开发类似,采用小驼峰命名规则。首单词首字母小写,其余单词首字母大写。尽量不要使用下划线。
方法类型 | 方法名 |
---|---|
initXX() | 初始化相关方法,使用init为前缀标识,如初始化布局initView() |
isXX() | checkXX()方法返回值为boolean型的请使用is或check为前缀标识 |
getXX() | 返回某个值的方法,使用get为前缀标识 |
processXX() | 对数据进行处理的方法,尽量使用process为前缀标识 |
displayXX() | 弹出提示框和提示信息,使用display为前缀标识 |
saveXX() | 与保存数据相关的,使用sav为e前缀标识 |
resetXX() | 对数据重组的,使用reset前缀标识 |
clearXX() | 清除数据相关的 |
removeXXX() | 清除数据相关的 |
drawXXX() | 绘制数据或效果相关的,使用draw前缀标识 |
drawable目录下的命名
类型 | 命名 |
---|---|
按钮图片使用(selector) | btn_xx (btn_整体效果) |
按钮图片使用(平常情况) | btn_xx_normal(btn_效果_normal) |
按钮图片使用(点击情况) | btn_xx_press(btn_效果_press) |
背景图片使用 | bg_xx(bg_功能_说明 ) |
默认图片使用 | def_xx(def_功能_说明 ) |
图标图片使用 | icon_xx (icon_功能_说明) |
具有分隔特征的图片使用 | seg_xx (seg_功能_说明) |
选择图标使用 | sel_xx (sel_功能_说明) |
修改时遇到的麻烦
如果你一开始写app的时候就很注意命名规范的话,就不会遇到这一错误,但是如果是中途开始规范的话,我们需要把命名给Rename。
Android Studio提供了强大的重构功能,可能很多人就会直接进行Rename或者是Shift + F6
注意这样就会照成很多没有必要的修改,比如你选择了字符串匹配替换的话,很多字符串中相同的也会被替换,这样就造成了意义改变了。
所以进行修改就有两种情况
- 要保证全部改名。无论要改名的是变量、字段、方法、类还是包, 这些变量、字段、方法、类、包可能已经在整个程序的多处被引用了,所以要改名必须在所有的地方全部修改,不能遗漏。
- 要做有意义的修改,不能无脑似地见了和要改名的字符串一样的字符串就改。
可能第一种情况全部替换就好了(但是如果有包含一部分的就会把这一段进行替换,可能就会改变意思了,所以最好还是要使用Rename功能),但是第二种情况,我们使用Rename的时候也不能盲目的按Enter
,因为这样的话我们也全部替换了,所以我们要改变一些选项,来改变更改的目标:
当我们按Shift + F6
的时候他会显示出修改提示,你可以选择也可以自己重新修改,如图:
如果现在我们就直接替换的话,就可能把一些不需要替换的给替换了。于是我们再按一遍Shift + F6
,就会看到下面这个界面
下面两个复选框的意思就是:
- 第一个是Sesrch in comments and strings, 意思是在注释和文本字符串里搜索。 如果选择了这个选项,那么所有在注释和文本字符串里出现的sVar都会被包括进来修改。
- 第二个是Search for text occurrences, 意思是在字面意义上的搜索。 这个选项没有什么用,因为 Shift + F6 实际上是一个代码重构的快捷键,不是做文本替换的命令。所以选不选这个选项都不起作用。
所以我们根据我们的需要将复选框进行修改然后再进行替换就好了。