软件实现图书管理系统Word文档格式.docx
《软件实现图书管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《软件实现图书管理系统Word文档格式.docx(19页珍藏版)》请在冰点文库上搜索。
可选,需包含不在类/接口文档注释的关于类/接口的所有信息
4
类静态变量
先是Public类变量,再protected,再private
5
实例变量
同上
6
构造函数
7
方法
按功能排序
2.2文件格式标准
2.2.1缩排
缩排的单位,逻辑Tab键,统一缩进为4个字符。
2.2.2换行
当一个表示不能在一行内写完时,按以下规则断行:
(1)在逗号后断行。
(2)在操作符前断行。
(3)宁可选择较高级别(higher-level)的断开,而不是较低级别(lower-level)的断开。
(4)新的一行应该与上一行同一级别表达式的开头处对齐。
(5)如果以上规则导致代码混乱或者使代码都堆挤在右边,那就代之缩进8个空格。
2.2.3空白
应谨慎使用空行来突出代码。
例:
(1)在循环和条件块前后至少有一个空行。
(2)函数间至少有一个空行。
(3)注释前至少有一个空行。
2.2.4行长度
尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理之。
注意:
用于文档中的例子应该使用更短的行长,长度一般不超过70个字符。
2.2.5数值语句
不要用硬性代码数值。
用符号常量。
例:
nTimeout=3000;
//BAD!
!
NTimeout=MAX_ABC_DURATION;
//Good
2.3注释
注释是帮助程序读者的一种手段。
最好的注释是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序。
Java程序有两类注释:
实现注释(implementationcomments)和文档注释(documentcomments)。
实现注释使用/*……*/和//界定的注释。
文档的注释(被称为“doccomments”)是Java独有的,并由/**……*/界定。
文档注释可以通过javadoc工具转换HTML文件。
2.3.1文件头注释
一个文件由被空行隔开的节和可选的标识节的注释组成。
一个包声明和接口声明需用至少一个空行隔开。
每个文件需在开头包括一个注释块,提供以下信息:
版权声明,修改历史。
/*
*数据库连接管理类
*@authorWangLiyun
*@version1.0
*/
2.3.2类注释
每个源文件需在类声明前包含一个注释,提供以下信息:
作者,版本。
/**
*<
pre>
*Windowwin=newwindow(parent);
*win.show();
*<
/pre>
*
*@authorSamiShaic
*version%I%,%G%
*seejava.awt.BaseWindow
*seejava.awt.Button
classwindowextendsBaseWindow{
…
}
2.2.3方法头注释
每个函数要在开头提供一个注释,包含以下信息:
描述做了什么,如何完成的;
假设,前提,限制;
输入输出,包括返回值。
/**
*用户登录
*
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@return
*@throwsServletException
2.3.4定义注释
多数域都需要描述其目的的简单注释。
privateStringusername;
//用户名
2.3.5注释风格
程序可以有四中实现注释的风格:
块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。
下面用例子来解释。
(1)块注释(blockComments)
/**
*保存帐号
*@paramaccountForm
*/
(2)单行注释(single-lineComments)
if(condition){
/*Handlethecondition.*/
}
(3)尾端注释(trailingComments)
if(a==2){
returnTRUE;
/*specialcase*/
(4)行末注释(end-of-lineComments)
privateStringusername;
2.4声明
2.4.1每行声明变量的数量(NumberPerLine)
推荐一行议购声明,因为这样有利于写注释。
2.4.2布局(Placement)
只在代码块的开始处声明变量(一个块是指任何被包含在大括号“{”和“}”中间的代码。
不要在首次用到该变量时才声明之。
避免声明的局部变量覆盖上一级的变量。
2.4.3初始化(Initialization)
尽量在声明局部变量的同时初始化。
唯一不这样做的理由是变量的初始值依赖于某些先前发生的计算。
2.4.4类和接口的声明(ClassandInterfaceDeclaration)
当编写类和接口时,应该遵循以下格式规则:
(1)在方法名与其参数列表之前的左扩号“(”间不要有空格。
(2)左大扩号“{”位于声明语句同行的末尾。
(3)右大括号“}”另起一行,与相应的声明语句对齐,除非是一个空语句,“}”应紧跟在“{”之后。
publicvoidsetUsername(Stringusername){
this.username=username;
(4)方法与方法之间一空行分隔。
2.5语句(Statements)
2.5.1简单语句(SimpleStatements)
每行至多包含一条语句,例如:
argv++;
//Correct
argc--;
//AVOID!
2.5.2复合语句(CompoundStatements)
复合语句是包含在大括号中的语句序列,形如“{语句}”。
例如下面各段。
(1)被括其中的语句应该较之复合语句缩进一个层。
(2)左大括号“{”应位于复合语句起始行的行尾;
右大括号“}”应另起一行与复合语句首行对齐。
(3)大括号可以被用于所有语句,包括单个语句,只有这些语句诸如此类if-else或for控制语句的一部分。
这样便于添加语句而无需担心由于忘了加括号而引入bug。
2.5.3返回语句(returnStatements)
一个返回值的return语句不使用小括号“()”,除非它们以美中不足方式使返回值更为显见。
publicStringgetUsername(){
returnusername;
2.5.4if,if-else,ifelse-ifelse语句
if-else语句应具有如下格式:
if(condition){
statement;
}
if(condition){
}else{
statement;
}elseif(condition){
statement;
}else{
if语句总是用“{”和“}”括起来,避免使用如下容易引起错误的格式:
if(condition)//AVOID!
thisomitsthebraces{}!
Statement;
2.5.5for语句(forStatements)
一个for语句应该具有如下格式:
for(inti=0;
i<
ids.length;
i++){
deleteAccount(ids[i]);
一个空的for语句(所有工作都在初始化,条件判断,更新子句中完成)应该具有如下格式:
for(initialization;
condition;
update){
statement
当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量。
而导致复杂度提高。
如果需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。
2.5.6while语句(whileStatements)
一个while语句应该具有如下格式:
while(rs.next()){
AccountFormaccountForm=newAccountForm();
accountForm.setId(rs.getString("
id"
));
accountForm.setUsername(rs.getString("
username"
accountForm.setType(rs.getString("
type"
accountList.add(accountForm);
2.5.7do-while语句(do-whileStatements)
一个do-while语句应该具有如下格式:
do{
…….
}while(condition)
2.5.8switch语句(switchStatements)
一个switch语句应该具有如下格式:
switch(condition){
……
2.5.9try-catch语句(try-catchStatements)
一个try-catch语句应该具有如下格式:
try{
Class.forName(DBDriver);
conn=DriverManager.getConnection(DBUrl,DBUser,DBPassword);
}catch(ClassNotFoundExceptionex){
ex.printStackTrace();
thrownewCustomException("
找不着驱动程序"
ex);
}catch(Exceptionex){
数据库连接错误"
一个try-catch语句后面也可紧跟着一个finally语句,不论try代码块是否顺利执行完,它都会执行。
}finally{
if(conn!
=null)
conn.close();
2.6命名规范
命名规范使程序更易读,从而易于理解。
它们可以提供一个有关标识符功能的信息,以助于理解代码,不论它是一个常量,包,还是类。
表5.2标识符命名
标识符类型
命名规则
例子
包(Packages)
一个唯一的包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com、edu、gov、mil、net、org或1981年ISO3166标准所指定的标识国家的英文双字符代码。
包名的后缀部分根据不同机构各自内部的命名规范而不尽相同。
这类命名规范可能一特定目录名的组成来区分部门(department),项目(project)机器(machine),或注册名(loginnames)
com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
类(Class)
类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。
尽量使类名简洁而富于描述。
使用完整单词,避免缩写词。
(除非缩写词已被广泛使用,像URL,HTML)
classRaster;
classImageSprite;
接口(Interface)
大小写规则与类名相似
interfaceResterDelegate
interfaceStoring
方法(Methods)
方法名是一个动词,采用大小写混合的方式,第一个单词首字母小写,其后单词的首字母大写。
run();
runFast();
getRackground()
变量(Variables)
除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
变量名不应以下划线或美元符号开头,尽管这在语发上是允许的。
变量名应简短且富于描述。
变量名的选用应该易于记忆,能够指出其用途。
尽量避免单个字符的变量名,除非是一次性的临时变量,临时变量通常被取名为i,j,k,m,和n,它们一般用于整型,c,d,e,它们一般用于字符型。
charc;
inti;
;
flostmyWidth;
实例变量(InstanceVariables)
大小写规则和变量名相似,除了在前面需要一个下划线
int_comployeeId;
String_name
Customer_customer
常量(Constants)
类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。
(尽量避免ANSI常量,容易引起错误)
staticfinalintMIN_WIDTH=4;
staticfinalintMAX_WIDTH=999;
staticfinalintGET_THE-CPU=1;
2.7代码范例(CodeExamples)
/*
*账户管理控制类
packageu.lms.action;
importjava.util.ArrayList;
importjava.util.List;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
importmons.logging.Log;
importmons.logging.LogFactory;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
importorg.apache.struts.actions.DispatchAction;
importu.lms.DaoFactory;
importu.lms.dao.IAccountDao;
importu.lms.dao.IBookDao;
importu.lms.form.AccountForm;
importu.lms.form.BookForm;
publicclassAccountActionextendsDispatchAction{
privatestaticfinalLoglogger=LogFactory.getLog(AccountAction.class);
publicActionForwardlogon(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException{
AccountFormaccountForm=(AccountForm)form;
booleanisAccount=false;
try{
IAccountDaoiAccountDao=DaoFactory.getInstance().getAccountDao();
isAccount=iAccountDao.isAccount(accountForm);
if(isAccount){
HttpSessionsession=request.getSession();
session.setAttribute("
accountForm.getUsername());
accountForm.getType());
//如果是管理员,则跳转到index
if(accountForm.getType().equals("
1"
)){
returnmapping.findForward("
index"
);
}else{
indexR"
}
}else{
request.setAttribute("
invalidAccount"
"
returnmapping.findForward("
logon"
}
}catch(Exceptione){
logger.error("
登录出错"
e);
thrownewServletException("
*注销用户
publicActionForwardlogout(ActionMappingmapping,ActionFormform,
HttpSessionsession=request.getSession();
session.invalidate();
returnmapping.findForward("
注销出错"
*添加帐号
publicActionForwardsave(ActionMappingmapping,ActionFormform,
iAccountDao.saveAccount(accountForm);
success_save