软件实现-图书管理系统(共15页).doc
精选优质文档-倾情为你奉上软件实现(图书管理系统)1 引言 1.1目的和作用 衡量一个程序的质量,主要有两个方面:运行质量和代码质量。一个稳定运行的程序并不等同于优良的程序,有可能其源代码可读性极差,不具有低成本的可维护性,以后的升级或者新员工接手时都会非常困难,对公司来说,意味着更高的资源投入,对工程师来说,意味着精力时间的浪费,甚至会引起对程序的抵制情绪,导致推翻重新实现,降低了软件复用度。当然,程序的运行质量是必须保证的,否则代码再规范也是一个废品。事实上,程序的不良书写风格和错误的写法往往是滋生错误的温床,而且很大一部分反复出现的错误是同一个原因造成的。本文档结合一些常见的错误或者危险的代码,规定了编码的规范,按照规范上的要求编码,不仅可以使不同人写的代码看起来很统一,降低了交流的障碍和工作转接的成本,而且能够规避很多反复出现的程序错误。 1.2 文档概述 该规范定义了良好的编程风格,内容涉及排版,可读性,可维护性,可测性等方面。2 编码规范2.1 文件组织每个Java源文件包含一个单独的Public类接口或接口。当private类和接口与某个Public类有关部门时,可以把他们放在同一源文件中作为Public类。Public类应为文件中第一个类或接口。Java源文件中有下列顺序:(1)开头注释;(2)包和引用声明,如:package u.lms.utils;import java.sql.Connection;import java.sql.DriverManager;(3)类和接口定义下面表格按序定义了一个类或接口的定义的各个部分。表5.1类和接口定义序号类/接口定义部分说明1类/接口文档注释(/*.*/)见注释2类/接口声明3类/接口执行注释可选,需包含不在类/接口文档注释的关于类/接口的所有信息4类静态变量先是Public类变量,再protected,再private5实例变量同上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; /Good2.3 注释注释是帮助程序读者的一种手段。最好的注释是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序。Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释使用/ * * / 和/界定的注释。文档的注释(被称为“doc comments”)是Java独有的,并由/* * */界定。文档注释可以通过javadoc工具转换 HTML文件。2.3.1 文件头注释一个文件由被空行隔开的节和可选的标识节的注释组成。一个包声明和接口声明需用至少一个空行隔开。每个文件需在开头包括一个注释块,提供以下信息:版权声明,修改历史。/*数据库连接管理类 * author WangLiyun * version1.0 */2.3.2类注释每个源文件需在类声明前包含一个注释,提供以下信息:作者,版本。/* *<pre> * Window win = new window(parent); * win.show(); *</pre> * Sami Shaic *version % I %,% G % *see java.awt.BaseWindow *see java.awt.Button */ class window extends BaseWindow 2.2.3 方法头注释每个函数要在开头提供一个注释,包含以下信息:描述做了什么,如何完成的;假设,前提,限制;输入输出,包括返回值。/* * 用户登录 * * param mapping * param form * param request * param response * return * throws ServletException */2.3.4 定义注释多数域都需要描述其目的的简单注释。private String username;/ 用户名2.3.5 注释风格程序可以有四中实现注释的风格:块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。下面用例子来解释。(1) 块注释(block Comments)/* * 保存帐号 * * param accountForm*/(2) 单行注释(single-line Comments)if (condition)/*Handle the condition. */(3) 尾端注释(trailing Comments) if (a = = 2) return TRUE; /*special case */ (4)行末注释(end-of-line Comments)private String username;/ 用户名2.4 声明2.4.1每行声明变量的数量(Number Per Line)推荐一行议购声明,因为这样有利于写注释。2.4.2 布局(Placement)只在代码块的开始处声明变量(一个块是指任何被包含在大括号“”和“”中间的代码。不要在首次用到该变量时才声明之。避免声明的局部变量覆盖上一级的变量。2.4.3初始化(Initialization)尽量在声明局部变量的同时初始化。唯一不这样做的理由是变量的初始值依赖于某些先前发生的计算。2.4.4 类和接口的声明(Class and Interface Declaration)当编写类和接口时,应该遵循以下格式规则:(1) 在方法名与其参数列表之前的左扩号“(”间不要有空格。(2) 左大扩号“”位于声明语句同行的末尾。(3) 右大括号“”另起一行,与相应的声明语句对齐,除非是一个空语句,“”应紧跟在“”之后。public void setUsername(String username) this.username = username;(4) 方法与方法之间一空行分隔。2.5 语句(Statements)2.5.1简单语句(Simple Statements)每行至多包含一条语句,例如:argv + +; /Correctargc - - ; /Correctargv + +; argc - - ; /AVOID!2.5.2 复合语句(Compound Statements)复合语句是包含在大括号中的语句序列,形如“语句”。例如下面各段。(1) 被括其中的语句应该较之复合语句缩进一个层。(2) 左大括号“”应位于复合语句起始行的行尾;右大括号“”应另起一行与复合语句首行对齐。(3) 大括号可以被用于所有语句,包括单个语句,只有这些语句诸如此类if-else 或for 控制语句的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。2.5.3 返回语句(return Statements)一个返回值的return语句不使用小括号“()”,除非它们以美中不足方式使返回值更为显见。 public String getUsername() return username;2.5.4 if,if-else, if else-if else语句if-else语句应具有如下格式:if (condition) statement; if (condition) statement; else statement; if (condition) statement; else if (condition) statement; else statement; 注意:if语句总是用“”和“”括起来,避免使用如下容易引起错误的格式:if (condition)/AVOID!this omits the braces! Statement;2.5.5 for 语句(for Statements)一个for语句应该具有如下格式:for (int i = 0; i < ids.length; i+) deleteAccount(idsi);一个空的for语句(所有工作都在初始化,条件判断,更新子句中完成)应该具有如下格式:for (initialization;condition;update) statement当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量。而导致复杂度提高。如果需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。2.5.6 while语句(while Statements)一个while语句应该具有如下格式:while (rs.next() AccountForm accountForm = new AccountForm();accountForm.setId(rs.getString("id");accountForm.setUsername(rs.getString("username");accountForm.setType(rs.getString("type");accountList.add(accountForm);2.5.7 do-while语句(do-while Statements)一个do-while语句应该具有如下格式:do .while(condition)2.5.8 switch语句(switch Statements)一个switch语句应该具有如下格式:switch (condition)2.5.9 try-catch语句(try-catch Statements)一个try-catch语句应该具有如下格式:try Class.forName(DBDriver);conn = DriverManager.getConnection(DBUrl, DBUser, DBPassword); catch (ClassNotFoundException ex) ex.printStackTrace();throw new CustomException("找不着驱动程序", ex); catch (Exception ex) ex.printStackTrace();throw new CustomException("数据库连接错误", ex);一个try-catch语句后面也可紧跟着一个finally语句,不论try代码块是否顺利执行完,它都会执行。try Class.forName(DBDriver);conn = DriverManager.getConnection(DBUrl, DBUser, DBPassword); catch (ClassNotFoundException ex) ex.printStackTrace();throw new CustomException("找不着驱动程序", ex); catch (Exception ex) ex.printStackTrace();throw new CustomException("数据库连接错误", ex);finally if(conn!=null) conn.close();2.6 命名规范命名规范使程序更易读,从而易于理解。它们可以提供一个有关标识符功能的信息,以助于理解代码,不论它是一个常量,包,还是类。表5.2 标识符命名标识符类型命名规则例子包(Packages)一个唯一的包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com、edu、gov、mil、net、org或1981年ISO3166标准所指定的标识国家的英文双字符代码。包名的后缀部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能一特定目录名的组成来区分部门(department),项目(project)机器(machine),或注册名(login names) com.sun.engcom.apple.quicktime.v2edu.cmu.cs.bovik.cheese类(Class)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。尽量使类名简洁而富于描述。使用完整单词,避免缩写词。(除非缩写词已被广泛使用,像URL,HTML)class Raster;class ImageSprite;接口(Interface)大小写规则与类名相似interface ResterDelegateinterface Storing方法(Methods)方法名是一个动词,采用大小写混合的方式,第一个单词首字母小写,其后单词的首字母大写。run( );runFast( );getRackground( )变量(Variables)除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语发上是允许的。变量名应简短且富于描述。变量名的选用应该易于记忆,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量,临时变量通常被取名为 i,j,k,m,和n,它们一般用于整型,c,d,e,它们一般用于字符型。char c;int i;flost myWidth;实例变量(Instance Variables)大小写规则和变量名相似,除了在前面需要一个下划线int_comployeeId;String_nameCustomer_customer常量(Constants)类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。(尽量避免ANSI常量,容易引起错误)static final int MIN_WIDTH=4;static final int MAX_WIDTH=999;static final int GET_THE-CPU=1;2.7代码范例(Code Examples)/ *账户管理控制类 * author WangLiyun * */package u.lms.action;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import mons.logging.Log;import mons.logging.LogFactory;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import u.lms.DaoFactory;import u.lms.dao.IAccountDao;import u.lms.dao.IBookDao;import u.lms.form.AccountForm;import u.lms.form.BookForm;public class AccountAction extends DispatchAction private static final Log logger = LogFactory.getLog(AccountAction.class);/* * 用户登录 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward logon(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException AccountForm accountForm = (AccountForm) form;boolean isAccount = false;try IAccountDao iAccountDao = DaoFactory.getInstance().getAccountDao();isAccount = iAccountDao.isAccount(accountForm);if (isAccount) HttpSession session = request.getSession();session.setAttribute("username", accountForm.getUsername();session.setAttribute("type", accountForm.getType();/ 如果是管理员,则跳转到indexif (accountForm.getType().equals("1") return mapping.findForward("index");else return mapping.findForward("indexR"); else request.setAttribute("invalidAccount", "invalidAccount");return mapping.findForward("logon"); catch (Exception e) logger.error("登录出错", e);throw new ServletException("登录出错", e);/* * 注销用户 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward logout(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException try HttpSession session = request.getSession();session.invalidate();return mapping.findForward("logon"); catch (Exception e) logger.error("注销出错", e);throw new ServletException("注销出错", e);/* * 添加帐号 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward save(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException AccountForm accountForm = (AccountForm) form;try IAccountDao iAccountDao = DaoFactory.getInstance().getAccountDao();iAccountDao.saveAccount(accountForm);return mapping.findForward("success_save"); catch (Exception e) logger.error("添加帐号出错", e);throw new ServletException("添加帐号出错", e);/* * 删除帐号信息 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward delete(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException try String ids = request.getParameterValues("id");IAccountDao iAccountDao = DaoFactory.getInstance().getAccountDao();iAccountDao.deleteAccount(ids);return mapping.findForward("success_delete"); catch (Exception e) logger.error("删除帐号信息出错", e);throw new ServletException("删除帐号信息出错", e);/* * 查找帐号信息 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward query(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException AccountForm accountForm = (AccountForm) form;List accountList = new ArrayList();try IAccountDao iAccountDao = DaoFactory.getInstance().getAccountDao();accountList = iAccountDao.getAccounts(accountForm.getUsername(),accountForm.getType();request.setAttribute("accountList", accountList);return mapping.findForward("accountList"); catch (Exception e) logger.error("查找帐号信息出错", e);throw new ServletException("查找帐号信息出错", e);/* * 在更新页面显示帐号信息 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward updateInit(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException try String id = request.getParameter("id");IAccountDao iAccountDao = DaoFactory.getInstance().getAccountDao();AccountForm accountForm = iAccountDao.getAccount(id);request.setAttribute("accountForm", accountForm);return mapping.findForward("accountUpdate"); catch (Exception e) logger.error("查找帐号信息出错", e);throw new ServletException("查找帐号信息出错", e);/* * 更改密码 * * param mapping * param form * param request * param response * return * throws ServletException */public ActionForward update(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ServletException AccountForm accountForm = (AccountForm) form;try String username = accountForm.getUsername();String type = accountForm.getType();String password = request.getParameter("password");if (username = null | username.equals("") / 如果没有帐号的id,则从session中 来获取需要修改密码的帐号用户名HttpSession session = request.getSession();username = (String) session.getAttribute("username");type = (String) session.getAttribute("type");accountForm.setUsername(username);accountForm.setType(type);IAccountDao iAccountDao = DaoFactory.getInstance().getAccountDao();iAccountDao.updateAccount(accountForm);return mapping.findForward("success_update"); catch (Exception e) logger.error("更改密码出错", e);throw new ServletException("更改密码出错", e);专心-专注-专业