- 浏览: 622188 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (334)
- java core (12)
- struts2.x (2)
- spring (3)
- hibernate (8)
- jpa (6)
- maven (2)
- osgi (5)
- eclipse (4)
- struts2.x+spring2.x+hibernate 整合 (5)
- ebs (0)
- html (0)
- vaadin (1)
- css (0)
- jquery (0)
- javascript (0)
- svn (1)
- cvs (0)
- axas2.x (0)
- eclipse+maven (9)
- annotation (0)
- 基于OSGi的动态化系统搭建 (1)
- notenet (1)
- jboss eclipse (4)
- eclipse工具 (4)
- jdk1.6+maven3.0.3+nuxeo+svn+felix+cxf+spring+springDM (6)
- spring dm (1)
- Nexus介绍 (1)
- proxool listener (0)
- oracle (4)
- mysql (8)
- 搭建你的全文检索 (1)
- hibernatehibernatehibernate (0)
- cvsearchcvsearch (0)
- mycvseach (0)
- asdfasdfasdf (0)
- propertiey (0)
- hibernate annotation (0)
- libs (0)
- icam (2)
- start 数据库配置 (0)
- jboss (1)
- 让Eclipse启动时显示选择workspace的对话框 (1)
- table表头固定 (1)
- s2s3h4 (0)
- leaver (0)
- mycvsaerchddd (0)
- 关于jboss5.0.1部署 (4)
- bookmarks (0)
- PersistenceUnitDeployment (0)
- mycom (0)
- HKEY_CURRENT_USER = &H80000001 (0)
- syspath (1)
- css div (1)
- Dreamweaver CS5 (0)
- generate (0)
- mysql查看表结构命令 (1)
- LOG IN ERROR EMAIL TO SB (0)
- struts2 handle static resource (1)
- jsf (2)
- log4j (1)
- jbpm4.4 (2)
- down: jbpm4.4 (1)
- jstl1.2 (1)
- spring annotation (1)
- java design pattern (1)
- cache (1)
- ehcache (1)
- 11111 (0)
- myge (0)
- pom.xml (0)
- springquartz (0)
- OpenStack (9)
- hadoop (2)
- nginx (1)
- hadoop openstack (1)
- os (1)
- hadoop-2.6.0 zookeeper-3.4.6 hbase-0.98.9-hadoop2 集群 (5)
- hadoop2.7.0 ha Spark (2)
- tess (0)
- system (1)
- asdf (0)
- hbase (2)
- hbase create table error (1)
- ekl (1)
- gitignore (1)
- gitlab-ci.yml (1)
- shell (1)
- elasticsearch (2)
- Azkaban 3.0+ (1)
- centos用命令 (1)
- hive (1)
- kafka (1)
- CaptureBasic (0)
- CentOS7 (1)
- dev tools (1)
- README.md (1)
- Error (1)
- teamviewerd.service (1)
- scala (1)
- spark (1)
- standard (1)
- gitlab (1)
- IDEA (0)
- ApplicationContext (1)
- 传统数仓 (1)
- redis install (1)
- MYSQL AND COLUME (1)
- java版本选择 (1)
- hue (1)
- npm (1)
- es (1)
- 版本管理 (1)
- 升级npm版本 (1)
- git (1)
- 服务器参数设置 (1)
- 调大 IDEA 编译内存大小 (0)
- CentOS8安装GitLab (1)
- gitlab安装使用 (1)
最新评论
-
ssydxa219:
vim /etc/security/limits.confvi ...
ekl -
Gamehu520:
table中无数据
hbase 出现的问题 -
Xleer0102:
为什么都是只有问没有答,哭晕在厕所
hbase 出现的问题 -
jiajiao_5413:
itext table -
CoderDream:
不完整,缺com.tcs.org.demostic.pub.u ...
struts2.3.1.1+hibernate3.6.9Final+spring3.1.0+proxool+maven+annotation
高质量代码编写规范
1. 标识符命名规范
1.1 概述
标识符的命名力求做到统一、达意和简洁。
1.1.1 统一
统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。
1.1.2 达意
达意是指,标识符能准确的表达出它所代表的意义,比如: newSupplier, OrderPaymentGatewayService等;而 supplier1, service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是 order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。
1.1.3 简洁
简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长, transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。
1.1.4 骆驼法则
Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: SupplierName, addNewContract,而不是 supplier_name, add_new_contract。
1.1.5 英文 vs 拼音
尽量使用通俗易懂的英文单词,如果不会可以向队友求助,实在不行则使用汉语拼音,避免拼音与英文混用。比如表示归档,用archive比较好, 用pigeonhole则不好,用guiDang尚可接受。
1.2 包名
使用小写字母如 com.xxx.settlment,不要 com.xxx.Settlement
单词间不要用字符隔开,比如 com.xxx.settlment.jsfutil,而不要com.xxx.settlement.jsf_util
1.3 类名
1.3.1 首字母大写
类名要首字母大写,比如 SupplierService, PaymentOrderAction;不要 supplierService, paymentOrderAction.
1.3.2 后缀
类名往往用不同的后缀表达额外的意思,如下表:
后缀名 意义 举例
Service 表明这个类是个服务类,里面包含了给其他类提同业务服务的方法 PaymentOrderService
Impl 这个类是一个实现类,而不是接口 PaymentOrderServiceImpl
Inter 这个类是一个接口 LifeCycleInter
Dao 这个类封装了数据访问方法 PaymentOrderDao
Action 直接处理页面请求,管理页面逻辑了类 UpdateOrderListAction
Listener 响应某种事件的类 PaymentSuccessListener
Event 这个类代表了某种事件 PaymentSuccessEvent
Servlet 一个Servlet PaymentCallbackServlet
Factory 生成某种对象工厂的类 PaymentOrderFactory
Adapter 用来连接某种以前不被支持的对象的类 DatabaseLogAdapter
Job 某种按时间运行的任务 PaymentOrderCancelJob
Wrapper 这是一个包装类,为了给某个类提供没有的能力 SelectableOrderListWrapper
Bean 这是一个POJO MenuStateBean
1.4 方法名
首字母小写,如 addOrder() 不要 AddOrder()
动词在前,如 addOrder(),不要orderAdd()
动词前缀往往表达特定的含义,如下表:
前缀名 意义 举例
create 创建 createOrder()
delete 删除 deleteOrder()
add 创建,暗示新创建的对象属于某个集合 addPaidOrder()
remove 删除 removeOrder()
init或则initialize 初始化,暗示会做些诸如获取资源等特殊动作 initializeObjectPool
destroy 销毁,暗示会做些诸如释放资源的特殊动作 destroyObjectPool
open 打开 openConnection()
close 关闭 closeConnection()<
read 读取 readUserName()
write 写入 writeUserName()
get 获得 getName()
set 设置 setName()
prepare 准备 prepareOrderList()
copy 复制 copyCustomerList()
modity 修改 modifyActualTotalAmount()
calculate 数值计算 calculateCommission()
do 执行某个过程或流程 doOrderCancelJob()
dispatch 判断程序流程转向 dispatchUserRequest()
start 开始 startOrderProcessing()
stop 结束 stopOrderProcessing()
send 发送某个消息或事件 sendOrderPaidMessage()
receive 接受消息或时间 receiveOrderPaidMessgae()
respond 响应用户动作 responseOrderListItemClicked()
find 查找对象 findNewSupplier()
update 更新对象 updateCommission()
find方法在业务层尽量表达业务含义,比如 findUnsettledOrders(),查询未结算订单,而不要findOrdersByStatus()。 数据访问层,find,update等方法可以表达要执行的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID, 345)
1.5 域(field)名
1.5.1 静态常量
全大写用下划线分割,如
public static find String ORDER_PAID_EVENT = "ORDER_PAID_EVENT";
1.5.2 枚举
全大写,用下划线分割,如
public enum Events {
ORDER_PAID,
ORDER_CREATED
}
1.5.3 其他
首字母小写,骆驼法则,如:
public String orderName;
1.6 局部变量名
参数和局部变量名首字母小写,骆驼法则。尽量不要和域冲突,尽量表达这个变量在方法中的意义。
2. 代码格式
用空格字符缩进源代码,不要用tab,每个缩进4个空格。
2.1 源文件编码
源文件使用utf-8编码,结尾用unix n 分格。
2.2 行宽
行宽度不要超过130。
2.3 包的导入
删除不用的导入,尽量不要使用整个包的导入。在eclipse下经常使用快捷键 ctrl+shift+o 修正导入。
2.4 类格式
2.5 域格式
每行只能声明一个域。
域的声明用空行隔开。
2.5 方法格式
2.6 代码块格式
2.6.1 缩进风格
大括号的开始在代码块开始的行尾,闭合在和代码块同一缩进的行首,例如:
package com.test;
public class TestStyle extends SomeClass implements AppleInter, BananaInter {
public static final String THIS_IS_CONST = "CONST VALUE";
private static void main(String[] args) {
int localVariable = 0;
}
public void compute(String arg) {
if (arg.length() > 0) {
System.out.println(arg);
}
for (int i = 0; i < 10; i++) {
System.out.println(arg);
}
while (condition) {
}
do {
otherMethod();
} while (condition);
switch (i) {
case 0:
callFunction();
break;
case 1:
callFunctionb();
break;
default:
break;
}
}
}
2.6.2 空格的使用
2.6.2.1 表示分割时用一个空格
不能这样:
if ( a > b ) {
//do something here
};
2.6.2.2 二元三元运算符两边用一个空格隔开
如下:
a + b = c;
b - d = e;
return a == b ? 1 : 0;
不能如下:
a+b=c;
b-d=e;
return a==b?1:0;
2.6.2.3 逗号语句后如不还行,紧跟一个空格
如下:
call(a, b, c);
不能如下:
call(a,b,c);
2.6.3 空行的使用
空行可以表达代码在语义上的分割,注释的作用范围,等等。将类似操作,或一组操作放在一起不用空行隔开,而用空行隔开不同组的代码, 如图:
order = orderDao.findOrderById(id);
//update properties
order.setUserName(userName);
order.setPrice(456);
order.setStatus(PAID);
orderService.updateTotalAmount(order);
session.saveOrUpdate(order);
上例中的空行,使注释的作用域很明显.
连续两行的空行代表更大的语义分割。
方法之间用空行分割
域之间用空行分割
超过十行的代码如果还不用空行分割,就会增加阅读困难
3. 注释规范
3.1 注释 vs 代码
注释宜少二精,不宜多而滥,更不能误导
命名达意,结构清晰, 类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码混乱,再多的注释都不能弥补。所以,应当先在代码本身下功夫。
不能正确表达代码意义的注释,只会损害代码的可读性。
过于详细的注释,对显而易见的代码添加的注释,罗嗦的注释,还不如不写
。
注释要和代码同步,过多的注释会成为开发的负担
注释不是用来管理代码版本的,如果有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以后没人知道那段注释掉的代码该不该删除。
3.2 Java Doc
表明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写。Java Doc是个类的使用者来看的,主要介绍 是什么,怎么用等信息。凡是类的使用者需要知道,都要用Java Doc 来写。非Java Doc的注释,往往是个代码的维护者看的,着重告述读者为什么这样写,如何修改,注意什么问题等。 如下:
/**
* This is a class comment
*/
public class TestClass {
/**
* This is a field comment
*/
public String name;
/**
* This is a method comment
*/
public void call() {
}
}
3.3 块级别注释
3.3.1 块级别注释,单行时用 //, 多行时用 /* .. */。
3.3.2 较短的代码块用空行表示注释作用域
3.3.3 较长的代码块要用
/*------ start: ------*/
和
/*-------- end: -------*/
包围
如:
/*----------start: 订单处理 ------- */
//取得dao
OrderDao dao = Factory.getDao("OrderDao");
/* 查询订单 */
Order order = dao.findById(456);
//更新订单
order.setUserName("uu");
order.setPassword("pass");
order.setPrice("ddd");
orderDao.save(order);
/*----------end: 订单处理 ------- */
3.3.4 可以考虑使用大括号来表示注释范围
使用大括号表示注释作用范围的例子:
/*----------订单处理 ------- */
{
//取得dao
OrderDao dao = Factory.getDao("OrderDao");
/* 查询订单 */
Order order = dao.findById(456);
//更新订单
order.setUserName("uu");
order.setPassword("pass");
order.setPrice("ddd");
orderDao.save(order);
}
3.4 行内注释
行内注释用 // 写在行尾
4 最佳实践和禁忌
4.1 每次保存的时候,都让你的代码是最美的
程序员都是懒惰的,不要想着等我完成了功能,再来优化代码的格式和结构,等真的把功能完成,很少有人会再愿意回头调整代码。
4.2 使用log而不是System.out.println()
log可以设定级别,可以控制输出到哪里,容易区分是在代码的什么地方打印的,而System.out.print则不行。而且,System.out.print的速度很慢。所以,除非是有意的,否则,都要用log。至少在提交到svn之前把System.out.print换成log。
4.3 每个if while for等语句,都不要省略大括号{}
看下面的代码:
if (a > b)
a++;
如果在以后维护的时候,需要在a > b 时,把b++,一步小心就会写成:
if (a > b)
a++;
b++;
这样就错了,因为无论a和b是什么关系,b++都会执行。 如果一开始就这样写:
if (a > b) {
a++;
}
相信没有哪个笨蛋会把b++添加错的。而且,这个大括号使作用范围更明显,尤其是后面那行很长要折行时。
4.4 善用TODO:
在代码中加入 //TODO: ,大部分的ide都会帮你提示,让你知道你还有什么事没有做。比如:
if (order.isPaid()) {
//TODO: 更新订单
}
4.5 在需要留空的地方放一个空语句或注释,告述读者,你是故意的
比如:
if (!exists(order)) {
;
}
或:
if (!exists(order)) {
//nothing to do
}
4.6 不要再对boolean值做true false判断
比如:
if (order.isPaid() == true) {
// Do something here
}
不如写成:
if (order.isPaid()) {
//Do something here
}
后者读起来就很是 if order is paid, .... 要比 if order's isPaid method returns true, … 更容易理解
4.7 减少代码嵌套层次
代码嵌套层次达3层以上时,一般人理解起来都会困难。下面的代码是一个简单的例子:
public void demo(int a, int b, int c) {
if (a > b) {
if (b > c) {
doJobA();
} else if (b < c) {
doJobB()
}
} else {
if (b > c) {
if (a < c) {
doJobC();
}
}
}
}
减少嵌套的方法有很多:
合并条件
利用 return 以省略后面的else
利用子方法
比如上例,合并条件后成为:
public void demo(int a, int b, int c) {
if (a > b && b > c) {
doJobA();
}
if (a > b && c > b) {
doJobB();
}
if (a <= b && c < b && a < c) {
doJobC();
}
}
如果利用return 则成为:
public void demo(int a, int b, int c) {
if (a > b) {
if (b > c) {
doJobA();
return;
}
doJobB()
return;
}
if (b > c) {
if (a < c) {
doJobC();
}
}
}
利用子方法,就是将嵌套的程序提取出来放到另外的方法里。
4.8 程序职责单一
关注点分离是软件开发的真理。人类自所以能够完成复杂的工作,就是因为人类能够将工作分解到较小级别的任务上,在做每个任务时关注更少的东西。让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,减少出错。
4.9 变量的声明,初始化和被使用尽量放到一起
比方说如下代码:
int orderNum= getOrderNum();
//do something withou orderNum here
call(orderNum);
上例中的注释处代表了一段和orderNum不相关的代码。orderNum的声明和初始化离被使用的地方相隔了很多行的代码,这样做不好,不如这样:
//do something withou orderNum here
int orderNum= getOrderNum();
call(orderNum);
4.10 缩小变量的作用域
能用局部变量的,不要使用实例变量,能用实例变量的,不要使用类变量。变量的生存期越短,以为着它被误用的机会越小,同一时刻程序员要关注的变量的状态越少。实例变量和类变量默认都不是线程安全的,局部变量是线程安全的。比如如下代码:
public class OrderPayAction{
private Order order;
public void doAction() {
order = orderDao.findOrder();
doJob1();
doJob2();
}
private void doJob1() {
doSomething(order);
}
private void doJob2() {
doOtherThing(order);
}
}
上例中order只不过担当了在方法间传递参数之用,用下面的方法更好:
public class OrderPayAction{
public void doAction() {
order = orderDao.findOrder();
doJob1(order);
doJob2(order);
}
private void doJob1(Order order) {
doSomething(order);
}
private void doJob2(Order order) {
doOtherThing(order);
}
}
4.11 尽量不要用参数来带回方法运算结果
比如:
public void calculate(Order order) {
int result = 0;
//do lots of computing and store it in the result
order.setResult(result);
}
public void action() {
order = orderDao.findOrder();
calculate(order);
// do lots of things about order
}
例子中calculate方法通过传入的order对象来存储结果, 不如如下写:
public int calculate(Order order) {
int result = 0;
//do lots of computing and store it in the result
return result;
}
public void action() {
order = orderDao.findOrder();
order.setResult(calculate(order));
// do lots of things about order
}
1.1 概述
标识符的命名力求做到统一、达意和简洁。
1.1.1 统一
统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。
1.1.2 达意
达意是指,标识符能准确的表达出它所代表的意义,比如: newSupplier, OrderPaymentGatewayService等;而 supplier1, service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是 order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。
1.1.3 简洁
简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长, transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。
1.1.4 骆驼法则
Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: SupplierName, addNewContract,而不是 supplier_name, add_new_contract。
1.1.5 英文 vs 拼音
尽量使用通俗易懂的英文单词,如果不会可以向队友求助,实在不行则使用汉语拼音,避免拼音与英文混用。比如表示归档,用archive比较好, 用pigeonhole则不好,用guiDang尚可接受。
1.2 包名
使用小写字母如 com.xxx.settlment,不要 com.xxx.Settlement
单词间不要用字符隔开,比如 com.xxx.settlment.jsfutil,而不要com.xxx.settlement.jsf_util
1.3 类名
1.3.1 首字母大写
类名要首字母大写,比如 SupplierService, PaymentOrderAction;不要 supplierService, paymentOrderAction.
1.3.2 后缀
类名往往用不同的后缀表达额外的意思,如下表:
后缀名 意义 举例
Service 表明这个类是个服务类,里面包含了给其他类提同业务服务的方法 PaymentOrderService
Impl 这个类是一个实现类,而不是接口 PaymentOrderServiceImpl
Inter 这个类是一个接口 LifeCycleInter
Dao 这个类封装了数据访问方法 PaymentOrderDao
Action 直接处理页面请求,管理页面逻辑了类 UpdateOrderListAction
Listener 响应某种事件的类 PaymentSuccessListener
Event 这个类代表了某种事件 PaymentSuccessEvent
Servlet 一个Servlet PaymentCallbackServlet
Factory 生成某种对象工厂的类 PaymentOrderFactory
Adapter 用来连接某种以前不被支持的对象的类 DatabaseLogAdapter
Job 某种按时间运行的任务 PaymentOrderCancelJob
Wrapper 这是一个包装类,为了给某个类提供没有的能力 SelectableOrderListWrapper
Bean 这是一个POJO MenuStateBean
1.4 方法名
首字母小写,如 addOrder() 不要 AddOrder()
动词在前,如 addOrder(),不要orderAdd()
动词前缀往往表达特定的含义,如下表:
前缀名 意义 举例
create 创建 createOrder()
delete 删除 deleteOrder()
add 创建,暗示新创建的对象属于某个集合 addPaidOrder()
remove 删除 removeOrder()
init或则initialize 初始化,暗示会做些诸如获取资源等特殊动作 initializeObjectPool
destroy 销毁,暗示会做些诸如释放资源的特殊动作 destroyObjectPool
open 打开 openConnection()
close 关闭 closeConnection()<
read 读取 readUserName()
write 写入 writeUserName()
get 获得 getName()
set 设置 setName()
prepare 准备 prepareOrderList()
copy 复制 copyCustomerList()
modity 修改 modifyActualTotalAmount()
calculate 数值计算 calculateCommission()
do 执行某个过程或流程 doOrderCancelJob()
dispatch 判断程序流程转向 dispatchUserRequest()
start 开始 startOrderProcessing()
stop 结束 stopOrderProcessing()
send 发送某个消息或事件 sendOrderPaidMessage()
receive 接受消息或时间 receiveOrderPaidMessgae()
respond 响应用户动作 responseOrderListItemClicked()
find 查找对象 findNewSupplier()
update 更新对象 updateCommission()
find方法在业务层尽量表达业务含义,比如 findUnsettledOrders(),查询未结算订单,而不要findOrdersByStatus()。 数据访问层,find,update等方法可以表达要执行的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID, 345)
1.5 域(field)名
1.5.1 静态常量
全大写用下划线分割,如
public static find String ORDER_PAID_EVENT = "ORDER_PAID_EVENT";
1.5.2 枚举
全大写,用下划线分割,如
public enum Events {
ORDER_PAID,
ORDER_CREATED
}
1.5.3 其他
首字母小写,骆驼法则,如:
public String orderName;
1.6 局部变量名
参数和局部变量名首字母小写,骆驼法则。尽量不要和域冲突,尽量表达这个变量在方法中的意义。
2. 代码格式
用空格字符缩进源代码,不要用tab,每个缩进4个空格。
2.1 源文件编码
源文件使用utf-8编码,结尾用unix n 分格。
2.2 行宽
行宽度不要超过130。
2.3 包的导入
删除不用的导入,尽量不要使用整个包的导入。在eclipse下经常使用快捷键 ctrl+shift+o 修正导入。
2.4 类格式
2.5 域格式
每行只能声明一个域。
域的声明用空行隔开。
2.5 方法格式
2.6 代码块格式
2.6.1 缩进风格
大括号的开始在代码块开始的行尾,闭合在和代码块同一缩进的行首,例如:
package com.test;
public class TestStyle extends SomeClass implements AppleInter, BananaInter {
public static final String THIS_IS_CONST = "CONST VALUE";
private static void main(String[] args) {
int localVariable = 0;
}
public void compute(String arg) {
if (arg.length() > 0) {
System.out.println(arg);
}
for (int i = 0; i < 10; i++) {
System.out.println(arg);
}
while (condition) {
}
do {
otherMethod();
} while (condition);
switch (i) {
case 0:
callFunction();
break;
case 1:
callFunctionb();
break;
default:
break;
}
}
}
2.6.2 空格的使用
2.6.2.1 表示分割时用一个空格
不能这样:
if ( a > b ) {
//do something here
};
2.6.2.2 二元三元运算符两边用一个空格隔开
如下:
a + b = c;
b - d = e;
return a == b ? 1 : 0;
不能如下:
a+b=c;
b-d=e;
return a==b?1:0;
2.6.2.3 逗号语句后如不还行,紧跟一个空格
如下:
call(a, b, c);
不能如下:
call(a,b,c);
2.6.3 空行的使用
空行可以表达代码在语义上的分割,注释的作用范围,等等。将类似操作,或一组操作放在一起不用空行隔开,而用空行隔开不同组的代码, 如图:
order = orderDao.findOrderById(id);
//update properties
order.setUserName(userName);
order.setPrice(456);
order.setStatus(PAID);
orderService.updateTotalAmount(order);
session.saveOrUpdate(order);
上例中的空行,使注释的作用域很明显.
连续两行的空行代表更大的语义分割。
方法之间用空行分割
域之间用空行分割
超过十行的代码如果还不用空行分割,就会增加阅读困难
3. 注释规范
3.1 注释 vs 代码
注释宜少二精,不宜多而滥,更不能误导
命名达意,结构清晰, 类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码混乱,再多的注释都不能弥补。所以,应当先在代码本身下功夫。
不能正确表达代码意义的注释,只会损害代码的可读性。
过于详细的注释,对显而易见的代码添加的注释,罗嗦的注释,还不如不写
。
注释要和代码同步,过多的注释会成为开发的负担
注释不是用来管理代码版本的,如果有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以后没人知道那段注释掉的代码该不该删除。
3.2 Java Doc
表明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写。Java Doc是个类的使用者来看的,主要介绍 是什么,怎么用等信息。凡是类的使用者需要知道,都要用Java Doc 来写。非Java Doc的注释,往往是个代码的维护者看的,着重告述读者为什么这样写,如何修改,注意什么问题等。 如下:
/**
* This is a class comment
*/
public class TestClass {
/**
* This is a field comment
*/
public String name;
/**
* This is a method comment
*/
public void call() {
}
}
3.3 块级别注释
3.3.1 块级别注释,单行时用 //, 多行时用 /* .. */。
3.3.2 较短的代码块用空行表示注释作用域
3.3.3 较长的代码块要用
/*------ start: ------*/
和
/*-------- end: -------*/
包围
如:
/*----------start: 订单处理 ------- */
//取得dao
OrderDao dao = Factory.getDao("OrderDao");
/* 查询订单 */
Order order = dao.findById(456);
//更新订单
order.setUserName("uu");
order.setPassword("pass");
order.setPrice("ddd");
orderDao.save(order);
/*----------end: 订单处理 ------- */
3.3.4 可以考虑使用大括号来表示注释范围
使用大括号表示注释作用范围的例子:
/*----------订单处理 ------- */
{
//取得dao
OrderDao dao = Factory.getDao("OrderDao");
/* 查询订单 */
Order order = dao.findById(456);
//更新订单
order.setUserName("uu");
order.setPassword("pass");
order.setPrice("ddd");
orderDao.save(order);
}
3.4 行内注释
行内注释用 // 写在行尾
4 最佳实践和禁忌
4.1 每次保存的时候,都让你的代码是最美的
程序员都是懒惰的,不要想着等我完成了功能,再来优化代码的格式和结构,等真的把功能完成,很少有人会再愿意回头调整代码。
4.2 使用log而不是System.out.println()
log可以设定级别,可以控制输出到哪里,容易区分是在代码的什么地方打印的,而System.out.print则不行。而且,System.out.print的速度很慢。所以,除非是有意的,否则,都要用log。至少在提交到svn之前把System.out.print换成log。
4.3 每个if while for等语句,都不要省略大括号{}
看下面的代码:
if (a > b)
a++;
如果在以后维护的时候,需要在a > b 时,把b++,一步小心就会写成:
if (a > b)
a++;
b++;
这样就错了,因为无论a和b是什么关系,b++都会执行。 如果一开始就这样写:
if (a > b) {
a++;
}
相信没有哪个笨蛋会把b++添加错的。而且,这个大括号使作用范围更明显,尤其是后面那行很长要折行时。
4.4 善用TODO:
在代码中加入 //TODO: ,大部分的ide都会帮你提示,让你知道你还有什么事没有做。比如:
if (order.isPaid()) {
//TODO: 更新订单
}
4.5 在需要留空的地方放一个空语句或注释,告述读者,你是故意的
比如:
if (!exists(order)) {
;
}
或:
if (!exists(order)) {
//nothing to do
}
4.6 不要再对boolean值做true false判断
比如:
if (order.isPaid() == true) {
// Do something here
}
不如写成:
if (order.isPaid()) {
//Do something here
}
后者读起来就很是 if order is paid, .... 要比 if order's isPaid method returns true, … 更容易理解
4.7 减少代码嵌套层次
代码嵌套层次达3层以上时,一般人理解起来都会困难。下面的代码是一个简单的例子:
public void demo(int a, int b, int c) {
if (a > b) {
if (b > c) {
doJobA();
} else if (b < c) {
doJobB()
}
} else {
if (b > c) {
if (a < c) {
doJobC();
}
}
}
}
减少嵌套的方法有很多:
合并条件
利用 return 以省略后面的else
利用子方法
比如上例,合并条件后成为:
public void demo(int a, int b, int c) {
if (a > b && b > c) {
doJobA();
}
if (a > b && c > b) {
doJobB();
}
if (a <= b && c < b && a < c) {
doJobC();
}
}
如果利用return 则成为:
public void demo(int a, int b, int c) {
if (a > b) {
if (b > c) {
doJobA();
return;
}
doJobB()
return;
}
if (b > c) {
if (a < c) {
doJobC();
}
}
}
利用子方法,就是将嵌套的程序提取出来放到另外的方法里。
4.8 程序职责单一
关注点分离是软件开发的真理。人类自所以能够完成复杂的工作,就是因为人类能够将工作分解到较小级别的任务上,在做每个任务时关注更少的东西。让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,减少出错。
4.9 变量的声明,初始化和被使用尽量放到一起
比方说如下代码:
int orderNum= getOrderNum();
//do something withou orderNum here
call(orderNum);
上例中的注释处代表了一段和orderNum不相关的代码。orderNum的声明和初始化离被使用的地方相隔了很多行的代码,这样做不好,不如这样:
//do something withou orderNum here
int orderNum= getOrderNum();
call(orderNum);
4.10 缩小变量的作用域
能用局部变量的,不要使用实例变量,能用实例变量的,不要使用类变量。变量的生存期越短,以为着它被误用的机会越小,同一时刻程序员要关注的变量的状态越少。实例变量和类变量默认都不是线程安全的,局部变量是线程安全的。比如如下代码:
public class OrderPayAction{
private Order order;
public void doAction() {
order = orderDao.findOrder();
doJob1();
doJob2();
}
private void doJob1() {
doSomething(order);
}
private void doJob2() {
doOtherThing(order);
}
}
上例中order只不过担当了在方法间传递参数之用,用下面的方法更好:
public class OrderPayAction{
public void doAction() {
order = orderDao.findOrder();
doJob1(order);
doJob2(order);
}
private void doJob1(Order order) {
doSomething(order);
}
private void doJob2(Order order) {
doOtherThing(order);
}
}
4.11 尽量不要用参数来带回方法运算结果
比如:
public void calculate(Order order) {
int result = 0;
//do lots of computing and store it in the result
order.setResult(result);
}
public void action() {
order = orderDao.findOrder();
calculate(order);
// do lots of things about order
}
例子中calculate方法通过传入的order对象来存储结果, 不如如下写:
public int calculate(Order order) {
int result = 0;
//do lots of computing and store it in the result
return result;
}
public void action() {
order = orderDao.findOrder();
order.setResult(calculate(order));
// do lots of things about order
}
相关推荐
C# 代码编写规范是指在 C# 语言编程时所遵循的编写规则和命名约定,以确保代码的可读性、可维护性和可扩展性。该规范涵盖了 C# 代码在不同的环境中的命名规则、编写规则、代码风格等方面的要求。 根据该规范,C# ...
C语言编写高质量代码,想学习规范C语言的可以看看。
论C语言中高质量代码编写的规范问题.pdf
### Verilog代码编写规范详解 #### 一、代码编写风格的重要性 在FPGA设计领域,Verilog作为一种重要的硬件描述语言,其代码的质量直接影响到项目的...Verilog代码编写规范的制定与遵循,是实现高质量FPGA设计的基础。
### 编写高质量C语言...通过对本书的学习,读者不仅能掌握编写高质量代码的具体方法,还能深刻理解代码质量对于软件开发的重要性。无论是对于新手程序员还是有一定经验的开发者来说,这本书都是一本不可多得的好书。
"100个高质量代码编写建议"这个资源旨在提供一系列有助于提升代码质量的指导原则。这些原则涵盖了编程规范、设计模式、错误处理、性能优化等多个方面,对于提升软件工程的效率和可维护性具有重要意义。下面,我们将...
【Java代码编写规范】 编码规范在IT行业中,尤其是在Java编程领域,扮演着至关重要的角色。首先,一个软件的生命...通过合理地组织文件、规范注释、控制行宽和正确处理换行,可以创建出易于理解和维护的高质量代码。
在C#编程中,编写高质量的代码是每个开发者追求的目标。这份资料《改善C#的157个建议》提供了一系列实用的技巧和最佳实践,旨在帮助开发者提升代码的可读性、性能和维护性。以下是一些核心知识点的概述: 1. **命名...
### PHP代码编写规范知识点 #### 一、编写目的 为了提升技术团队的工作效率与软件质量,确保开发过程的高效性和代码的可维护性,本文档旨在制定一套实用且灵活的PHP代码编写规范。该规范旨在指导开发人员创建高...
通过遵循这些C#与ASP.NET的代码编写规范,开发者能够创建出更高质量、更易于维护的软件系统,同时提高团队间的合作效率。这份《代码编写规范说明书》不仅是开发者的实用指南,也是团队合作的默契约定。
通过学习和应用《华为代码编写规范和范例》,开发者不仅可以提升自身编程技能,还能更好地融入团队,共同打造高质量的软件产品。这份规范不仅适用于华为公司,也适用于其他任何追求高效、稳定和可维护性的软件开发...
【敏捷开发中编写高质量Java代码】的实践策略 在敏捷开发模式下,代码质量的提升是项目成功的关键因素。为了确保Java项目的代码质量,我们可以遵循五个关键步骤: 1. **统一编码规范与代码样式** - 编码规范是...
《编写高质量代码:改善c#程序的157个建议》是c#程序员进阶修炼的必读之作,包含的全部都是c#编码的最佳实践,从语言本身、程序的设计和架构、编码规范和编程习惯等三大方面对c#程序员遇到的经典问题给出了经验性的...
### 代码编写规范详解 #### 一、简介 在软件开发的过程中,良好的代码编写规范能够显著提升代码的质量和可维护性。本规范旨在为开发者提供一套全面的编码指南,涵盖公共编码规范、详细编码规范及数据库编码规范三...
如何编写高质量的代码_编码规范如何编写高质量的代码_编码规范如何编写高质量的代码_编码规范如何编写高质量的代码_编码规范
这份文档主要涵盖了几个关键方面,包括命名规范、代码格式和样式规则,这些都是编写高质量Java代码的基础。 **1. 前言** 前言部分通常会阐述制定这些规范的目的,强调遵守规范的重要性,以及规范对项目开发流程和...
"JAVA代码编写规范" 根据提供的文件信息,我们可以总结出以下几个关键知识点: 1. 命名约定: Java 命名约定有以下几点...这些知识点都是 Java 代码编写规范的重要组成部分,对于编写高质量的 Java 代码非常重要。