资源描述
软件产品开发规范(Java)1 .AOS开发规范1.1包命名1、包结构规定 包主要分为两类:第一类为系统公共包com.gxhtjs. tools 该包主要存放对数据库操作的增删查改的基本通用类。第二类为系统功能模块业务处理包,每个包都为一个独立的功能模块第三类为数据库操作包。2、包命名格式如:命名:以com.gxhtjs开头,最后个为英文单词不能用拼音缩写。3、包结构说明tools 工具包,该包的类都是具有通用性的包(包括通用算法类,数据库操作同类)。biz 业务处理包,将用来处理相关业务的类放入此包。如果相关的类是提供给页面调用时类在命名如:UserBizPlugin 表示用户信息业务处理插件。dao 数据库操作包,即对数据库表进行操作时,一般会以表名建立对应类用来操作对应的表。dao包中的所有具体操作类都将集成数据通用类。1.2表单命名规范 1、表单目录机构 如下图按系统大的功能模块,每个模块都是一个独立的包,包的命名必须符合英文帕斯卡命名规范。2、AOS项目文件名命名规范:所有的文件命名必须以gxhtjs_项目名_大模块名_小模块名.xml进行命名。例如: gxhx_gxncpsg_xxcj_yhdddjc_sbwsjy.xml 销售统计-银行对账单稽查-上报无实际有form的命名规则同文件名命名方式:如:gxhx_gxncpsg_xxcj_yhdddjc_sbwsjy 企业无系统有3、SQL语句编写SQL可以通过建立对应表的SQL xml,也可以在form上直接编写SQL尽量使用预编译的形式编写SQL特别是查询SQL。插件的开发规必须符合JAVA编程规范。1.3页面控件命名组件命名规范Button 按钮控件如:btnSubmitCheckBox 勾选框控件如:ckbGoodsCombox 下拉列表控件如:cbxFootboorDateChooser 日期选择控件如:dceTimesEdit 输入框控件如:edtNameIn 整数输入控件如:inMcountFloat小数输入框如:fltSellPriceHidden 隐藏值控件如:hidOrgidFlatButton 平按钮控件如:fbtnSubmitHSeperator 水平分隔线如:hprLineInSession session值控件如:isnOrgNameLabel 标签控件 如:lblNameListBox 列表控件如:lbxGoodsInfoPassword 密码控件如:pwdUserPasswordPrint 打印控件如:prtFpInfoReferEdit 参照控件如:retNsrsbhSeperator 垂直分隔线如:sprDownLineSpace 空方块控件 如:spePlanText 文本输入控件如:txtUserNameTextSeperator 带标题的水平分隔线如:tstLineTitle 标题控件如:titHeadInfoTrueFalseBox 双值控件如:tfbNumbersFileDownloader 文件下载控件如:fdlFileNameFileUploader 文件上传控件如:fupFileNameSTreeWidget 勾选框树控件如:stwOrgTreeTreeWidget 树控件如:twdOrgTreeDatagrid表格组件如:dtgUserListToolbar工具条组件如:tlbMyToolBar2JAVA编程规范2.1命名规则2.1.1包与类命名2.1.1.1包结构与类名前缀为了便于管理Java开发的应用,Java开发的应用包命名要求带有前缀com,采用“com.包名.子功能包名”的形式,如com.bcl表示基础工具包。在日常项目应用中积累的公共的内容希望能够形成通用的工具包,供项目组使用,工具包与应用包同级,采用“com.应用包名.子应用包名”的形式来组织项目开发的程序代码。包名和子功能包名要求具有实际的意义,从单词或缩写上能够看出包的意义,如 “com.bcl”表示基础工具组件的包,纳入公司的基础构件库进行管理,应用的包由项目组自己命名,命名的意义与具体的项目应用的意义相符。2.1.1.2类命名(1) 类名首字母应该大写,字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且将中间单词的首字母大写。例如:ThisIsAClassNamethisIsMethodOrFieldName若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。(2) 一行不要超过80个字符,并要注意折行时的写法。下面是例子:someMethod(longExpression1, longExpression2, longExpression3, longExpression4, longExpression5);var = someMethod1(longExpression1, someMethod2(longExpression2, longExpression3); 变量命名(Attributes/Properties)在本规则中,变量表示一个类属性(Attribute/Property)或一个类方法中的变量。变量可以是简单数据类型,如整数或浮点数,也可以是一个对象,如客户帐户、操作员等。本变量命名规则还包括一类特殊的变量:枚举数据常量2.1.2.1简单数据类型循环计数器在不影响程序可读性的前提下,可以使用传统的变量命名方式,如i、m、n等。除计数器以外的简单数据类型的变量由小写字母前缀+大写字母起头的英文单词(或单词缩写)组成。当然,循环计数器也可以使用这种命名方式,如nLoopCounter。数组在变量名前缀后加数组前缀“a”。简单数据类型前缀表:数据类型变量名前缀例子booleanbbCustomExist, baCustomExistcharccSymbol, caSymbolsbyteyyByte, yaBytesshortssHour, saHoursintnnLen, nLoopCounter, naLengthlongllMemory, laTimesfloatffLength, faLengthdoubleddMile, daMiles注:byte与int类型的前缀较特殊,使用时应注意2.1.2.2类实例命名类实例采用以下两种命名方法:1对于可以使用单个单词表示并且该单词与类名一致(不含类名的前缀)的类实例,可以使用全部是小写字母的实例名。例如operator(类WFOperator的实例)、task(类WFTask的实例)、date(类Date的实例)。2其它情况下使用以小写字母表示的类名(也可以是类名的缩写)和以大写字母起始的名称组成的标识名。例如strOperatorName、dateStart、customerList。常用的类名缩写如下表:类类名缩写例子Exceptionee, eAllExceptionSSBusiExceptionbebe, beLowBalanceSSDbAccessdbadba, dbaManagement, dbaCIFSSLogiExceptionlele, leInvalidValueStringstrstrOperatorName, strAddressWFOperatoropopCustomerManager, opDepartmentManager3类实例数组或集合的命名,可以在前两种情况的基础上用单词的复数形式表示,如tasks、opDepartmentManagers,也可以在变量前面加前缀“some”表示,如someTask、someOperator。2.1.2.3枚举数据常量枚举数据常量由表示枚举类型的前缀和常量名称组成。前缀全部由小写字母组成,名称使用大写字母起头的英文单词。例如交易类型的枚举常量命名如下:不明交易类型requestUnknown菜单请求requestMenuPrepare任务准备requestTaskPrepare任务提交requestTaskProcess提交requestReverseProcess登录requestLogin系统应用准备requestSysAppPrepare系统应用提交requestSysAppProcess2.1.3类方法命名2.1.3.1存取类型的类方法命名对于直接操作类属性的方法,命名使用前缀“get”、“is”和“set”表示存或取类属性,后跟大写字母起头的英文单词。示例如下:FieldTypeGetternameSetternamefirstNameStringgetFirstName()setFirstName()addressSurfaceAddress objectgetAddress()setAddress()persistentBooleanisPersistent()setPersistent()customerIdIntgetCustomerId()setCustomerId()orderItemsArray of OrderItem objectsgetOrderItems()setOrderItems()2.1.3.2一般类型的类方法命名使用“动词”+“名词短语”的命名格式,其中动词使用小写字母。例如invokeProduct()、analyseRiskItem()、openAccount()、refreshOutPutStream()2.2源程序结构源程序按以下结构进行组织:程序区说明Package区使用关键字“package”定义当前类的包系统import区用户import区类说明类成员属性定义类方法定义注意:为了便于使用文档工具自动生成程序文档,程序员必须严格遵守格式说明。2.3 Package区定义类所属的包,例如:package Main;2.4 Package区定义需要引入的系统资源,例如:import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletException;import java.io.IOException;import java.util.Vector;2.5用户import区定义需要引入的本系统内部的包,例如:import SS.*;import App.*;2.6类说明类说明使用如下格式:/* * 类的详细说明 * * author 类创建者姓名 * author 其他作者姓名 * version 1.00 9999/99/99 类创建者姓名 * 9.99 9999/99/99 修改者姓名 修改内容说明* function illuminate * */格式说明:项目规则备注起始行/*该行不允许再有其他内容说明行 * 说明内容说明行中对该类的功能进行说明,可以有多个说明行作者行 * author 姓名如果有多名作者,则分写几个作者行,类创建者在第一个作者行版本行 * version 1.00 9999/99/99 姓名 * 9.99 9999/99/99 姓名“version”为创建版本行。创建版本行的版本号固定为1.00,日期采用“年/月/日”格式,后跟作者姓名,不止一人时中间以“,”分隔。“”为修改版本行。修改版本行必须紧跟创建版本行,可以有多个修改版本行。修改版本行的版本号使用“主版本号.次版本号”格式,并且在姓名之后说明此次修改涉及的内容,其他要求与创建版本行的要求一致参考行 * see 参考内容列出供参考的类或类的方法与属性(使用格式“类名”列出参考类;使用格式“类名#方法或属性名”列出具体方法或属性名),可以有多个参考行结束行 */该行不允许再有其他内容描述格式描述信息将描述信息使用括起来例子:/* * 工作流管理子系统 * * author 李昕 * author 雷鸣 * version 1.00 2001/8/30 李昕 * 1.01 2001/9/3 李昕,雷鸣 优化invokeProduct()方法 * 1.02 2001/9/10 李昕 修改登录错误function illuminate */2.7类成员属性定义类成员属性定义分为说明与定义两部分。说明部分有三种方式,见下表:方式规则备注简单说明方式/* 说明内容 */属性定义对于功能比较单一的类属性,使用简单方式进行说明。说明行以“/*”起头,以“*/”结束。定义紧跟在说明后,另起一行。详细说明方式/* * 说明内容 * */属性定义对于功能复杂,需要详细说明的类成员属性,使用详细方式进行解释。详细说明部分第一行必须是“/* ”,不能有其它内容;中间的说明行以“ * ”起头,后跟说明内容;结束行必须是“ */”,也不能有其它内容。定义紧跟在说明后,另起一行。枚举类型说明方式/* 说明内容 */ 属性定义对于定义的枚举类型(包括常量)的类属性,其定义放在说明部分之后,处于同一行上。对于枚举类型,说明内容的格式为“枚举类型-内容说明”。简单说明方式的例子:/* 提示信息 */private String strMsg = null;详细说明方式的例子:/* * 详细的补充信息,此属性在缺省方式下不填, * 需要时通过addDetail(String strDetailMessage)方法补充 */private String strDetail = null;枚举类型(常量)说明方式的例子:/* 标记-格式 */ public static final String tagMessageFormat = MF;/* 标记-交易类型 */ public static final String tagRequestType = RT;/* 标记-工作流ID */ public static final String tagWorkflowId = WF;/* 标记-子任务ID */ public static final String tagSubtaskId = ST;/* 标记-操作员ID */ public static final String tagOperatorId = OP;/* 标记-口令 */ public static final String tagPassword = PW;2.8类方法定义类方法定义有方法说明与方法实现两部分,方法实现部分必须紧跟在方法说明部分下一行。2.8.1类方法说明类方法说明使用如下格式:/* * 类方法的详细使用说明 * * param 参数1 参数1的使用说明 * param 参数2 参数2的使用说明 * param 参数3 参数3的使用说明 * return 返回结果的说明 * throws 异常类型.错误代码 注明从此类方法中抛出异常的说明 * throws 异常类型 注明原来从此类方法的被调用方法中抛出的异常 * see 参考类1 * see 参考类2#类方法或类属性 */格式说明:项目类型规则备注起始行必选/*该行不允许再有其它内容说明行必选 * 说明内容说明行中对该方法的功能进行说明,可以有多个说明行参数行可选 * param 参数 参数说明一行对一个参数进行说明,可以有多个参数行。如果该方法没有任何参数,此项可省略。返回行可选 * return 返回结果说明对方法的返回结果进行详细说明,只允许有一个返回行,但是可以折行。如果该方法没有返回,此项可省略。直接引发行可选 * throws 异常.代码 抛出* 说明一行对一类异常的一种错误码进行说明,可以有多个直接引发行。代码使用系统预定义的代码常量,不能直接写数字。列出该方法直接抛出的异常,并说明在何种情况下抛出该异常。间接引发行可选 * throws 异常 说明抛出者一行对一类异常进行说明,可以有多个间接引发行。列出该方法调用的方法可能抛出的异常。参考行可选 * see 参考内容列出供参考的类或类的方法与属性(使用格式“类名”列出参考类;使用格式“类名#方法或属性名”列出具体方法或属性名),可以有多个参考行项目类型规则备注结束行可选 */该行不允许再有其他内容例子/* * 调用相关产品的指定方法 * * param request 请求参数 * param ac 环境参数 * param strProductMethod 产品方法名 * return 应用处理结果 * throws SSLogiException.codeNoEnoughParam 没有合适的方法或参* 数不足时抛出异常* throws SqlException MainScheduler.CallProduct()抛出 * see AppContext * see AppOutput#form * see SSLogiException * see SqlException */public abstract AppOutput invokeProduct(HttpServletRequest req, AppContext ac, String strProductMethod) throws SSLogiException,SqlException;类方法实现部分编程规范2.8.2.1程序注释的形式本系统中,程序注释分以下三种形式:l 详细说明式:较详细地解释后续处理的功能、算法等内容,可以有多行说明。/* * 说明内容 * */程序行l 简单说明式:简要说明后续处理,注释内容在一行内写完。/* 说明内容 */程序行l 行末说明式:紧接在一个程序行最右边,对该行程序进行简要说明,注释内容在一行内写完。程序行; /注释内容2.8.2.2局部变量原则上,一行中只允许定义一种类型的同一种用途的变量。局部变量定义必须在同一行定义语句后面加以注释,使用行末说明式的注释方法。一个变量只能用于一种用途。例如用于循环计数的变量就不要再用作记录函数的返回值。变量注释举例如下:int i, n;/循环计数器int nPromptMsgLength;/提示信息长度WFOperator operator;/当前操作员WFOperator opDepartmentManager;/当前部门主管2.8.2.3语句块完成一种功能的一组语句组成一个语句块。语句块之间应该使用空行适当分隔。在语句块前面必须加注释,详细说明其后的语句块的功能。注释采用详细说明或简单说明的注释形式。/* * 功能说明一 */语句语句 (空行以分隔两个功能的语句块)/* * 功能说明二 */语句语句在语句块的注释中,必须包括详细设计文档中的所有伪码,以标明此段程序是在实现哪部分详细设计。条件判断ifelse每一个条件判断语句前面使用详细说明或简单说明形式进行注释,在每一个分支内或者使用详细/简单说明形式进行注释,或者在条件分支语句后面以行末说明形式进行注释。例如在条件分支内进行注释:/* * 判断说明 */if () /* * 处理说明 */ else /* * 处理说明 */ 或者在条件分支语句末进行注释:/* * 判断说明 */if () /处理说明 else /处理说明 条件判断switchcasedefault与if式的判断语句类似,在每一个条件判断语句前面使用详细说明或简单说明形式进行注释,在每一个分支内或者使用详细/简单说明形式进行注释,或者在条件分支语句后面以行末说明形式进行注释。例如在条件分支内进行注释:/* * 判断说明 */switch () case : /* * 处理说明 */ break; default: /* * 处理说明 */ 或者在条件分支语句末进行注释:/* * 判断说明 */switch () case : /处理说明 break; default: /处理说明 循环控制语句循环语句块前必须使用详细说明或简单说明形式进行注释说明,在循环体内部的每一条循环控制语句或者使用详细/简单说明形式进行注释,或者使用行末说明形式进行注释说明。例如:/* * 循环处理说明 */for (;) break; /退出循环说明(如何种条件下退出循环) continue; /循环控制条件说明 方法调用在每一个方法调用前使用详细说明或简单说明形式进行注释,解释调用该方法的目的。例如:/* * 使用得到的方法名调用合适的应用功能 */output = invokeProduct(request, ac, strMethodName);编程风格的要求1大括号(“”与“”)的使用类定义中使用起止括号均左边齐头的大括号,例如:public Class Datetime类成员方法的实现部分,可以选择以下两种方式中的一种:起止括号均左边齐头或者起始括号在同一程序行尾部,终止括号左边齐头的格式,例如:/* * 方法原型部分较短时,使用下面的格式 */public double getBalance() throws SSLogiExceptionif(dBalance dAmount) /如果余额小于本次发生额,提示错误 /* * 方法原型部分较长时,使用下面的格式 */public double getBalance(String strItemName, int nItemType)throws SSException, SQLExceptionif(dBalance dAmount) /如果余额小于本次发生额,提示错误 其他位置一律使用起始括号在同一程序行尾部,终止括号左边齐头的格式,例如:if(dBalance dAmount) /如果余额小于本次发生额,提示错误 else/余额大于或等于本次发生额时 2缩进格式每一层嵌套向右侧缩进4个空格。以下列出了各种情况下的嵌套格式,请参考。函数定义:public double getBalance() throws SSLogiException条件语句ifelse:if(dBalance dAmount) /如果余额小于本次发生额,提示错误 或:if(dBalance dAmount) /如果余额不足,提示错误 else /否则(余额足),正常支取 或if(dBalance dAmount) /如果余额不足,提示错误 else if(bValid = true) /余额足,但账户不正常,提示错误 else /余额足,且账户正常,正常支取 条件分支语句switchcasedefault:switch(nSex) case sexMale: /男士 break; case sexFemale: /女士 break; default: /其他,提示错误 循环语句for:/* * 对所有的账户进行处理 */for(i = 0; i nAccountNum; i+) 循环语句while:/* * 对所有的账户进行处理 */i = 0;while(i nAccountNum) i+;循环语句dowhile:/* * 至少有一个账户,对所有的账户进行处理 */i = 0;do i+; while(i nAccountNum)3 空格的使用等号左右必须各有一个空格:strName = null;双目运算符左右必须各有一个空格:strFullName = strFirstName + strLastName;标点符号后面必须跟一个空格标点符号包括“,”、“;”等,下面列出几个例子。一行定义多个变量时,“,”后跟空格:int i, j; /循环变量在for循环中,“;”后跟空格:for(i = 0; i nAccountNum; i+)在有多个入口参数的函数调用中,“,”后跟一个空格:strCustomId = getCustomId(nCustomType, strCustomName)2.9编写类和方法时的一些约定l 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。l 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有时,方法必须非常大,但它们仍应只做同样的一件事情)。l 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:一个复杂的开关语句考虑采用“多形”机制;数量众多的方法涉及类型差别极大的操作时,考虑用几个类来分别实现;许多成员变量在特征上有很大的差别时,考虑使用几个类。l 让一切东西都尽可能地“私有”private。使库的某一部分“公共化”(一个方法、类或者一个字段等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素只有private字段才能在非同步使用的情况下受到保护。l 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作。l 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。l 当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除,并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取像这样的方案之前,请确定finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。l 在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。l 若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于直接超类,则无此必要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候它们依然有效。l 创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,人们就可享受到数组在编译期进行类型检查的好处。此外,为使用它们,数组的接收者也许并不需要将对象“造型”到数组里。l 尽量使用interfaces接口,不要使用abstract抽象类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface(接口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力于(或允许)具体的实施细节。l 在现成类的基础上创建新类时,请首先选择“新建”或“创作”。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个设计会变得没有必要的复杂。l 为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了类路径问题,请试试在类路径的每一个起点搜索一下同名的.class文件。
展开阅读全文