Android代码规范,降低bug率

写在开头:本文的灵感来自loading大神的文章
http://www.androidchina.net/6552.html

diygreen大神的文章
http://www.jianshu.com/p/0a984f999592#

集众家之所长,哈哈。

首先谈谈代码规范的重要性:团队中每个人阅读代码都很容易,减少很多沟通,维护成本( 代码阅读的次数远远大于变更的次数),并且心情非常愉悦。有人肯定觉得愉悦有点夸张,举个栗子: 有一些代码,如果不是由于与工作内容有关联,你是否有种这辈子都不情愿去接触它的感受。但也有一些代码,阅读下来一气呵成,心情舒畅,促使你有种继续阅读下去的冲动(并且你也会有种不想破坏这种统一的想法).

基础层面越统一,效率越高(不仅仅是指统一编码规范,还有基本的做事的原则). 举个栗子: 我们团队规定个人周报必须在每周五上班前必须发出来,否则罚款10元。之前团队周报迟发现象比较突出,规则一出,明显改善(开会缺席情况也一样得到明显改 善)。罚钱是否不太合理?注释写多少才算合理?与其花大量精力讨论这些不痛不痒的问题,不如及时统一规范(一般制定的规范不会差的),严格执行。后续针对 问题即使做调整。关键是统一和严格执行。

1.能1行解决就不要写2行(不影响可读性的情况下)。

2.多余的代码(比如注释代码 or 无实际意义)必须删除。

3.codereview代码评审。
codereview出来的问题一旦得出结论,就会立马执行。如果有疑义,可以继续讨论,一直到得出结论为止。规范中的内容可以改进,但一旦形成规范就必须严格执行。

4.单元测试一定要写, 这是底线(除非这个成本非常大)

5.周四尽量减少发布, 你可能没有足够时间去观察/验证,发布时尤其需要重视.

6.每周五 review当周的问题

7.接下来写具体的代码开发规范.


一、变量声明、注释等规范
1.类名区分大小写。

2.使用注释将源文件分为明显的区块,区块划分如下

常量声明区
UI控件成员变量声明区
普通成员变量声明区
内部接口声明区
初始化相关方法区
事件响应方法区
普通逻辑方法区
重载的逻辑方法区
发起异步任务方法区
异步任务回调方法区
生命周期回调方法区(出去onCreate()方法)
内部类声明区

3.类成员排列通用规则

按照发生的先后顺序排列
常量按照使用先后排列
UI控件成员变量按照layout文件中的先后顺序排列
普通成员变量按照使用的先后顺序排列
方法基本上都按照调用的先后顺序在各自区块中排列
相关功能作为小区块放在一起(或者封装掉)

4.重载方法不分离。当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法。

5.声名数组等变量
中括号是类型的一部分:String[] args, 而非 String args[]。

6.switch块必须包括default,即使什么处理都不做

switch (msg.what) {
               case 1:
                   //doSomething
                   break;
               case 2:
                  //doSomething
                   break;  
               default:
                   break;
           }

7.代码注释,成员变量、类对象、layout对象、方法等统一采用以下样式

/**
 * 
 */

方法内部的每一行的代码注释用一下样式:

//代码行的注释

二、命名规范
1.包名
采用反域名规则,一级包名为com,二级包名为公司名或者个人名,三级包名为项目名,四级包名为具体模块名(也可以省略二级包名),举个栗子:com.ssb.shangshaban.activity
2.类名
采用大驼峰法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写,举个栗子:

WelcomeActivity.java
LogUtil.java
MyDBHelper.java

3.方法名
采用小驼峰法,方法名一般都是动词或者动词短语,举个栗子:

initData()
getUserData()
save()

4.常量名
全部字母大写,用下划线分隔单词,常量通常是static final的,举个栗子:

static final int NUMBER = 5;
static final ImmutableListNAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

5.非常量字段名(略微复杂),直接举个栗子:

public class MyClass {  
        public static final int SOME_CONSTANT = 42;  //常量大写
        public int pField;  //公有非静态字段p开头
        private static MyClass sSingleton;  //非公有静态字段s开头
        public static int gField; //公有静态字段g开头
        int mPackagePrivate;  //非公有非静态m开头
        private int mPrivate;  //非公有非静态m开头
        protected int mProtected; //非公有非静态m开头
        
 }

也有例外,如果项目中使用ButterKnife,则不添加m前缀,以小驼峰风格命名。

例如,请使用 mCustomerStrFirst 和 mCustomerStrLast,而不要使用mFirstCustomerStr和mLastCustomerStr。
量词列表:量词后缀说明
First 一组变量中的第一个
Last 一组变量中的最后一个
Next 一组变量中的下一个变量
Prev 一组变量中的上一个
Cur 一组变量中的当前变量。


6.参数名
采用小驼峰法

7.资源文件命名
7.1资源布局文件:
全部小写,采用下划线命名法

  1. contentview 命名
    必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。
    所有Activity或Fragment的contentView必须与其类名对应,对应规则为:
    将所有字母都转为小写,将类型和功能调换(也就是后缀变前缀)。
例如:activity_main.xml
  1. Dialog命名:dialog_描述.xml
例如:dialog_hint.xml
  1. PopupWindow命名:ppw_描述.xml
例如:ppw_info.xml
  1. 列表项命名:item_描述.xml
例如:item_city.xml
  1. 包含项命名:模块_(位置)描述.xml
例如:activity_main_head.xml、activity_main_bottom.xml

注意:通用的包含项命名采用:项目名称缩写_描述.xml

例如:xxxx_title.xml

7.2资源文件
全部小写,采用下划线命名法,加前缀区分
命名模式:可加后缀 small 表示小图, big 表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:
用途
模块名
逻辑名称
用途模块名颜色
用途逻辑名称
用途
颜色
说明:用途也指控件类型(具体见UI控件缩写表)
例如:
btn_main_home.png 按键
divider_maket_white.png 分割线
ic_edit.png 图标
bg_main.png 背景
btn_red.png 红色按键
btn_red_big.png 红色大按键
ic_head_small.png 小头像
bg_input.png 输入框背景
divider_white.png 白色分割线
如果有多种形态如按钮等除外如 btn_xx.xml(selector)

名称 功能
btn_xx 按钮图片使用btn_整体效果(selector)
btn_xx_normal 按钮图片使用btn_正常情况效果
btn_xx_pressed 按钮图片使用btn_点击时候效果
btn_xx_focused state_focused聚焦效果
btn_xx_disabled state_enabled (false)不可用效果
btn_xx_checked state_checked选中效果
btn_xx_selected state_selected选中效果
btn_xx_hovered state_hovered悬停效果
btn_xx_checkable state_checkable可选效果
btn_xx_activated state_activated激活的
btn_xx_windowfocused state_window_focused
bg_head 背景图片使用bg_功能说明
def_search_cell 默认图片使用def
功能说明
ic_more_help 图标图片使用ic
功能说明
seg_list_line 具有分隔特征的图片使用seg
功能说明
sel_ok 选择图标使用sel
功能_说明
注意:
使用AndroidStudio的插件SelectorChapek可以快速生成selector,前提是命名要规范。

7.3动画文件(anim文件夹下):

  1. 动画文件(anim文件夹下):
    全部小写,采用下划线命名法,加前缀区分。
    具体动画采用以下规则:
    模块名_逻辑名称
    逻辑名称
    refresh_progress.xml
    market_cart_add.xml
    market_cart_remove.xml
    普通的tween动画采用如下表格中的命名方式
    // 前面为动画的类型,后面为方向

动画命名例子 规范写法
fade_in 淡入
fade_out 淡出
push_down_in 从下方推入
push_down_out 从下方推出
push_left 推向左方
slide_in_from_top 从头部滑动进入
zoom_enter 变形进入
slide_in 滑动进入
shrink_to_middle 中间缩小

7.4values中name命名
类别 命名 示例
strings strings的name命名使用下划线命名法,采用以下规则:
模块名+逻辑名称

main_menu_about 主菜单按键文字
friend_title 好友模块标题栏

friend_dialog_del 好友删除提示

login_check_email 登录验证

dialog_title 弹出框标题

button_ok 确认键 loading 加载文字

colors colors的name命名使用下划线命名法,采用以下规则:
模块名+逻辑名称 颜色

friend_info_bg friend_bg transparent gray
styles styles的name命名使用 Camel命名法,采用以下规则:模块名+逻辑名称 main_tabBottom
7.5layout中的id命名
命名模式为:view缩写_view的逻辑名称
使用 AndroidStudio 的插件 ButterKnife Zelezny,生成注解非常方便。
如果不使用 ButterKnife Zelezny,则建议使用 view 缩写做后缀,如:username_tv(展示用户名的TextView)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 文章来自https://github.com/Blankj/AndroidStandardDevelop#安卓开发...
    小庄bb阅读 702评论 0 1
  • Android编码规范 源文件基础 文件名 源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java。 文...
    呼呼哥阅读 874评论 0 0
  • Android 编码规范 1. 前言 这份文档是 Google Java Code Style 的译文,并稍有添加...
    人失忆阅读 423评论 0 3
  • 作者:李旺成 时间:2016年4月3日 1. 前言 这份文档参考了 Google Java 编程风格规范和 Goo...
    diygreen阅读 39,656评论 19 224
  • written by leo.wang Android代码开发规范 1 类声明 1.1 只有一个顶级 类声明每个顶...
    Poseidon_Wang阅读 608评论 0 0