编程规范
更新时间:2024-05-25 12:18:01 阅读量: 综合文库 文档下载
编 程 规 范 1.0
1 环境设置 ..................................................................................................................................... 3 2 代码风格 ..................................................................................................................................... 3
2.1 缩进 .................................................................................................................................. 3 2.2 括号 .................................................................................................................................. 3 2.3 Import ............................................................................................................................... 4 2.4 声明 .................................................................................................................................. 4 2.5 代码度量 .......................................................................................................................... 5
2.5.1 耦合度度量 ........................................................................................................... 5 2.5.2 方法度量 ............................................................................................................... 5 2.5.3 其他度量 ............................................................................................................... 5 2.5.4 使用短函数 ........................................................................................................... 5 2.5.5 局部变量 ............................................................................................................... 6 2.5.6 其他 ....................................................................................................................... 6
3 命名............................................................................................................................................. 6
3.1 包名 .................................................................................................................................. 6 3.2 类名(接口) .................................................................................................................. 6 3.3 成员变量 .......................................................................................................................... 6 3.4 成员函数 .......................................................................................................................... 7 4 异常............................................................................................................................................. 7
4.1 异常处理: 永远不要忽略异常 ....................................................................................... 7 4.2 将Exception丢给该函数的调用者去处理 .................................................................... 7 4.3 Throw一个新的与该函数合适的Exception ................................................................. 7 4.4 仔细处理该Exception..................................................................................................... 7 4.5 抛出RuntimeException ................................................................................................... 8 4.6 注释中解释忽略该异常的合理原因 .............................................................................. 8 4.7 异常处理:不要捕获通用异常(Exception) ................................................................... 8 5 注释............................................................................................................................................. 9
5.1 注释规范 .......................................................................................................................... 9 5.2 注释内容 ........................................................................................................................ 10 6 单元测试 ................................................................................................................................... 11 7 编译........................................................................................................................................... 11 8 一些关乎性能、稳定性和灵活性的原则 ............................................................................... 12
8.1 避免内存泄露 ................................................................................................................ 12
7.1.1 原则1:及时回收Bitmap资源 ........................................................................ 12 7.1.2 原则2:register注册的响应钩子,一定要有unRegister ............................... 12 7.1.3 原则3:使用Adapter时要尽量使用convertView缓存引用 ......................... 12 7.1.4 原则4:从网络下载的数据和保存的临时文件要及时清理 .......................... 13 7.1.5 原则5:内存使用不能超过上限 ...................................................................... 13 7.1.6 原则6:避免使用Finalizer ............................................................................... 13
7.1.7 原则7:使用软应用cache ................................................................................ 13 8.2 避免出现系统超时无响应 (有时也表现为打开/关闭窗口刷新不正常) ............. 14
7.2.1 原则1 .................................................................................................................. 14 7.2.2 原则2 .................................................................................................................. 14 7.2.3 原则3 .................................................................................................................. 15 8.3 使用Http连接需要加入超时时间限制 ....................................................................... 15 8.4 尽量避免使用System.exit(0)的方式来退出应用 ........................................................ 16 8.5 减少使用数据库的次数,避免频繁调用 .................................................................... 16 8.6 ListView使用优化 ........................................................................................................ 16 8.7 Layout使用与优化 ....................................................................................................... 16
7.7.1 原则1 .................................................................................................................. 16 7.7.2 原则2 .................................................................................................................. 16 7.7.3 原则3 .................................................................................................................. 16 7.7.4 原则4 .................................................................................................................. 17
1 环境设置
1、 IDE:开发应用使用Eclipse(Galileo及以上版本) 2、 Java环境:jdk1.6及以上版本 3、 Android环境:Honeycomb及adt 4、 Project环境设置:
a) Code Style: i. tab 宽度为4 space ii. 打开拼写检查 iii. 所有文本(中、英)用utf-8编码 iv. 引用第三方库使用相对路径 v. Qualify all generated field accessed with ?this? vi. Use ?is? prefix for getters that return boolean vii. Add ?@Override? annotation for new overriding methods
b) Error:Windows->Preferences->Java->Compiler->Errors/Warnings中,修改以下
选项: i. Non-static access to static member error ii. Parameter assignment error iii. Null pointer access error iv. Comparing identical values error v. Parameter is never read Warning vi. Missing ?@Override? annotation error
2 代码风格
2.1 缩进
1、对block的缩进, 用4个space void fun() {
do_some_thing(); }
2、对与跨行的代码,第二行的缩进为8个space,如 Instrument i =
someLongExpression(that, wouldNotFit, on, one, line);
2.2 括号
对于if、while、for等语句,无论单行还是多行,一律加括号:
class {
public void fun() { if (condition_0) {
do some thing here; } else {
do some thing here; } } }
2.3 Import
如果你需要从package foo中引入class Bar, 有一下两种方式
1、 import foo.*; 2、 import foo.Bar
一般情况下,请用第2中import方式。另外,import的时候还要遵循以下原则
1、 在每个group(android, java, com.test.leos等)内按字母顺序依次排列. (大写字母
在小写字母之前,如Z排在a之前。 2、 每一个group之间用空行隔开。
2.4 声明
? ?
修饰符应该按照如下顺序排列:public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp。
类与接口的声明顺序(可用Eclipse的source->sort members功能自动排列):
1. 静态成员变量 / Static Fields 2. 静态初始化块 / Static Initializers 3. 成员变量 / Fields 4. 初始化块 / Initializers 5. 构造器 / Constructors
6. 静态成员方法 / Static Methods 7. 成员方法 / Methods
8. 类型(内部类) / Types(Inner Classes) 同等的类型,按public, protected, private的顺序排列。
2.5 代码度量 2.5.1 耦合度度量
1、DAC度量值不要不大于7
解释:DAC(Data Abstraction Coupling)数据抽象耦合度是描述对象之间的耦合度的一种代码度量。DAC度量值表示一个类中有实例化的其它类的个数。
2、CFO度量值不要不大于20
解释:CFO(Class Fan Out)类扇出是描述类之间的耦合度的一种代码度量。CFO度量值表示一个类依赖的其他类的个数。
2.5.2 方法度量
1、 方法(构造器)参数在7个以内。太多的方法(构造器)参数影响代码可读性,还
是不良设计的征兆。考虑用值对象代替这些参数,或者重新设计。
2、 方法长度150行以内。太长的方法影响代码可读性,还是一个方法承担了太多责任
的征兆。建议拆分责任。 3、 CC 度量值不大于10
解释:CC(CyclomaticComplexity)圈复杂度指一个方法的独立路径的数量,可以用一个方法内if,while,do,for,catch,switch,case,?:语句与&&,||操作符的总个数来度量。 4、 NPath度量值不大于200
解释:NPath度量值表示一个方法内可能的执行路径的条数。
2.5.3 其他度量
1、 布尔表达式中的布尔运算符(&&,||)的个数不超过3个。 2、 if语句的嵌套层数3层以内。
3、 文件长度2000行以内。太大的源程序文件影响代码可读性,还是一个类承担了太
多责任的征兆,建议拆分责任到其他类上。
4、 匿名内部类20行以内。太长的匿名内部类影响代码可读性。建议:重构为命名的
(普通)内部类。
2.5.4 使用短函数
一个函数尽量做到集中做某件事。使函数变得短小。如果一个函数超过了40行,应该考虑是否可以拆分。
2.5.5 局部变量
1、 本地变量的访问范围应该尽量维持在最小
2、 本地变量应该尽量在他们首次被应用的地方声明。 3、 所有的本地变量申明时都应该初始化。 4、 循环变量应该在for语句中声明。
2.5.6 其他
1、 当面对不可知的调用者时,方法需要对输入参数进行校验。
2、 隐藏工具类的构造器,确保只有static方法和变量的类不能被构造
3、 变量定义尽量基于接口而不是具体实现类,如Map map = new HashMap() 4、 代码中不能使用System.out.println(),e.printStackTrace(),必须使用logger打印信息。
3 命名
3.1 包名
1、 除了Android的原始文件以外,新增加的文件的package都应该使用以下格:package
com.test.nebula.
2、 所有的package名字都应该用小写,如:package com.test.nebula.push;
3、 在Framework中新增加的api,如果只是内部使用,名字中使用如下格式:package
com.test.leos.internal.
3.2 类名(接口)
1、 类名尽量使用能够明确表达类的用途的单词组合,类名中的每个单词的首字母大
写。
2、 Interface名可以是一个名词或形容词(加上'able','ible', or 'er'后缀),如Runnable,
Accessible。
3.3 成员变量
3、 非public, 非static的成员变量用m开头 4、 非public, static的成员变量用s开头
5、 public, static, final (常量)的成员变量全部大写,并且用单词之间用下划线隔开。其
它的成员变量都用小写单词开头。
3.4 成员函数
1、 成员函数用小写单词开头,如果函数名是单词组合,除第一个单词外,其他单词首
字母都用大写。
2、 局部变量及输入参数不要与类成员变量同名(get/set方法与构造函数除外)。
4 异常
4.1 异常处理: 永远不要忽略异常
编程人员有时候会倾向于用如下这段代码会完全把异常忽略 void setServerPort(String value) { try {
serverPort = Integer.parseInt(value); } catch (NumberFormatException e) { } }
永远不要这样做,你可以选择以下几种替代方案
4.2 将Exception丢给该函数的调用者去处理
如
void setServerPort(String value) throws NumberFormatException { serverPort = Integer.parseInt(value); }
4.3 Throw一个新的与该函数合适的Exception
void setServerPort(String value) throws ConfigurationException { try {
serverPort = Integer.parseInt(value); } catch (NumberFormatException e) {
throw new ConfigurationException(\ } }
4.4 仔细处理该Exception
例如可以设置一个默认值
/** Set port. If value is not a valid number, die. */
void setServerPort(String value) { try {
serverPort = Integer.parseInt(value); } catch (NumberFormatException e) { serverPort = 8080; } }
4.5 抛出RuntimeException
采用这种处理方式需要慎重,只有在你认为如果异常出现,系统就应该崩溃时才这样做。 如
/** Set port. If value is not a valid number, die. */ void setServerPort(String value) { try {
serverPort = Integer.parseInt(value); } catch (NumberFormatException e) {
throw new RuntimeException(\ } }
4.6 注释中解释忽略该异常的合理原因
/** If value is not a valid number, original port number is used. */ void setServerPort(String value) { try {
serverPort = Integer.parseInt(value); } catch (NumberFormatException e) {
// Method is documented to just ignore invalid user input. // serverPort will just be unchanged. } }
4.7 异常处理:不要捕获通用异常(Exception)
有时候因为懒惰,我们倾向于这样处理异常
try { someComplicatedIOFunction(); // may throw IOException
someComplicatedParsingFunction(); // may throw ParsingException someComplicatedSecurityFunction(); // may throw SecurityException // phew, made it all the way
} catch (Exception e) { // I'll just catch all exceptions
handleError(); // with one generic handler!
}
在所有的情况下都不要这样做,你可以选择以下几种替代方案。 1. 在同一个try中捕获所有异常 如
try { someComplicatedIOFunction(); // may throw IOException someComplicatedParsingFunction(); // may throw ParsingException SomeComplicatedSecurityFunction(); // may throw SecurityException // phew, made it all the way
} catch (IOException e) { handleIOError();
} catch (ParsingException e) { handleParseError();
} catch (SecurityException e) { handleSecurityError(); }
2. 调整代码,将代码分成不同的块,一个try处理一个异常. 3. 将异常抛出给调用者。
5 注释
5.1 注释规范
1、 由/*...*/界定。专用于注释已失效的代码。
/*
* Comment out the code * String s = \* System.out.println(s); */
2、 由//界定,专用于注释代码细节,即使有多行注释也仍然使用//,以便与用/**/注释
的失效代码分开。除了私有变量外,不推荐使用行末注释。
class MyClass {
private int myField; // An end-line comment.
public void myMethod {
//a very very long //comment.
if (condition1) { //condition1 comment ... } else {
//elses condition comment
3、 按照Javadoc的注释规范来注释。注释统一用英文,至少包含one sentence。
4、 注释中的第一个句子要以(英文)句号、问号或者感叹号结束。Javadoc生成工具
会将注释中的第一个句子放在方法汇总表和索引中。
5、 为了在JavaDoc和IDE中能快速链接跳转到相关联的类与方法,尽量多的使用@see
xxx.MyClass,@see xx.MyClass#find(String)。 6、 如果注释中有超过一个段落,用
分隔。 7、 示例代码以
包裹。8、 标识(java keyword, class/method/field/argument名,Constants))以包
裹。标识在第一次出现时以(@linkxxx.Myclass)注解以便JavaDoc与IDE中可以链接。
5.2 注释内容
1、 在每个java文件开头,加注释,内容包括author,对本文件功能等的描述。 2、 所有public的类和方法都需要加注释。
3、 类和方法名注释的第一句应该说明类或方法的用途,尽量用谓词短语。 4、 必须在注释中明确说明方法各参数的意义、用途和取值范围。 5、 必须在注释中明确说明方法的返回值的意义和返回值的范围。
6、 注释中的每一个单词都要有其不可缺少的意义,不要出现\name - 名字\
这样的没有实际意义的话。如果该注释是废话,连同标签删掉它,而不是自动生成一堆空的标签,如空的@param name,空的@return。 7、 对于调用复杂的API尽量提供代码示例。 8、 对于已知的Bug需要声明。 9、 Null约定:
a) 如果方法允许Null作为参数,或允许返回值为Null,必须在JavaDoc中说明。 b) 如果没有说明,方法的调用者不允许使用Null作为参数,并认为返回值是Null
Safe的。 /**
* @ return the object to found or null if not found. */
10、 存在错误隐患的代码用 //FIXME: 声明。 11、 代码质量不好但能正常运行,或者还没有实现的代码用 //TODO: 或 //XXX:
声明。 12、 对于关键函数或算法等,加注释说明。
6 单元测试
1、 每个独立模块都要有单元测试。
2、 程序中:Log.i(TAG, \日志信息\;TAG格式=包名.类名 3、 例如:
AndroidManifest.xml文件
说明:第9行中引进单元测试包 第19行和20行中 android:targetPackage的包为第3行中的包 编写单元测试类 继承AndroidCase 测试方法以开头 7 编译 1、 尽量不要出现警告。 2、 对于每个警告,要弄清原因。 8 一些关乎性能、稳定性和灵活性的原则 8.1 避免内存泄露 7.1.1 原则1:及时回收Bitmap资源 对于在代码中创建出来的Bitmap资源,一定要在适当的时候通过Bitmap.recycle()予以销毁,系统不会对通过Bitmap.createBitmap方式创建出来的Bitmap进行回收。合理的时候比如在Activity::onDestroy()中销毁Bitmap. 7.1.1 原则2:register注册的响应钩子,一定要有unRegister 无论何时register注册的响应钩子,一定要有unRegister的时候,否则该引用不能被系统正确回收。 示例: Public void onCreate() { setCallback(mycallback); RegisterReceiver(myReceiver); } Public void onStop() { setCallback(null); unRegisterFilter(myReceiver); } Regiser注册的内容很多,请务必仔细,如contentObserver, Cursor, CallBack函数都是需要清理的对象。 7.1.1 原则3:使用Adapter时要尽量使用convertView缓存 引用 在使用Adapter的时候,要尽量使用convertView缓存引用,以便节省内存空间。 示例: View Adapter::getView(View converView , int pos) { View v ; if(convertView != null) //如果converView存在,那么使用converView来作为创建出的View引用。 v = convertView; else //如果convertView不存在,则创建新的View引用。 v = makeNewView(); v.setData();//给View引用设置数据 return v; } 7.1.1 原则4:从网络下载的数据和保存的临时文件要及时清 理 7.1.1 原则5:内存使用不能超过上限 系统中,除特殊应用外,其他所有应用都应有内存上限(待定),超过这个上限应用程序就会崩溃,在设计UI和编写代码的时候应该警惕内存使用,尤其是图片加载。 7.1.1 原则6:避免使用Finalizer Finalizer是object在被垃圾回收时执行的一段代码,用finalizer的好处是可以在一段代码里释放不需要的资源,但建议不要用finalizer。因为不能保证什么时候会调用finalize的代码,甚至不能保证是否会调用finalizer的代码。 7.1.1 原则7:使用软应用cache private final HashMap mCache.put(key, new SoftReference public T get(String key, ValueBuilder builder) { T value = null; SoftReference value = reference.get(); } // Not in cache or gc'd if (value == null) { value = builder.build(key); mCache.put(key, new SoftReference return value; } 8.2 避免出现系统超时无响应 (有时也表现为打开/关闭窗 口刷新不正常) 在使用过程中,我们有时候会遇到界面无响应,弹出对话框询问是关闭进程还是继续等待,发生该异常的原因是应用主线程在某处阻塞,导致新的系统消息(如广播Intent, Key事件, Touch事件)不能正常处理,系统端迟迟收不到应用返回的消息已处理事件,从而判定应用无响应,弹出提示对话框。同时,长时间的阻塞主线程可能会导致WindowManagerService不能正确处理窗口切换刷新,引起打开/关闭Activity时出现刷新不正常。 发生异常时常见的Log有: Activitiy Idle timeout … Activity Launch timeout Service execute timeout Key dispatch timeout Broadcast Receiver Intent *** timeout 避免这个问题有以下几个原则。 7.2.1 原则1 需要时间很长的操作,须要单独启动新的线程执行。 例如: 搜索网络,Wifi 网络访问 加载/卸载Sd卡 大量读写数据库 读写较大文件(比如大尺寸的图片) 通常与底层数据读取相关的函数需要重点关注。 启动新线程要使用Thread.start()函数,而不是用Thread.run()函数。使用线程一定要注意synchronized同步以及资源回收。 7.2.1 原则2 对于结构不易另外开新线程的代码, 或者调用Binder与其它能够联系的代码 , 应该尽量避免在系统回调函数中直接运行,要通过sendMessage来异步调用,这样可以保证系统能够及时从应用获得消息处理完毕的事件。 例如: startActivity() 打开Activity startService() 打开Service sendBroadcast() 发Intent广播 showDialog() 显示对话框 耗时长的事件可能较多,需要实际分析,比如获取当前网络,硬件,等底层状态都可能会导致阻塞 需要避免出现代码示例: Public void onCreate() { sendBroadcast(Intent); } 在onCreate回调函数中发送广播以及显示对话框,有可能会造成系统端阻塞 正确示例: Public int _MSG = 0; Public Handler myHandler = new Handler( Public void handleMessage(Message msg) { Switch(msg.what) { Case _MSG: sendBroadCast(myintent); break; } } }; Public void onCreate() { myHandler.sendMessage(myHandler.obtainMessage(_MSG)); } 通过发送Message的方式来异步调用。 请注意: 发送Message只是将要执行的操作放到onCreate()回调函数之外去操作,并不是启动新线程进行,如果需要时间过长,同样可能引发阻塞。 7.2.1 原则3 某些代码调用应该坚持少访问数据库,少读取文件,少访问网络的设计原则 例如: Settings.System.getInt() 操作会读取数据库 ,可以通过使用变量或者System.Properties的方式来替代。 8.3 使用Http连接需要加入超时时间限制 示例: HttpUrlConnection mHttpConnection = url; mHttpConnection.setConnectTimeout( 5000 ); 8.4 尽量避免使用System.exit(0)的方式来退出应用 尽量避免使用System.exit(0)的方式来退出应用,尤其需要注意当有其它并发线程的时候,System.exit(0)可能会带来一系列风险。 使用System.exit(0) . Process.killProcess会直接杀掉当前进程,而android中默认是不会关闭进程的,在杀掉当前进程的时候需要考虑并发线程的状态,例如如果并发线程当前正在读取文件,操作数据库,跨进程访问,这时关闭进程就会导致一系列问题甚至引起系统崩溃。 8.5 减少使用数据库的次数,避免频繁调用 8.6 ListView使用优化 a. 避免在不同线程中同时刷新数据 或是改变Adapter内容,或者改变Cursor内容的情况, 在需要并发刷新的时候要用synchronized来同步,这样可以避免出现ListView崩溃。 b. 使用convertView来减小内存开销 c. 减少Adapter改变次数,每次Adapter都会带来ListView的重新刷新。 8.7 Layout使用与优化 7.7.1 原则1 将通用的部分封装为可重用组件或自定义View。在其他布局中使用include或merge调用。将逻辑部分放在代码中,布局部分放在xml文件中。 7.7.1 原则2 将通用、统一变换的布局或风格属性独立出来,放在layout.xml或styles.xml中。 7.7.1 原则3 1、减少layout的层数。比如 应该用 2、对于“layout_width = “fill_parent” , layout_height = ”fill_parent””的布局,应该去掉。 3、布局文件中root标签为RelativeLayout,应用merge标签替换。 7.7.1 原则4 对于手动inflate、在运行时加载的View,考虑在布局中使用ViewStub代替View。
正在阅读:
编程规范05-25
陆游咏梅词赏析02-28
《习近平新时代中国特色社会主义思想学习纲要》心得体会范文09-07
现场安全告知书(动力车间)12-01
社会实践报告03-31
《皇帝的新装》课本剧剧本02-20
土木工程专业英语词汇(整理版)04-27
草把做灯的歇后语02-07
党支部党员一对一谈心谈话记录3篇07-31
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 规范
- 编程
- 2014年甘肃公务员考试行测练习题(12)
- 压力容器的焊接工艺设计
- 1998年香港金融保卫战回眸
- 西南交大考研试题(信号与系统)
- 随州市广水市2016届中考数学模拟试卷含答案解析
- 自考00151企业经营战略课堂笔记概要
- 2016年农业循环经济项目可行性研究报告
- 气缸端盖压铸模设计
- 济南大学人文社会科学期刊分类目录
- 一年级安全教育教学计划及教案 2010
- 中国专利奖申报书
- 液相色谱(面积归一法)检验原始记录
- 广西师范学院师园学院学士学位授予办法
- 河北科技大学 辅修专业招生计划表
- 低压电器元件思考题与练习题汇总
- 单片机原理及精华总结
- 《材料力学》附录I++截面的几何性质+习题解
- 鲁价费发(2001)243号0分 关于建设工程交易中心服务费收费标准的
- 3-财务报表附注-上市公司(2013年12月修订)
- 肿瘤随访登记技术方案