开发设计规范.docx_第1页
开发设计规范.docx_第2页
开发设计规范.docx_第3页
开发设计规范.docx_第4页
开发设计规范.docx_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

技术开发规范初稿北京中科天擎信息技术有限公司2016年11月12日目录一、JAVA代码规范31. 标识符命名规范31.1 概述31.2 包名41.3 类名41.4 方法名51.5 域(field)名71.6 局部变量名82. 代码格式82.1 源文件编码82.2 行宽82.3 包的导入82.4 类格式82.5 域格式82.5 方法格式92.6 代码块格式93. 注释规范113.1 注释 vs 代码113.2 Java Doc123.3 块级别注释123.4 行内注释144 最佳实践和禁忌144.1 每次保存的时候,都让你的代码是最美的144.2 使用log而不是System.out.println()144.3 每个if while for等语句,都不要省略大括号144.4 善用TODO:154.5 在需要留空的地方放一个空语句或注释,告述读者,你是故意的154.6 不要再对boolean值做true false判断154.7 减少代码嵌套层次164.8 程序职责单一174.9 变量的声明,初始化和被使用尽量放到一起174.10 缩小变量的作用域184.11 尽量不要用参数来带回方法运算结果19二、数据库表及字段命名规范201.数据库表命名规范:202.表字段命名规范:203.表设计规范:214.存储过程命名规范225.存储过程设计规范236.视图命名规范237.视图设计规范238.触发器命名规范249.触发器设计规范24一、 JAVA代码规范Java代码规范以SUN的标准Java代码规范为基础,本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以本文档为准。1. 标识符命名规范1.1 概述标识符的命名力求做到统一、达意和简洁。1.1.1 统一统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。1.1.2 达意达意是指,标识符能准确的表达出它所代表的意义,比如: newSupplier, OrderPaymentGatewayService等;而 supplier1, service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是 order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。1.1.3 简洁简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长, transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。1.1.4 骆驼法则Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: SupplierName, addNewContract,而不是 supplier_name, add_new_contract。1.1.5 英文 vs 拼音尽量使用通俗易懂的英文单词,如果不会可以向队友求助,实在不行则使用汉语拼音,避免拼音与英文混用。比如表示归档,用archive比较好, 用pigeonhole则不好,用guiDang尚可接受。1.2 包名使用小写字母如mon.settlment,不要mon.Settlement单词间不要用字符隔开,比如mon.settlment.jsfutil,而不要mon.settlement.jsf_util1.3 类名1.3.1 首字母大写类名要首字母大写,比如 SupplierService, PaymentOrderAction;不要 supplierService, paymentOrderAction.1.3.2 后缀类名往往用不同的后缀表达额外的意思,如下表:后缀名意义举例Service表明这个类是个服务类,里面包含了给其他类提同业务服务的方法PaymentOrderServiceImpl这个类是一个实现类,而不是接口PaymentOrderServiceImplInter这个类是一个接口LifeCycleInterDao这个类封装了数据访问方法PaymentOrderDaoAction直接处理页面请求,管理页面逻辑了类UpdateOrderListActionListener响应某种事件的类PaymentSuccessListenerEvent这个类代表了某种事件PaymentSuccessEventServlet一个ServletPaymentCallbackServletFactory生成某种对象工厂的类PaymentOrderFactoryAdapter用来连接某种以前不被支持的对象的类DatabaseLogAdapterJob某种按时间运行的任务PaymentOrderCancelJobWrapper这是一个包装类,为了给某个类提供没有的能力SelectableOrderListWrapperBean这是一个POJOMenuStateBean1.4 方法名首字母小写,如 getName()不要 GetName()动词在前,如 getName(),不要Nameget()动词前缀往往表达特定的含义,如下表:前缀名意义举例create创建createOrder()delete删除deleteOrder()add创建,暗示新创建的对象属于某个集合addPaidOrder()remove删除removeOrder()init或则initialize初始化,暗示会做些诸如获取资源等特殊动作initializeObjectPooldestroy销毁,暗示会做些诸如释放资源的特殊动作destroyObjectPoolopen打开openConnection()close关闭closeConnection() 0) System.out.println(arg);for (int i = 0; i b ) /do something here; 二元三元运算符两边用一个空格隔开如下:a + b = c;b - d = e;return a = b ? 1 : 0;不能如下:a+b=c;b-d=e;return a=b?1:0; 逗号语句后如不还行,紧跟一个空格如下:call(a, b, c);不能如下:call(a,b,c);2.6.3 空行的使用空行可以表达代码在语义上的分割,注释的作用范围,等等。将类似操作,或一组操作放在一起不用空行隔开,而用空行隔开不同组的代码, 如图:order = orderDao.findOrderById(id);/update propertiesorder.setUserName(userName);order.setPrice(456);order.setStatus(PAID);orderService.updateTotalAmount(order);session.saveOrUpdate(order);上例中的空行,使注释的作用域很明显. 连续两行的空行代表更大的语义分割。 方法之间用空行分割 域之间用空行分割 超过十行的代码如果还不用空行分割,就会增加阅读困难3. 注释规范3.1 注释 vs 代码 注释宜少而精,不宜多而滥,更不能误导 命名达意,结构清晰, 类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码混乱,再多的注释都不能弥补。所以,应当先在代码本身下功夫。 不能正确表达代码意义的注释,只会损害代码的可读性。 过于详细的注释,对显而易见的代码添加的注释,罗嗦的注释,还不如不写 。 注释要和代码同步,过多的注释会成为开发的负担 注释不是用来管理代码版本的,如果有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以后没人知道那段注释掉的代码该不该删除。3.2 Java Doc表明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写。Java Doc是个类的使用者来看的,主要介绍 是什么,怎么用等信息。凡是类的使用者需要知道,都要用Java Doc 来写。非Java Doc的注释,往往是个代码的维护者看的,着重告述读者为什么这样写,如何修改,注意什么问题等。 如下:/* This is a class comment*/public class TestClass /* This is a field comment*/public String name;/* This is a method comment*/public void call() 3.3 块级别注释3.3.1 块级别注释,单行时用 /, 多行时用 /* . */。/public int age;/*public int setName(String strName)name=strName;return 1;*/3.3.2 较短的代码块用空行表示注释作用域3.3.3 较长的代码块要用/*- start: -*/和/*- end: -*/包围如:/*-start: 订单处理 - */取得daoOrderDao dao = Factory.getDao(OrderDao);/* 查询订单 */Order order = dao.findById(456);/更新订单order.setUserName(uu);order.setPassword(pass);order.setPrice(ddd);orderDao.save(order);/*-end: 订单处理 - */3.3.4 可以考虑使用大括号来表示注释范围使用大括号表示注释作用范围的例子:/*-订单处理 - */取得daoOrderDao dao = Factory.getDao(OrderDao);/* 查询订单 */Order order = dao.findById(456);/更新订单order.setUserName(uu);order.setPassword(pass);order.setPrice(ddd);orderDao.save(order);3.4 行内注释行内注释用 / 写在行尾public String name; /姓名4 最佳实践和禁忌4.1 每次保存的时候,都让你的代码是最美的程序员都是懒惰的,不要想着等我完成了功能,再来优化代码的格式和结构,等真的把功能完成,很少有人会再愿意回头调整代码。4.2 使用log而不是System.out.println()log可以设定级别,可以控制输出到哪里,容易区分是在代码的什么地方打印的,而System.out.print则不行。而且,System.out.print的速度很慢。所以,除非是有意的,否则,都要用log。至少在提交到svn之前把System.out.print换成log。4.3 每个if while for等语句,都不要省略大括号看下面的代码:if (a b)a+;如果在以后维护的时候,需要在a b 时,把b+,一步小心就会写成:if (a b)a+;b+;这样就错了,因为无论a和b是什么关系,b+都会执行。 如果一开始就这样写:if (a b) a+;相信没有哪个笨蛋会把b+添加错的。而且,这个大括号使作用范围更明显,尤其是后面那行很长要折行时。4.4 善用TODO:在代码中加入 /TODO: ,大部分的ide都会帮你提示,让你知道你还有什么事没有做。比如:if (order.isPaid() /TODO: 更新订单4.5 在需要留空的地方放一个空语句或注释,告述读者,你是故意的比如:if (!exists(order) ;或:if (!exists(order) /nothing to do4.6 不要再对boolean值做true false判断比如:if (order.isPaid() = true) / Do something here不如写成:if (order.isPaid() /Do something here后者读起来就很是 if order is paid, . 要比 if orders isPaid method returns true, 更容易理解4.7 减少代码嵌套层次代码嵌套层次达3层以上时,一般人理解起来都会困难。下面的代码是一个简单的例子:public void demo(int a, int b, int c) if (a b) if (b c) doJobA(); else if (b c) if (a b & b c) doJobA();if (a b & c b) doJobB();if (a = b & c b & a b) if (b c) doJobA();return;doJobB()return;if (b c) if (a c) doJobC();利用子方法,就是将嵌套的程序提取出来放到另外的方法里。4.8 程序职责单一关注点分离是软件开发的真理。人类自所以能够完成复杂的工作,就是因为人类能够将工作分解到较小级别的任务上,在做每个任务时关注更少的东西。让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,减少出错。4.9 变量的声明,初始化和被使用尽量放到一起比方说如下代码:int orderNum= getOrderNum();/do something withou orderNum herecall(orderNum);上例中的注释处代表了一段和orderNum不相关的代码。orderNum的声明和初始化离被使用的地方相隔了很多行的代码,这样做不好,不如这样:/do something withou orderNum hereint orderNum= getOrderNum();call(orderNum);4.10 缩小变量的作用域能用局部变量的,不要使用实例变量,能用实例变量的,不要使用类变量。变量的生存期越短,以为着它被误用的机会越小,同一时刻程序员要关注的变量的状态越少。实例变量和类变量默认都不是线程安全的,局部变量是线程安全的。比如如下代码:public class OrderPayActionprivate Order order;public void doAction() order = orderDao.findOrder();doJob1();doJob2();private void doJob1() doSomething(order);private void doJob2() doOtherThing(order);上例中order只不过担当了在方法间传递参数之用,用下面的方法更好:public class OrderPayActionpublic void doAction() order = orderDao.findOrder();doJob1(order);doJob2(order);private void doJob1(Order order) doSomething(order);private void doJob2(Order order) doOtherThing(order);4.11 尽量不要用参数来带回方法运算结果比如:public void calculate(Order order) int result = 0;/do lots of computing and store it in the resultorder.setResult(result);public void action() order = orderDao.findOrder();calculate(order);/ do lots of things about order例子中calculate方法通过传入的order对象来存储结果, 不如如下写:public int calculate(Order order) int result = 0;/do lots of computing and store it in the resultreturn result;public void action() order = orderDao.findOrder();order.setResult(calculate(order);/ do lots of things about order二、 数据库表及字段命名规范1.数据库表命名规范:(1)表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,表名前缀和所有单词全部小写。oa_mess_lmessage(2)数据库表名应该有意义,并且易于理解,最好使用可以表达功能的英文单词或缩写,如果用英文单词表示,建议使用完整的英文单词。(3)表名不可以太长,最好不要超过3个英文单词长度(22个字母)。(4)在数据库表命名时应该用英文单词的单数形式,如员工表命名:应该为employee而不是employees .(5)如果是后台表命名时应该在表名基础上加上后缀_b(back 首字母 )(6)在表创建完成前,应该为表添加表的注释。2.表字段命名规范:(1)数据库表字段应该是有意义而且易于理解的,最好是能够表达字段含义的英文字母(有人认为如果用英文单词作为字段,因为翻译工具不同,而字段不统一建议使用汉语拼音首字母缩写;有人认为用汉语拼音缩写看起来不直观,老半天也不知道到底这个字段是干什么的)(2)系统中所有属于内码,即仅用于标识唯一性和程序内部用到的标识性字段,字段名称建议取为 ID ,采用类型为整型或长整型.(3)系统中属于是业务内的编号字段,代表一定业务信息,建议字段命名为code , 如工作单编号wf_code .(4) 不要在数据库表字段(列名)中包含数据类型,如:datetime (5)不要在数据库表字段(列名)命名时重复表名,可以使用表名首字母(不包含数据库表名前缀)注意:不要在数据库表字段(列名)命名时不建议使用数据库关键字,如:name,time ,datetime password 等3.表设计规范:(1)所有字段在设计时,除以下数据类型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、binary、varbinary外,必须有默认值。字符型的默认值为一个空字符值串;数值型的默认值为数值0;逻辑型的默认值为数值0;其中:系统中所有逻辑型中数值0表示为“假”;数值1表示为“真”。datetime、smalldatetime类型的字段没有默认值,必须为NULL。(2)当字段定义为字符串形时建议使用varchar而不用nvarchar。注:在MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字节。(3)建议在大多数表中(如工作单),应都有以下字段:字段名说明类型默认值CreatorID创建者int默认值为0CreatedTime创建时间Datetime默认值为NULL(4)字段的描述a.字段必须填写描述信息(注释)b.尽量遵守第三范式的标准(3NF)表内的每一个值只能被表达一次(列名不重复)表内的每一行都应当被唯一的标示(标识唯一性,如自动增长主键)表内不应该存储依赖于其他键的非键信息(5)加索引规则a.表建好后数据库自动为表生成一个索引(为自动增长的列生成唯一索引),如果在对这列添加索引,数据库会给一个警告,内容大概是,已经为这列添加了索引,建议修改索引名称和自动增长列名保持一致,为了方便使用。b.如果在添加索引时,建议索引名称和数据库列名保持一致,为了方便使用c.如果字段事实上是与其它表的关键字相关联而未设计为外键引用,需建索引。d.如果字段与其它表的字段相关联,需建索引。e.如果字段需做模糊查询之外的条件查询,需建索引。f.除了主关键字允许建立簇索引外,其它字段所建索引必须为非簇索引。4.存储过程命名规范(1)存贮过程的命名请遵循以下命名规范:USP_ + 系统模块缩写(与表前缀类似)+_ + 功能标识 + 代表存贮过程操作的主要表名(不带前缀)或功能的英文单词或英文单词缩写。如果一个存贮过程只对一个表进行操作,建议存贮过程的名称就用存贮过程所操作的表的表名(不带前缀)。这样有利于根据表名找到相应的存贮过程。例如:用于新增的存贮过程USP_ME

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论