Android编程规范
来源:互联网 发布:精简版apk软件 编辑:程序博客网 时间:2024/05/22 18:27
命名规范
1. 基本原则
(1) 代码风格与android源码保持一致
(2) 命名要清晰明了、有明确含义
(3) 同一产品命名风格要保持一致,避免一意多词
(4) 同一作用域,不能有变量重名,如局部变量与全局变量重名
2. 包名
(1) package命名如com.brian.xx.yy.zz,xx为产品,yy为模块,zz为子模块
(2) 模块划分,按以下两种方式均可,但需要项目组统一
- 按产品业务划分,如 com.brian.example.homepage
和com.brian.example.player
- 按逻辑功能划分,如 com.brian.example.homepage.ui
和com.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) // BADif ((a == b) && (c == d))// GOOD
(2) 条件语句,独自占一行,执行语句不得紧跟其他
// BADif (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)废弃的代码及时清理
其他参考
《Android Code Style》
https://source.android.com/source/code-style.html《Java Programming Style Guidelines》
http://geosoft.no/development/javastyle.html《Google Java Style》
https://google.github.io/styleguide/javaguide.html
- Android 编程规范
- Android 编程规范
- Android 编程规范
- Android编程编码规范
- android 编程代码规范
- Android 编程规范
- Android 编程规范(转)
- Android 编程规范
- Android 编程规范(转)
- Android 编程规范(转)
- Android 优化 编程 规范
- 总结 android编程规范
- Android编程规范
- Android 编程规范
- Android 编程规范指南
- Android-编程规范
- Android 编程规范
- android 编程规范
- Java语言基础
- 日期简单操作
- SSH登录卡慢的问题
- 腾讯的sparkgraph应用
- Android项目开发之头像上传
- Android编程规范
- <转载>C++各数据类型最大最小值
- 文章标题
- poj 3259 负权回路+Bellman
- 【数据结构】STL——set容器
- 两张链表查询 涉及多个字段查询
- Java后台开发<二>:Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建
- 前端资源教程汇聚
- 微信小程序开发之画布canvas 饼状图