Android编程规范

命名规范

1. 基本原则

(1) 代码风格与android源码保持一致
(2) 命名要清晰明了、有明确含义
(3) 同一产品命名风格要保持一致,避免一意多词
(4) 同一作用域,不能有变量重名,如局部变量与全局变量重名

2. 包名

(1) package命名如com.brian.xx.yy.zz,xx为产品,yy为模块,zz为子模块
(2) 模块划分,按以下两种方式均可,但需要项目组统一

  • 按产品业务划分,如
    com.brian.example.homepagecom.brian.example.player
  • 按逻辑功能划分,如
    com.brian.example.homepage.uicom.brian.example.homepage.logic

3. 类成员命名,参考android源码,如android.content.pm.PackageManager

(1) 类:public abstract class PackageManager
(2) 函数:public abstract PackageInfogetPackageInfo(String packageName)
(3) 常量:public static final int GET_ACTIVITIES= 0x00000001;
(4) 静态变量:static ComponentName sComponent;
(5) 成员变量:ComponentName mComponent;
(6) 临时变量:ComponentName component;

4. 对于简单的内部类,或则DTO(数据传输对象),成员变量名称可以不带前缀m

public final class Message implements Parcelable {
    /**
     * User-defined message code so that the recipient can identify 
     * what this message is about. Each {@link Handler} has its own name-space
     * for message codes, so you do not need to worry about yours conflicting
     * with other handlers.
     */
    public int what;

    /**
     * arg1 and arg2 are lower-cost alternatives to using
     * {@link #setData(Bundle) setData()} if you only need to store a
     * few integer values.
     */
    public int arg1;

    /**
     * arg1 and arg2 are lower-cost alternatives to using
     * {@link #setData(Bundle) setData()} if you only need to store a
     * few integer values.
     */
    public int arg2;
}

5. 接口命名,参考android源码,如android.view.View.OnClickListener

    /**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

6. 资源命名

(1) 文件名(字母小写和下划线组成)

  • activity_main.xml
  • ic_launcher.png

(2) 资源名id(字母小写和下划线组成)

  • android:id="@+layout/loading_view"
  • <string name="app_name">应用名称</string>

代码排版

1. 文字编码

(1) 统一使用utf8编码

2. 缩进对齐

(1) 代码缩进采用4个空格
(2) 代码行首,合理缩进,以简洁明了为原则

3. 空格

(1) 条件语句,关键字与“(”用空格隔开,如 if (xx)、while (i > 3)
(2) 注释内容,左右用空格隔开,如 // xxx,/* xxx */
(3) 比较操作符、赋值操作符、算术操作符、逻辑操作符、位操作符,等双目操作符的前后加空格

    if ( (a >= b) && (c <= d) )
    if (size >= MAX_SIZE)
    a = b + c;
    a *= 2;
    a = b ^ 2;

(4) "!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格

*p = 'a';
flag = !isEmpty;
p = &mem;
i++;

(5) 逗号、分号(非行结束符号)在后面加空格,前面不加空格

int x = 1, y = 2, z = 3;
function(x, y, z);
for (inti = 0; i < 10; i++)

4. 条件语句(if、for、while、do)

(1) 条件语句,使用完备的括号

if (a == b && c == d) // BAD
if ((a == b) && (c == d))// GOOD

(2) 条件语句,独自占一行,执行语句不得紧跟其他

    // BAD
if (flag) doSomething();

    // GOOD
    if (flag) {
        doSomething();
    }

(3) 条件语句,不论语执行句有多少行都要加“{}”

    // BAD
    for (inti = 0; i < 10; i++)
        doSomething();

    // GOOD
    for (inti = 0; i < 10; i++) {
        doSomething();
    }

5. 代码结构

(1) 一行只写一条语句

    // BAD
    x = a + b; y = c + d; z = e + f;

    // GOOD
    x = a + b;
    y = c + d;
    z = e + f;

(2) 代码以“段”来编写,作用相近的代码写在一段,段与段间以空行分开,注释也相应以“段”来注释,如

    public void filterData(Data in, Data out) {

        // 预处理
        clip(in.a + 100);
        clip(in.b + 200);
        clip(in.c + 300);

        // 滤波
        intavg  = (in.a + in.b + in.c) / 3;
        int tmp1 = in.a + avg;
        int tmp2 = in.b - avg;
        int tmp3 = in.c + tmp1 + tmp2;

        // 保存结果
        out.a = tmp1;
        out.b = tmp2;
        out.c = tmp3;
    }

(3) 代码文件中从上到下,函数依次按照调度、被调度的顺序出现,例如

    public void funA() {
        funB();
        ...
    }

    public void funB() {
        ...
    }

代码注释

1. 基本原则

(1) 注释语言必须准确、简洁、易懂,能直接反映编程思路
(2) 统一使用中文作为注释语言,除非直接拷贝第三方的英语注释
(3) 注释比例没有严格的要求,建议不低于15%
(4) 注释要与代码保持一致,代码作用变了,注释也要更新
(5) 对于逻辑复杂、使用有限制的代码,需要重点注释

2. 必须注释

(1) 文件
(2) 类
(3) 函数(对外接口public函数)
(4) 常量
(5) 成员变量(有特殊含义)
(6) 静态变量
(7) 特殊逻辑、定制逻辑、有坑逻辑、临时逻辑

3. 建议注释

(1) 复杂的逻辑
(2) 重要的分支,如 if-else,switch-case
(3) 重要的循环,说明,“每次循环遍历…”

4. 注释样式

(1) 注释样式参考android源码
(2) 代码以“段”来编写,注释也相应以“段”来注释

    /**
    * 函数注释
    */
    public void foo() {
    }

    /**
     * 函数注释
     * @param a
     * @param b
     * @return
     */
    public int math(int a, int b) {
    }

    /**
    * 成员变量注释
    */
    public int mValue;

    // 一段代码注释
    xxx
    xxx
    xxx

    xxx
    xxx // 一行代码注释
    xxx

    // if分支注释(1)
    if (true) {
    }
    // else分支注释(1)
    else {
    }

    if (true) { // if分支注释(2)
    }
    else { // else分支注释(2)
    }

    // switch注释
    switch (xxx) {
        // case注释(1)
        case xxx : break;
        case xxx : // case注释(2)
            break;
        default: break;
    }

模块设计

1. 基本原则

(1) 开放封闭
(2) 单一职责
(3) 倒置依赖
(4) 高内聚低耦合

2. 分层设计

原则上,程序实现业务功能时,按MVC模式,从上至下进行分层设计
(1) 应用层:负责UI展示、下发操作指令
(2) 服务层:负责控制逻辑、数据维护
(3) 数据层:负责底层数据获取,包括网络、数据库、文件、底层算法

3. 模块交互

(1) 原则上,下层功能代码不能import上层业务的package,如下层操作数据库的类不能import上层UI的activity
(2) 上层模块调度下层模块,通过下层public接口函数
(3) 下层模块回调上层模块,通过interface执行回调(不用handler)
(4) 广播或则单播监听事件,同时具有attach和detach操作
(5) 非特殊情况,调度与回调默认在UI线程执行
(6) 非特殊情况,获取对象的变量统一使用getter、setter操作

4. 代码分离

(1) 分开:界面代码、数据代码
(2) 分开:业务相关代码、底层通用模块代码
(3) 分开:基本模块、特殊定制模块

函数设计

1. 基本原则

(1) 一个函数只做一件事
(2) 按抽象层划分函数
(3) 向下调度原则
(4) 高扇入低扇出

2. 其他建议

(1) 代码以“段”编写,合理分隔不相关的代码段
(2) 禁止代码中实现与函数名不相关的逻辑
(3) 禁止代码中出现魔鬼数字
(4) 避免多处出现雷同的代码,应提取公共的功能函数,或则调整调度入口
(5) 避免嵌套逻辑太深,超过3~5层,建议优化
(6) 避免复杂的复合判断条件,建议分拆
(7) 避免山寨临时逻辑
(8) 函数的参数超过5个,则使用参数对象封装参数,有助于扩展接口
(9) 降低临时变量的生命周期
(10)废弃的代码及时清理

其他参考

  1. 《Android Code Style》
    https://source.android.com/source/code-style.html

  2. 《Java Programming Style Guidelines》
    http://geosoft.no/development/javastyle.html

  3. 《Google Java Style》
    https://google.github.io/styleguide/javaguide.html

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,369评论 25 707
  • 参考资料:我总结的Android编程规范 1. 命名规则 1.1 类名,接口名: 以大写开头,如果一个类的类名由多...
    Coder_Y阅读 2,785评论 12 60
  • 前言 通过建立代码编写规范,形成Android编码约定,提高程序的可靠性、可读性、可修改性、可维护性、一致性,保证...
    yabin小站阅读 1,168评论 1 13
  • 架构&分包 -- 原则 包名应让人一目知意:英文命名描述其功能。 分包层次应尽可能的低,减短包名长度。 Model...
    zhazhaxin阅读 1,734评论 3 48
  • 今早去杨老师哪儿拿之前落下她哪儿的资料,遇见了之前因为出国项目认识的一个姑娘,我俩一样的都是签证几次都没过,但还是...
    Miss邱阅读 274评论 0 1