1.为何须要要规范管理
a.web项目臃肿,不利于部署与管理,使用体验差
b.项目中使用技术驳杂,可读性差
c.项目业务不统一,每每开发出来的代码通用性差,扩展性差
d.代码命名没有统一规范,注释少
e.人员使用变更频繁,习惯性带入我的开发习惯,接手项目困难
f.管理人员对代码审查薄弱
2.如何规范管理
a.为了保证质量,下降成本,注重代码审查
b.强制开发人员遵照项目开发代码命名等规范
c.针对业务复杂的方法,作好注释
e.坚定剔除一些扩展性差,不易维护的恶性代码web
下面说是整理的一些关于代码规范的具体措施算法
为了保证公司编写出的程序都符合相同的规范,并且便捷,保证一致性、统一性更符合构件化的要求而创建的程序编码规范,要使程序易懂。app
适用于企业全部基于JavaEE软件开发项目。ide
全部命名(类、函数、变量..)均要求意义明确易于理解,尽可能使用有实际意义的英文单词或英文单词的缩写,避免在代码中直接使用数字等不肯定意义的词,更切忌使用中文拼音的首字母。命名推荐使用驼峰命名方式函数
外部注释指对文件、类、方法等添加注释头,能够利用Eclipse的注释模板功能快速的添加注释,注释模板设置方法,Eclipse->Windows->Preferences->Java->Code Style->Code Templates->Comments现统一规定以下:ui
Files:编码
/** *@Title: ${file_name} *@Package ${package_name} *@Description: ${todo} *@author finger *@date ${date} ${time} *@version V1.0 */
Types:lua
/** *@title ${type_name} *@descript ${todo} *@author finger *@date ${date} ${time} *@version V1.0 */
Fields:spa
/** *@Fields ${field} ${todo} */
Constructors:命令行
/** *<p>Title: </p> *<p>Description: </p> *${tags} */
Methods:
/** *@title ${enclosing_method} *@descript ${todo} *@param ${tags} *@return ${return_type} *@throws */
Overriding methods:
/*(non Javadoc) *<p>Title: ${enclosing_method}</p> *<p>Description: </p> *${tags} *${see_to_overridden} */
Delegate methods:
/** *${tags} *${see_to_target} */
Getters:
/** *@return the ${bare_field_name} */
Setters:
/** *@param ${param} the ${bare_field_name} to set */
外部注释需在必要的地方补充完整如下信息
@descript 描述成员方法的功能及存在的缘由 @author 名称 后加上相应的做者 @version 文本 插入指定文本的版本信息 @param 参数-名称描述 @return返回值描述 @exception 完整的类名称 描述信息 @throws 完整的类名称 描述信息 @see 引用其余类,格式以下:@see 类名 @see 完整类名 @see 完整类名#方法名 {@link引用} @Override 重载函数必须在函数头添加剧载标示
Java源码中除静态常量定义外应禁止使用下划线(_)做为各类变量、函数、接口、类名等各类命名的字符,命名应尽量不使用拼音及拼音缩写,而改用规范的英文翻译单词命名。其余具体命名规范以下:
Package的名字应为所有小写单词组成,不该包含大写字母、数字等其余字符,单词应为完整的单词或规范且公认的缩写。
例:com.companyName.mobile.app
Class的名字应为大写字母开头,后面单词也需大写字母开头。
例:TaskDetailActivity
接口命名同Class
常量名字全部字符均须大写,单词间使用下划线(_)作分隔符。
例:CONNECT_TIMEOUT
变量的命名主要分如下两种方法:
Camel标志法:首字母是小写,接下来的单词都以大写字母开头。对于自定义的类或不经常使用的类对象使用该种命名法则(除下述外的类型)。
代码的书写规范主要从注释和书写习惯对代码进行一个规范。一段规范的代码不只便于调试及时发现错误所在,更能给他人或者往后本身维护带来许多便利,须要注意如下几点:
1. 注释文档
2. 段落化
3. 多行语句段落化
4. 使用空格和空行
5. 方法不能太长,遵循30秒规则
6. 定义消息的传递,在注释中体现
7. 简短的命令行
8. 将比较的常数放在左方,以防止误写为赋值语句
缩进通常参照Eclipse默认Format的缩进,Eclipse使用Ctrl+Shift+F快捷键来快速格式化当前文件代码,默认缩进为1个Tab即4个空格的字符长度。语句块的{},其中{要跟在分块开始语句以后,如:函数定义、if条件和循环语句等末尾,else语句不单独另起一行。
例:
if (“abcd”.equals()){ …… }else{ …… }
原则上变量、类、常量数据和函数在其类型,修饰名称之间适当空格并据状况对齐。关键字原则上空一格,如:if ( ... ) 等。运算符的空格规定以下:"::"、"->"、"["、"]"、" "、"--"、"~"、"!"、" "、"-"(指正负号)、"&"(引用)等几个运算符两边不加空格(其中单目运算符系指与操做数相连的一边),其它运算符(包括大多数二目运算符和三目运算符"?:"两边均加一空格,在做函数定义时还可据状况多空或不空格来对齐,但在函数实现时能够不用。","运算符只在其后空一格,需对齐时也可不空或多空格。不管是否有括号,对语句行后加的注释应用适当空格与语句隔开并尽量对齐。
原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不该超过屏幕太多,必要时适当换行,换行时尽量在","处或运算符处,换行后最好以运算符打头,而且如下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。变量定义最好经过添加空格造成对齐,同一类型的变量最好放在一块儿。以下例所示:
int Value;
int Result;
int Length;
Object currentEntry;
不得存在无规则的空行,好比说连续十个空行。程序文件结构各部分之间空两行,若没必要要也可只空一行,各函数实现之间通常空两行,因为每一个函数还要有函数说明注释,故一般只需空一行或不空,但对于没有函数说明的状况至少应再空一行。
对于每个函数建议尽量控制其代码长度为53行左右,超过53行的代码要从新考虑将其拆分为两个或两个以上的函数。函数拆分规则应该一不破坏原有算法为基础,同时拆分出来的部分应该是能够重复利用的。对于在多个模块或者窗体中都要用到的重复性代码,彻底能够将起独立成为一个具有公用性质的函数,放置于一个公用模块中。
页宽应该设置为80字符。源代码通常不会超过这个宽度, 并致使没法完整显示, 但这一设置也能够灵活调整. 在任何状况下, 超长的语句应该在一个逗号或者一个操做符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符。
对变量最好始终进行定义初始化,以减少不容易调试的bug的产生。
对文件中的警告,应尽可能或极力去消除警告,对于暂时长时不使用的函数,可使用添加@SuppressWarnings("unused")来去除警告或在配置库(VSS、CVS、SVN)保存有备份的状况下暂时删除该方法。
对于比较应把常量放在前面,以避免误写为赋值语句或者形成没必要要的空指针错误。
例:
while (0 == flag){ …… } if (“abcd”.equals(sName)){ …… }
减小没必要要的语句和局部变量定义或冗余的写法
例:
冗余的写法:
boolean bResult = false; if ( a == b){ bResult = true; }else{ bResult = false; } return bResult;
正确的写法:
return a == b;
冗余的写法:
if (bIsFile == fasle) { …… }
正确的写法:
if (! bIsFile) { …… }
1. 使用 get/set 对类属性进行访问,这是Java 社区的核心编码规范。
2. 使用 is 前缀表示一个布尔变量和方法。
a) isUsed, isEmpty,isVisible,isFinished
i. 有时也可使用 has,can,should:
1. boolean hasLicense();
2. boolean canEvaluate();
3. boolean shouldAbort = false;
3. 在查询方法中应使用 find 做为前缀
vertex.findNearestVertex();
matrix.findSmallestElement();
4. 使用 initialize 作为对象初始化的方法前缀,也能够简写为init
initializeFiles();
init();
initFontSet();
5. 对于对象集合, 变量名称应使用复数。
Collection<Point> points;
int[] values;
6. 对于抽象类,应该使用 Abstract 前缀。
i. AbstractReportBuilder,AbstractBeanFactory
7. 对于表示编号的变量,应加 No 后缀。
a) tableNo, userNo,employeeNo
8. 常在一块儿使用的对称词汇,这些词汇一块儿使用,方法的表达意图天然能够互相推测和演绎。
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
9. 避免使用否认布尔变量
a) bool isError; // 避免: isNoError
b) bool isFound; // 避免: isNotFound
10. 异常类应该使用 Exception 作为后缀。
a) AccessException, RuntimeException
缺省接口实现应该使用 Default 前缀
class DefaultTableCellRenderer
implements TableCellRenderer {
…
}
11. 对于单例类(Singleton),应该使用getInstance 方法获得单例。
public class UnitManager { private final static UnitManager instance new UnitManager(); private UnitManager() { ... } public static UnitManager getInstance(){ return instance_; } }
12. 对于工厂类,进行建立对象的方法,应该使用 new 前缀
class PointFactory { public Point newPoint(...) ... } }