以下的相关内容是每一个的程序员必须要注意的,养成好的编码规范对于开发人员非常重要,有规范的编码会使开发者思维清晰,逻辑有条理,别人能看得懂,这也是一个不断总结、积累和学习的过程,具体标准的编码规范我们要多学习国外优秀开发者的代码,希望下面的内容对我们有帮助。
编码规范对于程序员来说非常非常重要,有以下几个原因:
1、软件生命周期中,80%的时间花费在于维护。
2、所有的软件开发都是在不断的重构和修改,这就需要我们有一个通用的可读的规范。
3、编码规范可以改善软件的可读性,可以让开发和维护的程序员尽快彻底的理解前任的代码。
4、如果源码作为产品发布,需要确认它是很好的打包并且是清晰无误的,提供其他人可阅读的产品文档。
二、注释/JavaDoc
1.顶部版权声明
2.包和引入块(每一块以空白行分隔)
3.类或接口的声明。在Javadoc注释,描述的类或接口的用途。
文件注释例子:
/**
*文件名
*包含类名列表
*版本信息,版本号
*创建日期
*版本声明
**/
类注释例子
每个类都要包含格式的注释,以说明当前类得功能等。
/**
*类名
* @author 作者<br/>
*实现的主要功能
*创建日期
*修改者,修改日期,修改内容
**/
类/接口注释的内容(1项要求写上)
类、接口的文档注释包含如下信息:
1.用途。开发人员使用某个类/接口之前,需要知道采用该类/接口的用途。
2.如何使用。开发人员需要知道该类/接口应该如何使用,如果必要的话还需要注明不应
该如何使用。
3.开发维护的日志。一个有关于该类/接口的维护记录:时间、作者、摘要(可用中文)。
方法注释的内容(1,5,6,7项要求写上)
1.类该方法是做什么的。
2.该方法如何工作。
3.代码修改历史纪录。
4.方法调用代码示范。
5.必须传入什么样的参数给这个方法。@param
6.异常处理。@throws
7.这个方法返回什么。@return
三、局部变量应该推迟至使用前声明并初始化,能用局部变量就不要用全局的
四、在Imports使用通配符的优劣
五、域(Field)命名
* 非公有,非静态字段命名以m开头。
* 静态域命名以s开头。
* 其他字段以小写字母开头。
* public static final 字段(常量) 全部大写,并用下划线连起来。
1. public class FDSupplierManagermentFragment extrend Fragment {
2. public static final int SOME_CONSTANT = 42;
3. public int publicField;
4. private static MyClass sSingleton;
5. int mPackagePrivate;
6. private int mPrivate;
7. protected int mProtected;
8. }
六、花括号没有独自一行,它们与它前面的代码占同一行,这个很重要。
七、命名规则
1. 包小写。
com.wondersgroup.fdsuperapp.view
com.wondersgroup.fdsuperapp.mode.supplier
2. 类 大小写字母混合组成,头字母大写。在同一项目或功能模块的类命名采用符合本项目或功能有意义的大写字母,如下面的FD代表的是“食品安全”项目
class FDSupplierManagermentFragment
class FDImageSprite;
3. 接口大小写字母混合组成,头字母大写,常以"able"、"ible"结尾。
interface RasterDelegate;
interface Runnable;
interface Accessible;
4. 方法大小写字母混合组成,第一个单词的首字母小写,其后单词的首字母大写。
5. 变量、参数小写,不推荐使用下划线,简短明晰。(方法、变量、参数一般采用驼峰写法,全英文单字拼写,最好不要简写,简单易懂,不允许出现无意义的单词)
StringsupplierManagermentAdapter;
6. 集合、数组应该从命名中体现其复数的含义,例如加后缀s或list,前缀some
7. 在定义类时,应该按照访问权限的大小分别排列属性和方法。同一权限属性放一起,每个属性一般不要连写,单独定义。
如:public String name,sex,password,description;(不建议)
1. public
2. protected
3. 包级别(没有访问修饰符的,默认为friendly)
4. private
8. layout中的id命名命名模式为:view缩写_模块名称_view的逻辑名称view的缩写,自定义的id一定要是全局唯一的。
9. activity中的view变量命名命名模式为:逻辑名称+view缩写建议:如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view
10. strings.xml中的id命名命名模式:activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称/common_逻辑名称strings.xml中,使用activity名称注释,将文件内容区分开来
11. styles.xml:将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中
12. 图片尽量分拆成多个可重用的图片,图片千万不用重复,通用的图片用通用命名。
13. 服务端可以实现的,就不要放在客户端。
14. 引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大。
15. Log(系统名称模块名称接口名称,详细描述)。
16. 不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突。
17. activity中在一个View.OnClickListener中处理所有的逻辑。
18. 如果多个Activity中包含共同的UI处理,那么可以提炼一个CommonActivity,把通用部分叫由它来处理,其他activity只要继承它即可。
19. 如果所开发的为通用组件,为避免冲突,将drawable/layout/menu/values目录下的文件名增加前缀。
20. 数据一定要效验,例如字符型转数字型,如果转换失败一定要有缺省值;服务端响应数据是否有效判断;特别是解析Json格式时。
21. 使用线程池,分为核心线程池和普通线程池,下载图片等耗时任务放置在普通线程池,避免耗时任务阻塞线程池后,导致所有异步任务都必须等待。
22. 异步任务,分为核心任务和普通任务,只有核心任务中出现的系统级错误才会报错,异步任务的ui操作需要判断原activity是否处于激活状态。
23. Bitmap及时的销毁(Activity的onDestroy时,将bitmap回收)设置一定的采样率巧妙的运用软引用drawable对应resid的资源,bitmap对应其他资源。
24. 线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程生命周期的不可控。
25. 如果ImageView的图片是来自网络,进行异步加载。
26. 应用开发中自定义View的时候,交互部分,千万不要写成线程不断刷新界面显示,而是根据TouchListener事件主动触发界面的更新。
八、AndroidUI优化
1. layout组件化,尽量使用merge及include复用
2. 使用styles,复用样式定义 。
3. 软键盘的弹出控制,不要让其覆盖输入框 。
4. 数字、字母和汉字混排占位问题:将数字和字母全角化。由于现在大多数情况下我们的输入都是半角,所以字母和数字的占位无法确定,但是一旦全角化之后,数字、字母的占位就和一个汉字的占位相同了,这样就可以避免由于占位导致的排版问题 。
5. 英文文档排版:textview自动换行时要保持单词的完整性,解决方案是计算字符串长度,然后手动设定每一行显示多少个字母并加上‘n‘。
6. 复杂布局使用RelativeLayout 。
7. 自适应屏幕,使用dp替代pix 。
8. 使用android:layout_weight或者TableLayout制作等分布局 。
9.
九、不用忽视异常处理
1. void setServerPort(String value) {
2. try {
3. serverPort =Integer.parseInt(value);
4. } catch(NumberFormatException e) {
5. }
6. }
对catch后面的异常做空处理,这个很恐怖,一定一定要捕获它进行处理,或者在方法声明时抛出异常,由客户程序员去负责消化这个异常。
1. void setServerPort(String value) throws NumberFormatException {
2. serverPort = Integer.parseInt(value);
3. }
或者:
1. ** Set port. If value is not a valid number, 80 is substituted. */
2. void setServerPort(String value) {
3. try {
4. serverPort = Integer.parseInt(value);
5. } catch (NumberFormatException e) {
6. serverPort = 80; // default port for server
7. }
或者:
1. void setServerPort(String value) throws ConfigurationException {
2. try {
3. serverPort = Integer.parseInt(value);
4. } catch (NumberFormatException e) {
5. throw new ConfigurationException("Port " + value + " is not valid.");
6. }
7. }
2. 不要偷懒而捕捉一般异常,代码一概捕捉Exception异常,大小通吃是不对的,这样会让你在错误出现时难以定位到错误原因,一般异常无法用统一方法进行异常处理。
十、Eclipse 代码格式化
导入development/ide/eclipse下的文件,使得Eclipse按照Android代码风格规则。选择 “Window › Preferences › Java › Code Style,使用“Formatter › Import” ,导入android-formatting.xml,”OrganizeImports › Import” 导入 android.importorder