如何提升编码质量及进行代码优化

 

   提升编码质量可以从编码规范和代码优化两个方面入手:

   为什么要编码规范:

    1. 为了提高代码的可阅读性,可维护性,我们需要有对应的编码规范

    2. 为来自不同的项目组或个人提供标准的代码格式。

 

一.编码规范:

 

1.1 注释规范

Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的,使用/.../和//界定的注释。文档注释(被称为"doc comments")是Java独有的,并由/*.../界定。文档注释可以通过javadoc工具转换成HTML文件。
实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。
程序可以有4种实现注释的风格:块(block)、单行(single-line)、尾部(trailing)和行末(end-of-line)。

1.1.1 文档注释

1) 文档注释(Documentation Comments)描述Java的类、接口、构造函数,方法,以及成员变量(field)。每个文档注释都会被置于注释定界符/*.../之中,一个注释对应一个类、接口或成员。该注释应位于声明之前:

/**
 * The Example class provides ...
 */
public class Example { ...
2) 若你想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释或紧跟在声明后面的单行注释。例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。

3) 文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联。
文件开始注释内容包括:公司名称、版权、作者、时间等。
例如

/**
 * Description: 功能描述
 * @Author XXX 创建者姓名
 * @Date YYYY-MM-DD
 */

1.1.2 块注释

块注释用来为文件、方法、数据结构和算法进行描述或是用来划分文件的模块。块注释一般放在每个文件的开始或是每个模块、方法的前面,也可能放在方法之内。当块注释用在方法之内时,应该和它所注释的代码进行两样的缩进。
模块注释包括:功能、作者,如果有变更,注明变更的说明。
在块注释前应该有一个空行,以便同其他代码进行分割。例如:

/*
* 这里是一个块注释
*/

1.4.3 单行注释

简短的注释可以只用一行来说明,并与后面的代码进行相同的缩进。如果一行写不下,就采用前面说的块注释的形式。单行注释前面应该有一空行。尽量使用单行注释。
下面是一个例子:

if (condition) {
/* 对condition的处理 */
//对condition的处理
...
}
2.1 命名原则

Java的包、类、方法、属性、变量,常量等的命名须严格遵守SUN的JAVA命名规范!
1 包命名
采用完整的英文描述,且名称全部由小写字母组成,并按照com.alibaba.china.projectName的结构,从而达到最小长度最多信息。
2 类名和接口名
类和接口名称第一个字母必须大写,不能包含特殊字符。
3 变量名
变量名首字母小写,采用驼峰结构,变量名不应以下划线或美元符号开头。
成员属性名称和类名不能重名,尽量控制在3-20字符内,且语意明确。
尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。
4 常量名
常量名中所有字母都大写,以"_"划分,且要求表达清楚其含义及值,并有相应注释。

2.2 命名要求细节

2.2.1 Service命名

1) service层接口 {模块名}/service/XxxService
2) service层实现 {模块名}/service/impl/XxxServiceImpl

2.2.2 DAO命名

1) DAO层接口 dao/interfaces/XxxDao.java
2) DAO层实现 dao/ibatis|hibernate|viewcache|search/XxxDaoImpl.java
3) ibatis配置文件名字 表名.xml

2.2.3 DAO方法命名

1)  动作+对象+"By"+条件参数 findBizExpress3ByMemberId
2)  获得多个对象的方法用list做前缀
3)  获得单个对象的方法用find做前缀
4)  获得某些属性的方法用get做前缀
5)  获得统计值的方法用count做前缀
6)  创建对象(数据插入)的方法总是用save(推荐)或insert或add做前缀
7)  删除对象(数据删除)的方法总是用delete做前缀
8)  修改对象(数据修改)的方法总是用update做前缀
9)  移动对象(数据移动)的方法总是用move做前缀

 

 

 

二.代码优化的几点注意:

 

1. 尽量不要使用+号来连接字符串,至少不要在隔行中使用+来连接字符串。因为有的java虚拟机可能对字符串连接+做了性能优化,在都同行的+字符串连接,转化为StringBuilderappend()方法来连接,所以在同行使用+和使用StringBuilderappend 来做连接性能上差不多。 

 

2. 在设计类时应尽可能地避免在类的默认构造函数中创建,初始化大量的对象。

 

3.合理的申请数组空间,如果数组中所保存的元素占用内存空间较大或数组本身长度较长的情况,我们釆用可以釆用软引用的技术来引用数组,以“提醒”JVM及时的回收垃圾内存,维护系统的稳定性。

String[] memberIds = null;
List <String> memberIdList = new ArrayList<String>();
memberIdList.add(“1”);
//声明数组空间长度
memberIds = memberIdList.toArray(new String[memberIdList.size()]);

4.StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。说明:java源码在AbstractStringBuilder中是这么实现的

 /**
     * Constructs a string builder with no characters in it and an 
     * initial capacity of 16 characters. 
     */
    public StringBuilder() {
	super(16);
    }


 // Appends the specified string builder to this sequence.
    private StringBuilder append(StringBuilder sb) {
	if (sb == null)
            return append("null");
	int len = sb.length();
	int newcount = count + len;
	if (newcount > value.length)
	    expandCapacity(newcount);
	sb.getChars(0, len, value, count);
	count = newcount;
        return this;
    }


 /**扩张字符串增长,按照两倍的形式扩张,不指定大小的话会造成空间浪费
     * This implements the expansion semantics of ensureCapacity with no
     * size check or synchronization.
     */
    void expandCapacity(int minimumCapacity) {
	int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
	    newCapacity = minimumCapacity;
	}
        value = Arrays.copyOf(value, newCapacity);
    }

 

5.在接口参数中,需要传递常量变量时,可以考虑使用枚举定义,而不需要在每个service中写不同的常量参数,例如:

public enum ExperienceStatus {
        /**
         * 已发送
         */
        HAS_SEND("0"), 
        /**
         * 激活
         */
        ACTIVATE("1"),
	    /**
	     * 已体验
	     */
	    HAS_EXPERIENCE("2"),
	    /**
	     * 过期
	     */
	    OUTOFDATE("3"),
	    /**
	     * 失败
	     */
	    FAILED("4");
        
        //状态
        private final String status;

        ExperienceStatus(String status) {
            this.status = status;
        };

        public String getExperienceStatus() {
            return this.status;
        }
    }
 具体调用的形式就是:private static final String ACTIVATE = XXXDO.ExperienceStatus.ACTIVATE.getExperienceStatus();  

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值