标签:
第一章概述
前言
代码相当于程序的基石,一行行代码都是程序员的心血经过日日夜夜凝结而成的。它不仅仅是一行一行的字母+文 字,它是程序员思想和经验的总结;编码规范只是大家在程序范围内达成一致的约定,这样大家的代码就可以互相看懂,维护起来更加容易,思想更畅快的交流,经 验更快的得到传播。代码规范不是限制程序员的个性,应该知道,不遵守规范的个性的代码并不代表程序员的性格,并不能张扬个性。个性应该体现在用更简单、更 优雅、更易读、更易理解以及算法实现效率更高等方面。
可读性,可理解性是代码的重要方面,本规范主要围绕如何去产生规范易读的代码。另外,它也保证了大家对同一代码段使用共同的语言进行描述。
术语
匈牙利命名法(Hungariannotation) 通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其他。
例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。
骆驼命名法(Camel)
混合使用大小写字母来构成变量和函数的名字
例如:person, orderDetail, oilTank
帕斯卡命名法(Pascal)
与骆驼命名法类似,所有单词第一个字母大写,其它字母小写
例如:OilLevel, CustomerName
约束
没有一个规范可以到处适用,也不可能无所不包。
第二章一般规则
第三章格式规范
importjava.io.IOException; importjava.net.URL; importjava.rmi.RmiServer; importjava.rmi.server.Server; importjavax.swing.JPanel; importjavax.swing.event.ActionEvent; importorg.linux.apache.server.SoapServer; |
importjava.util.List; // 避免: importjava.util.* importjava.util.Arraylist; importjava.util.HashSet; |
<public, protected, private> staticabstractsynchronized unuaual finalnativemethodName 注意访问标示符一定要在最前面。 publicstaticdoublesquare(doublea); //避免: static public double square(double a); |
//推荐 intlevel; intsize; //避免 intlevel, size; |
inttempValue; tempValue = maxValue; ... ... tempValue = minValue; ... tempValue = anotherValue; tempValue 在生命周期内表示了各种各样的意图,增加理解代码的难度。 应该为每个独立概念定义单独的变量: inttempMaxValue; inttempMinValue; inttempAnotherValue; |
sum = 0; for(i = 0; i< 100; i++) \{ sum += value[i]; \} //避免: for(i = 0, sum = 0; i< 100; i++)\{ sum += value[i]; \} |
isDone = false while(!isDone){ ... } //避免 isDone = false; ... ... while(!isDone){ ... } |
boolisFinished = (elementNo< 0) || (elementNo>maxElement); boolisRepeatedEntry = elementNo == lastElement; if(isFinished || isRepeatedEntry) { ... } // 避免 if((elementNo< 0) || (elementNo>maxElement)|| elementNo == lastElement) { ... } |
InputStream stream = File.open(fileName, "w"); if(stream != null) { ... } //避免 if(File.open(fileName, "w") != null)) { ... } |
publicString invoke() throwsException { ....String profileKey = "invoke: "; ....try{ ........UtilTimerStack.push(profileKey); ........if(executed) { ............test = true; .......} ....catch{ ....} } |
if(condition) \{ ....statements; \} if(condition) \{ ....statements; \} else\{ ....statements; \} if(condition) \{ ....statements; \} elseif(condition) \{ ....statements; \} else\{ ....statements; \} |
switch(condition) { caseABC : ....statements; ....//穿透,一定要做出注释 caseDEF : ....statements; ....break; caseXYZ : ....statements; ....break; ....default: ....statements; ....break; } |
▽ --- 代表空行 /** * */ ▽ packageXXX.XXX; ▽ importXXX.XXX.XXX.XXX; ▽ /** *注释 */ publicclassUserFileAccess { ▽ // privateintmyObjId; ▽ /** * */ publicUserFileAccess() { ??? \} ▽ /** * */ publicvoidgetCtlInfo() { intcount; String msg; ▽ count = 100; ??? ▽ //实现代码注释前空行 msg = "MESSAGE"; ▽ count = dataCount; if(count == 0) { ??? } } } ▽ /** * */ privateclassUserFileRead {...} |
// Create a new identity matrix Matrix4x4 matrix = newMatrix4x4();
// Precompute angles for efficiency doublecosAngle = Math.cos(angle); doublesinAngle = Math.sin(angle);
// Specify matrix as a rotation transformation matrix.setElement(1, 1, cosAngle); matrix.setElement(1, 2, sinAngle); matrix.setElement(2, 1, -sinAngle); matrix.setElement(2, 2, cosAngle);
// Apply rotation transformation.multiply(matrix); |
//使用这种缩进,突出主要功能语句。 if((condition1 && condition2) ........|| (condition3 && condition4) ........||!(condition5 && condition6)) { ....doSomethingAboutIt();} //避免使用这种缩进,主功能语句不突出。 if((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { ....doSomethingAboutIt();}
} |
可以使用如下三种表达方式,条件要用括号括起来。 alpha = (aLongBooleanExpression) ? beta : gamma; alpha = (aLongBooleanExpression) ? beta : gamma; alpha = (aLongBooleanExpression) ...............? beta ...............: gamma |
第四章命名规范
一般命名规范
示例: //推荐 com.esse.business Java.lang.util //避免 com.Esse-tech.buSiness |
Query, DataAccess,ReportBuilder
IQuery, IDataAccess,IReportBuilder
UserManagerImpl,ClassLoader,HttpHeaderResult
实现类如需要与接口做区分,那么在后面加上Impl,就像上面的UserManagerImpl
如果已经接口已经命名为I+帕斯卡命名法形式,对应实现类可以不用加上Impl
public interface Runnable{
....public void run();
}
public interface Accessible{
....public ContextgetContext();
}
userName, objectFactory, entrys, list
MAX_TIMES, DEFAULT_NAME
//推荐 if(times == MAX_TIMES) { ... } //避免 if(times == 25) { ... } |
getName, initialize, addParameter, deleteUser |
exportHtmlSource(); // 避免: exportHTMLSource(); openDvdPlayer(); // 避免: openDVDPlayer(); |
void setTopic(Topic topic) // 避免: void setTopic(Topic value) // 避免: void setTopic(Topic aTopic) // 避免: void setTopic(Topic t) voidconnect(Database database) // 避免: void connect(Database db) // 避免: void connect(Database oracleDB) 当同时定义多个属于同一个类的变量时,把类型作为实例的后缀,如: Point startPoint; Point centerPoint; 这样做是为了从实例名就可以推断它的类型名称。 |
for(inti =0;i < times; i++)\{ ... \} |
特殊命名规范
isUsed, isEmpty,isVisible,isFinished 有时也可以使用 has,can,should: booleanhasLicense(); booleancanEvaluate(); booleanshouldAbort = false; |
vertex.findNearestVertex(); matrix.findSmallestElement(); node.findShortestPath(Node destinationNode); |
initializeFiles(); init(); initFontSet(); |
Collection<Point> points; int[] values; |
AbstractReportBuilder,AbstractBeanFactory |
tableNo, userNo,employeeNo |
get/set add/remove create/destroy start/stop insert/delete increment/decrement begin/end first/last up/down min/max next/previous old/new open/close show/hide suspend/resume |
boolisError; // 避免: isNoError boolisFound; // 避免: isNotFound |
AccessException, RuntimeException |
classDefaultTableCellRenderer implementsTableCellRenderer { ... } |
classUnitManager { privatefinalstaticUnitManager instance = newUnitManager(); privateUnitManager() { ... } publicstaticUnitManagergetInstance() { returninstance; } } |
classPointFactory { publicPoint newPoint(...) { ... } } |
第五章注释规范
概述
代码中为什么要包含注释?
对代码进行注释,是在代码可读性的基础上,使用自然语言对代 码所表达的意思进行阐述。这并不意味着说代码可以写的很烂,注释写的很详细,这不是好的方式。好的代码是自解释的,如果代码可读性很好,命名表意丰富,清 晰,一般不需要特别多的注释。对于类,主要着重要描述它的职责,即它能干什么,对于复杂的算法实现,应该使用内部实现注释,说明算法的主要思路,对于长方 法,要让阅读代码的人比较容易的明白方法实现的主要流程。反之,对于一看就懂的方法,则不需要进行注释,比如get/set 方法。
一般原则
注释内容
/** * Project: project Name * * File Created at 2009-11-17 * $Id$ * * Copyright 2008 - 2009 Alibaba.com Croporation Limited. * All rights reserved. * * This software is the confidential and proprietary information of * Alibaba Company. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Alibaba.com. */ packagecom.alibaba.aliai.utils;
importjava.io.Serializable; importjava.text.Format; importjava.util.HashMap; importjava.util.List; importjava.util.Map;
importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory;
importcom.alibaba.aliai.site.service.IPostJobService; importcom.caucho.hessian.client.HessianProxyFactory;
//① 代码的版权信息。 //② 类描述信息,描述类的主要职责和用处。 //③ 方法描述信息,描述方法是做什么的,如何调用,最好给出调用代码示例。 //④ JavaDoc tags ,用来生成Html 形式的API 文档 //⑤ 内部实现注释,用于描述复杂的算法,长方法,从为什么要这么做角度去描述 //尽可能在类描述中加入代码调用示例,使用<pre></pre>标记,提示JavaDoc 工具不要改变格式. /** * DateFormat is an abstract class for date/time formatting formats and parses * dates or time in a language-independent manner. * * <pre> * myString = DateFormat.getDateInstance().format(myDate); * </pre> * * <pre> * DateFormatdf = DateFormat.getDateInstance(); * for (inti = 0; i<myDate.length; ++i) { * output.println(df.format(myDate[i]) + "; "); * } * </pre> * * @see Format * @see java.util.TimeZone * @version 1.51 10/20/10 * @author author1,author2 */ publicabstractclassTest extendsFormat { //使用@deprecated 废弃方法,不要删掉它。 /** * @deprecated */ /* * Get a default date/time formatter that uses the SHORT date and the time. * public final static DateFormatgetInstance() { return * getDateTimeInstance(SHORT, SHORT); } */ //包含代码调用示例 //使用行末注释对深层嵌套代码进行注释 publicvoidtest() { for(inti = 0; i< 10; i++) { for(intj = 0; j < 10; j++) { while(1== 1) { if(1== 2) { switch(2) { case1: break; case2: break; }// end switch }//end if }//end while }//end for i }//end for j } } ;陈春霞<wb-chunxia.chen@alibaba-inc.com>;霍 丁<ding.huod@alibaba-inc.com>;李如<wb-liru1985@alibaba- inc.com>;刘艳欣<wb-liuyanxin.l@alibaba-inc.com>;杨冬<wb- yangdong@alibaba-inc.com>;陈传克<wb-chenchuanke@alibaba-inc.com>;王 伟<wb-xuehunbense@alibaba-inc.com>;郭子球<wb-guoziqiu@alibaba- inc.com>;莫狄<diping.hdp@alibaba-inc.com>; |
Thread.sleep(1000); //避免,无法体现sleep 是静态方法还是实例方法 thread.sleep(1000); |
/*\* \* 报表构建器,主要职责: \* 1.创建拷贝报表模版 \* 2.填充报表数据 \* 3.构建报表 \* 4.画图处理 \*/ |
标签:
原文地址:http://www.cnblogs.com/pandalixiao/p/5484528.html