1 基本原则
【原则1-1】首先是为人编写程序,其次才是计算机。
说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。
【原则1-2】保持代码的简明清晰,避免过分的编程技巧。
说明:简单是最美。保持代码的简单化是软件工程化的基本要求。不要过分追求技巧,否则会降低程序的可读性。
【原则1-3】所有的代码尽量遵循SUN的《Code Conventions for the JavaTM Programming Language》标准(参见:http://java.sun.com/docs/codeconv/)。
说明:编程时以公司的规范为准,公司的规范没有规定的内容参考上面的标准。
【原则1-4】编程时首先达到正确性,其次考虑效率。
说明:编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,其次考虑程序的效率和资源占用。
【原则1-5】保持一致性,尽可能多的使用相同的规则。
【原则1-6】尽可能复用、修正原有的代码。
说明:尽量选择可借用的代码,对其修改优化以达到自身要求。
【原则1-7】 尽量减少同样的错误出现的次数。
说明:事实上,我们无法做到完全消除错误,但通过不懈的努力,可以减少同样的错误出现的次数。
2 文件结构
程序布局的目的是显示出程序良好的逻辑结构,提高程序的准确性、连续性、可读性、可维护性。更重要的是,统一的程序布局和编程风格,有助于提高整个项目的开发质量,提高开发效率,降低开发成本。同时,对于普通程序员来说,养成良好的编程习惯有助于提高自己的编程水平,提高编程效率。因此,统一的、良好的程序布局和编程风格不仅仅是个人主观美学上的或是形式上的问题,而且涉及到产品质量,涉及到个人编程能力的提高,必须引起大家重视。
2.1 基本格式
【规则2-1-1】源代码文件(.java)的布局顺序是:包、import语句、注释、类。
正例:
package com.zte;
import java.awt.peer.CanvasPeer;
import java.io.*;
import com.zte.ums.uep.*;
/**
* <p>文件名称: 题目名称</p>
* <p>文件描述: 本类描述</p>
* <p>版权所有: 版权所有</p>
* <p>公 司: 有限公司</p>
* <p>内容摘要: // 简要描述本文件的内容,包括主要模块、函数及其功能的说明</p>
* <p>其他说明: // 其它内容的说明</p>
* <p>完成日期:// 输入完成日期</p>
* <p>修改记录1: // 修改历史记录,包括修改日期、修改者及修改内容</p>
* <pre>
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* </pre>
* <p>修改记录2:…</p>
* @version 1.0
* @author 作者姓名
*/
public class ClassName
{
}
【规则2-1-2】遵循统一的布局顺序来书写import语句,不同类别的import语句之间用空行分隔。
说明:package语句其后可跟import语句,而且与package间隔一个空行。import包的排列顺序为java开头的包在最前面,接下来是引自外部的包,再接下来是应用程序自身的包,即import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。
正例:
package com.zte;
import java.awt.peer.CanvasPeer; //java自身的包
import java.io.*;
import com.klg.field.*; //第三方的包
import com.zte.ums.uep.*; //程序自身的包
【规则2-1-3】程序中一行的代码和注释不能超过120列。
说明:包括空格在内不超过120列。
【规则2-1-4】if、else、else if、for、while、do等语句独占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 { }。
说明:这样可以防止书写失误,也易于阅读。
正例:
if (varible1 < varible2)
{
varible1 = varible2;
}
反例:下面的代码执行语句紧跟if的条件之后,而且没有加{},违反规则。
if (varible1 < varible2) varible1 = varible2;
〖建议2-1-1〗源程序中关系较为紧密的代码应尽可能相邻。
说明:这样便于程序阅读和查找。
正例:
length = 10;
width = 5; // 矩形的长与宽关系较密切,放在一起。
strCaption = “Test”;
反例:
length = 10;
strCaption = “Test”;
width = 5;
2.2 对齐
【规则2-2-1】 一般禁止使用制表符,必须使用空格进行缩排。缩进为4个空格。
说明:对于利用JBuilder等编程工具的,可以设置TAB键为4个空格代替。消除不同编辑器对制表符处理的差异。
【规则2-2-2】程序的分界符‘{’和‘}’应独占一行,‘}’同时与引用它们的语句左对齐。{ }之内的代码块使用缩进规则对齐。
说明:这样使代码便于阅读,并且方便注释。
do… while语句可以例外,while条件可与 } 在同一行。
正例:
void function(int var)
{
while (condition)
{
doSomething(); // 与{ }缩进4格
} //与引用它们的模块左对齐
}
反例:
void function(int var){
while (condition)
{
doSomething();
}
}
【规则2-2-3】多维的数组如果在定义时初始化,按照数组的矩阵结构分行书写。
正例:
int[][] number =
{
{1, 1, 1},
{2, 4, 8},
{3, 9, 27},
{4, 16, 64}
};
【规则2-2-4】相关的赋值语句等号对齐。
正例:
width = 50;
length = 20;
height = 40;
2.3 空行空格
【规则2-3-1】不同逻辑程序块之间要使用空行分隔。
说明:空行起着分隔程序段落的作用。适当的空行可以使程序的布局更加清晰。
正例:
void doSomething()
{
//[doSomething实现代码]
}
// 空一行
void doOtherThing()
{
[doOtherThing实现代码]
}
反例:
void doSomething()
{
[doSomething实现代码]
}
void doOtherThing()
{
[doOtherThing实现代码]
}
// 两个函数的实现是两个逻辑程序块,应该用空行加以分隔。
【规则2-3-2】一元操作符如“++”、“--”、“!”、“~”、(类型)等前后不加空格。“[]”“.”这类操作符前后不加空格。
正例:
!value
~value
++count
number[i] = 5;
box.getWidth();
【规则2-3-3】多元运算符和它们的操作数之间至少需要一个空格。
说明:空格的多少根据上下文调整。
正例:
value = oldValue;
total + value
number += 2;
【规则2-3-4】方法名之后不要留空格。
说明:方法名后紧跟左括号‘(’。
【规则2-3-5】‘(’向后紧跟,‘)’、‘,’ 、‘;’向前紧跟,紧跟处不留空格。‘,’之后要留空格。‘;’不是行结束符号时其后要留空格。
正例:
例子中的 凵 代表空格。
for (i凵=凵0;凵i凵<凵MAX_BSC_NUM;凵i++)
{
doSomething(width,凵height);
}
【规则2-3-6】注释符与注释内容之间要用一个空格进行分隔。
正例:
/* 注释内容 */
// 注释内容
反例:
/*注释内容*/
//注释内容
2.4 断行
【规则2-4-1】长表达式(超过120列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。
说明:
断行方法:
1. 在逗号后断行
2. 在操作符前断行
3. 较高级别断行优于较低级别的断行
对齐方法:
1. 将新行与同一级别的先前行的表达式的起始端对齐。
2. 条件表达式的续行在第一个条件处对齐。
3. for循环语句的续行在初始化条件语句处对齐。
4. 函数调用和函数声明的续行在第一个参数处对齐。
5. 赋值语句的续行应在赋值号处对齐。
6. 如果上述规则导致代码排列混乱或代码左边界少于两个缩进,可用两倍缩进替代。
下面是一些断行方法调用的示例:
正例:
someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
下面是两个断行算术表达式例子,第一个是优选方法,因为断行出现在括号表达式之外,属于较高级别的断行。
正例:
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //允许的断行方法
反例:
longName1 = longName2 * (longName3 + longName4
-longName5) + 4 * longname6; //应该避免的断行方法
下面是两个缩排方法的例子,第一个是传统的方式,第二个例子中如果采用传统方式缩排将导致第二行和第三行右边出现太多空白,因此,采用8个空格符替代。
//传统的缩排方法,第二行与第一行的括号对齐。
正例:
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother)
{
...//你代码的位置
}
//由8个空格符来替代与括号对齐的方法,以避免第二行、第三行出现太多的空格符
正例:
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother)
{
...//你代码的位置
}
对于if语句的行封装通常使用8空格规则,因为传统的4空格缩排方式使得有些语句容易被忽略掉,使if语句体难以理解。例如:
反例:
//不允许使用下面的缩进方法
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6))
{ //不好的缩进
doSomethingAboutIt(); //这样对齐的缩进方式很容易让阅读的人忽略掉这一行
}
正例:
//宜采用下面的缩进方法(分成三行的情况)
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;
【规则2-4-2】方法声明时,修饰符、类型与名称不允许分行书写。
正例:
public static double calculateArea(double width, double height);
反例:
public static double
calculateArea(double width, double height);
【原则1-1】首先是为人编写程序,其次才是计算机。
说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。
【原则1-2】保持代码的简明清晰,避免过分的编程技巧。
说明:简单是最美。保持代码的简单化是软件工程化的基本要求。不要过分追求技巧,否则会降低程序的可读性。
【原则1-3】所有的代码尽量遵循SUN的《Code Conventions for the JavaTM Programming Language》标准(参见:http://java.sun.com/docs/codeconv/)。
说明:编程时以公司的规范为准,公司的规范没有规定的内容参考上面的标准。
【原则1-4】编程时首先达到正确性,其次考虑效率。
说明:编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,其次考虑程序的效率和资源占用。
【原则1-5】保持一致性,尽可能多的使用相同的规则。
【原则1-6】尽可能复用、修正原有的代码。
说明:尽量选择可借用的代码,对其修改优化以达到自身要求。
【原则1-7】 尽量减少同样的错误出现的次数。
说明:事实上,我们无法做到完全消除错误,但通过不懈的努力,可以减少同样的错误出现的次数。
2 文件结构
程序布局的目的是显示出程序良好的逻辑结构,提高程序的准确性、连续性、可读性、可维护性。更重要的是,统一的程序布局和编程风格,有助于提高整个项目的开发质量,提高开发效率,降低开发成本。同时,对于普通程序员来说,养成良好的编程习惯有助于提高自己的编程水平,提高编程效率。因此,统一的、良好的程序布局和编程风格不仅仅是个人主观美学上的或是形式上的问题,而且涉及到产品质量,涉及到个人编程能力的提高,必须引起大家重视。
2.1 基本格式
【规则2-1-1】源代码文件(.java)的布局顺序是:包、import语句、注释、类。
正例:
package com.zte;
import java.awt.peer.CanvasPeer;
import java.io.*;
import com.zte.ums.uep.*;
/**
* <p>文件名称: 题目名称</p>
* <p>文件描述: 本类描述</p>
* <p>版权所有: 版权所有</p>
* <p>公 司: 有限公司</p>
* <p>内容摘要: // 简要描述本文件的内容,包括主要模块、函数及其功能的说明</p>
* <p>其他说明: // 其它内容的说明</p>
* <p>完成日期:// 输入完成日期</p>
* <p>修改记录1: // 修改历史记录,包括修改日期、修改者及修改内容</p>
* <pre>
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* </pre>
* <p>修改记录2:…</p>
* @version 1.0
* @author 作者姓名
*/
public class ClassName
{
}
【规则2-1-2】遵循统一的布局顺序来书写import语句,不同类别的import语句之间用空行分隔。
说明:package语句其后可跟import语句,而且与package间隔一个空行。import包的排列顺序为java开头的包在最前面,接下来是引自外部的包,再接下来是应用程序自身的包,即import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。
正例:
package com.zte;
import java.awt.peer.CanvasPeer; //java自身的包
import java.io.*;
import com.klg.field.*; //第三方的包
import com.zte.ums.uep.*; //程序自身的包
【规则2-1-3】程序中一行的代码和注释不能超过120列。
说明:包括空格在内不超过120列。
【规则2-1-4】if、else、else if、for、while、do等语句独占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 { }。
说明:这样可以防止书写失误,也易于阅读。
正例:
if (varible1 < varible2)
{
varible1 = varible2;
}
反例:下面的代码执行语句紧跟if的条件之后,而且没有加{},违反规则。
if (varible1 < varible2) varible1 = varible2;
〖建议2-1-1〗源程序中关系较为紧密的代码应尽可能相邻。
说明:这样便于程序阅读和查找。
正例:
length = 10;
width = 5; // 矩形的长与宽关系较密切,放在一起。
strCaption = “Test”;
反例:
length = 10;
strCaption = “Test”;
width = 5;
2.2 对齐
【规则2-2-1】 一般禁止使用制表符,必须使用空格进行缩排。缩进为4个空格。
说明:对于利用JBuilder等编程工具的,可以设置TAB键为4个空格代替。消除不同编辑器对制表符处理的差异。
【规则2-2-2】程序的分界符‘{’和‘}’应独占一行,‘}’同时与引用它们的语句左对齐。{ }之内的代码块使用缩进规则对齐。
说明:这样使代码便于阅读,并且方便注释。
do… while语句可以例外,while条件可与 } 在同一行。
正例:
void function(int var)
{
while (condition)
{
doSomething(); // 与{ }缩进4格
} //与引用它们的模块左对齐
}
反例:
void function(int var){
while (condition)
{
doSomething();
}
}
【规则2-2-3】多维的数组如果在定义时初始化,按照数组的矩阵结构分行书写。
正例:
int[][] number =
{
{1, 1, 1},
{2, 4, 8},
{3, 9, 27},
{4, 16, 64}
};
【规则2-2-4】相关的赋值语句等号对齐。
正例:
width = 50;
length = 20;
height = 40;
2.3 空行空格
【规则2-3-1】不同逻辑程序块之间要使用空行分隔。
说明:空行起着分隔程序段落的作用。适当的空行可以使程序的布局更加清晰。
正例:
void doSomething()
{
//[doSomething实现代码]
}
// 空一行
void doOtherThing()
{
[doOtherThing实现代码]
}
反例:
void doSomething()
{
[doSomething实现代码]
}
void doOtherThing()
{
[doOtherThing实现代码]
}
// 两个函数的实现是两个逻辑程序块,应该用空行加以分隔。
【规则2-3-2】一元操作符如“++”、“--”、“!”、“~”、(类型)等前后不加空格。“[]”“.”这类操作符前后不加空格。
正例:
!value
~value
++count
number[i] = 5;
box.getWidth();
【规则2-3-3】多元运算符和它们的操作数之间至少需要一个空格。
说明:空格的多少根据上下文调整。
正例:
value = oldValue;
total + value
number += 2;
【规则2-3-4】方法名之后不要留空格。
说明:方法名后紧跟左括号‘(’。
【规则2-3-5】‘(’向后紧跟,‘)’、‘,’ 、‘;’向前紧跟,紧跟处不留空格。‘,’之后要留空格。‘;’不是行结束符号时其后要留空格。
正例:
例子中的 凵 代表空格。
for (i凵=凵0;凵i凵<凵MAX_BSC_NUM;凵i++)
{
doSomething(width,凵height);
}
【规则2-3-6】注释符与注释内容之间要用一个空格进行分隔。
正例:
/* 注释内容 */
// 注释内容
反例:
/*注释内容*/
//注释内容
2.4 断行
【规则2-4-1】长表达式(超过120列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。
说明:
断行方法:
1. 在逗号后断行
2. 在操作符前断行
3. 较高级别断行优于较低级别的断行
对齐方法:
1. 将新行与同一级别的先前行的表达式的起始端对齐。
2. 条件表达式的续行在第一个条件处对齐。
3. for循环语句的续行在初始化条件语句处对齐。
4. 函数调用和函数声明的续行在第一个参数处对齐。
5. 赋值语句的续行应在赋值号处对齐。
6. 如果上述规则导致代码排列混乱或代码左边界少于两个缩进,可用两倍缩进替代。
下面是一些断行方法调用的示例:
正例:
someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
下面是两个断行算术表达式例子,第一个是优选方法,因为断行出现在括号表达式之外,属于较高级别的断行。
正例:
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //允许的断行方法
反例:
longName1 = longName2 * (longName3 + longName4
-longName5) + 4 * longname6; //应该避免的断行方法
下面是两个缩排方法的例子,第一个是传统的方式,第二个例子中如果采用传统方式缩排将导致第二行和第三行右边出现太多空白,因此,采用8个空格符替代。
//传统的缩排方法,第二行与第一行的括号对齐。
正例:
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother)
{
...//你代码的位置
}
//由8个空格符来替代与括号对齐的方法,以避免第二行、第三行出现太多的空格符
正例:
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother)
{
...//你代码的位置
}
对于if语句的行封装通常使用8空格规则,因为传统的4空格缩排方式使得有些语句容易被忽略掉,使if语句体难以理解。例如:
反例:
//不允许使用下面的缩进方法
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6))
{ //不好的缩进
doSomethingAboutIt(); //这样对齐的缩进方式很容易让阅读的人忽略掉这一行
}
正例:
//宜采用下面的缩进方法(分成三行的情况)
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;
【规则2-4-2】方法声明时,修饰符、类型与名称不允许分行书写。
正例:
public static double calculateArea(double width, double height);
反例:
public static double
calculateArea(double width, double height);