中软国际Java项目开发CodeReview常见问题实例分析及指南.doc_第1页
中软国际Java项目开发CodeReview常见问题实例分析及指南.doc_第2页
中软国际Java项目开发CodeReview常见问题实例分析及指南.doc_第3页
中软国际Java项目开发CodeReview常见问题实例分析及指南.doc_第4页
中软国际Java项目开发CodeReview常见问题实例分析及指南.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第1页 中软国际中软国际 JavaJava 项目开发项目开发 CodeReviewCodeReview 常见问题实例分析及指南常见问题实例分析及指南 基础技术资源开发与管理部基础技术资源开发与管理部 2005 年年 8 月月 31 日日 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第2页 第一章第一章 综述综述.4 第二章第二章 常见问题分类及实例分析常见问题分类及实例分析.4 2.1 开发规范类.4 2.1.1 命名规范.4 2.1.2 代码格式.7 2.2 性能影响及系统稳定性.10 2.2.1 Java操作数据库.10 2.2.2 数据库SQL开发注意事项.14 2.2.3 数据库存储过程编写.17 2.2.4 Java编程方面.19 2.3 编程易错误区及系统健壮性.21 2.3.1 空指针错误的引发.21 2.3.2 格式化数字错误.22 2.3.3 字符串越界错误.22 2.3.4 没有克隆(clone)返回的对象.22 2.3.5 不必要的克隆.24 2.3.6 自编代码来拷贝数组.25 2.3.7 拷贝错误的数据.26 2.3.8 检查new 操作的结果是否为null.28 2.3.9 用= 替代.equals .28 2.3.10 混淆原子操作和非原子操作.29 2.3.11 在catch 块中作清除工作.30 2.3.12 增加不必要的catch 块.31 2.3.13 没有正确实现equals,hashCode,或者clone 等方法.31 2.4 JAVA编程不良习惯.32 2.4.1 Servlet中获取数据库连接问题.32 2.4.2 对于Exception的处理.32 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第3页 2.4.3 有关常量的使用.33 2.4.4 静态变量的使用.33 2.4.5 未使用的变量.33 2.4.6 过于庞大的try块.33 2.4.7 最好不要让系统自己进行类型转换.36 2.5 RESOURCEONE开发框架使用问题.36 2.5.1 在普通JavaClass中获得数据库连接.36 2.5.2 Servlet中使用SearchDAO.37 2.5.3 程序调试信息.37 2.5.4 超长类名:使用R1Studio生成数据访问类的问题.37 2.5.5 代码中直接使用JDBC进行数据库操作.38 2.5.6 代码的分包问题.38 2.5.7 使用DAO操作时直接在Servlet里进行操作.39 2.6 业务逻辑问题.39 2.6.1 程序逻辑错误.39 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第4页 第一章第一章 综述综述 基础技术资源开发与管理部在颁布六统一管理代码 review 办法中,从管理 的角度对中软国际所有的软件开发项目的程序代码 review 作了相关的要求,并且推 行 Jupiter 这样的 CodeReview 协同管理工具来辅助促进和跟踪 review 的状态和结果。 CodeReview 的基本手段还是需要技术经理通过人工检查项目成员的代码,来 将各种问题扼杀在开发阶段,但是不同经验及技术水平的经理在 review 同一段代码 所发现的问题可能相差比较大,不同的 Team 可能因此产生的效果也不同。本文从 实际项目中抽取了一些项目中常见的 Java 开发所涉及的问题,进行实例分析,为各 技术经理提供靶子和借鉴参考,如果审查者能够有意识地寻找特定的错误,而不是 靠漫无目的的浏览代码来发现错误,那么代码审查的效果会事半功倍如能做到举一 反三,则意义更大。 第二章第二章 常见问题分类及实例分析常见问题分类及实例分析 2.1 开发规范类开发规范类 在六统一规范中颁布的Java 开发编码规范和Delphi 开发规范 ,里面都 专门对于 Java 和 Delphi 语言进行开发的详细规定。下面是对一些基本要求的重申, 对于代码 review 比较基础和关键。 2.1.1 命名规范命名规范 2.1.1.1 Java 程序程序 2.1.1.1.1 包名包名 Package 的名字应该都是由小写单词组成。如 test.demo.example 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第5页 具体的示例如下: com.icss 下面为平台包。 stmacmbas 为本项目的根程序包。 stmacmbas.base 为本项目的开发基础包 merce 为商业企业程序包 stmacmbas.example 为示例程序包 stmacmbas.industry 为工业企业程序包 stmacmbas.stma 为国家局程序包 stmacmbas.util 为工具包 2.1.1.1.2 文件名文件名 文件名由英文单词组成,每个单词的首字母大写,最好不要超过 4 个单词, 如 ShipOrder.java。 Java 文件的文件名要与程序中的 public 类名相同。 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第6页 Servet 文件要以 Servlet 做为结尾,如 AddCompanyServlet.java 2.1.1.1.3 类名类名 变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。 2.1.1.1.4 变量名变量名 Class 变量的命名 :变量的名字必须用一个小写字母开头。后面的单词用 大写字母开头。 Static Final 变量的命名 :Static Final 变量的名字应该都大写,并且指出完 整含义。 用有意义的名字命名变量 。首先,用完整的英语单词或约定俗成的简写命 名你的变量(不允许用汉语拼音),如: firstName,zipCode 用复数命名 collection 类变量。collection 包括数组,vector 等。命名时 使用复数: customers ,classmates 2.1.1.1.5 方法名方法名 方法的名字必须用一个小写字母开头。后面的单词用大写字母开头。 方法的名字要与该方法的用途相关。 2.1.1.1.6 参数名参数名 参数的命名 :参数的名字必须和变量的命名规范一致。 方法的参数 :使用有意义的参数命名,如果可能的话,使用和要赋值的字 段一样的名字。 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第7页 2.1.1.2 增删改程序和页面的调用关系和文件名增删改程序和页面的调用关系和文件名 AddOrderServer, SaveOrderServer, DeleteOrderServlet 不需要页面,其他有 JSP 页 面的 Servlet 要与 JSP 文件名相对应。OrderDetailServet 对应两个 JSP 文件, EditOrder 用于可编辑状态,ShowOrder 用于不可编辑状态。 AddOrderServlet 和 SaveOrderServlet 的返回页面可以是 List 页面,也可以是 Detail 页面,如果当前人已完成所有可进行的操作,则回到 List 页面,如果未完成, 则回到 Detail 页面。 2.1.1.3 CSS 为不同的部署功能应用建立不同的 CSS 件,如建三个文件:stama.css, industry.css 和 commerce.css 2.1.2 代码格式代码格式 2.1.2.1 Java 程序程序 2.1.2.1.1 文件头文件头 版权信息 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第8页 版权信息必须在 java 文件的开头,比如: /* * 类名 * * 日期 * 修改记录 * Copyright ICSS 2003 * All right reserved. */ 其他不需要出现在 javadoc 的信息也可以包含在这里。 Package/Imports package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而 且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该 用 * 来处理。对于 import 语句,如果某一个包中引用的类不超过三个(包括三个) ,不允许用 import xxx.*;格式。 将 import 的 classes 归类,按顺序罗列: a. Java 标准类(java.*) b. Java 扩充类(javax.*) c. 第三方类 d. 你的应用程序的类 2.1.2.1.2 缩进缩进 缩进应该是每行 4 个空格,不要在源文件中保存 Tab 字符。 在使用不同的源代 码管理工具时 Tab 字符将因为用户设置的不同而扩展为不同的宽度。 2.1.2.1.3 注释注释 为保证开发后 JAVA DOC 的顺利生成,开发人员必须在所有方法,全局变量前 加入加上标准 JAVA 注释。 类注释需要包含以下要素: 1方法描述 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第9页 2参数: param 参数名 说明 3返回值: return 说明 4例外情况:exception 完整类名 说明 /* this is a doc sample * param args array of string arguments * return No return value * exception exception No exceptions thrown */ 2.1.2.1.4 页宽页宽 页宽应该设置为 80 字符, 源代码一般不会超过这个宽度, 并导致无法完整显 示, 但这一设置也可以灵活调整。 在任何情况下, 超长的语句应该在一个逗号 或者一个操作符后折行, 一条语句折行后, 应该比原来的语句再缩进 2 个字符。 2.1.2.2 HTML/JSP 2.1.2.2.1 文件头文件头 文件头要写明该文件的用途,及修改记录。如: =”,不要使用“”。 8、注意一些 or 子句和 union 子句之间的替换 9、注意表之间连接的数据类型,避免不同类型数据之间的连接。 10、注意存储过程中参数和数据类型的关系。 11、注意 insert、update 操作的数据量,防止与其他应用冲突。如果数据量超过 200 个数据页面(400k) ,那么系统将会进行锁升级,页级锁会升级成表级锁。 2.2.3.3 索引的使用索引的使用 1、索引的创建要与应用结合考虑,建议大的 OLTP 表不要超过 6 个索引。 2、尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过 index index_name 来强制指定索引 3、避免对大表查询时进行 table scan,必要时考虑新建索引。 4、在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该 索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会 被使用。 5、要注意索引的维护,周期性重建索引,重新编译存储过程。 2.2.3.4 tempdb 的使用的使用 1、尽量避免使用 distinct、order by、group by、having、join、cumpute,因为这 些语句会加重 tempdb 的负担。 2、避免频繁创建和删除临时表,减少系统表资源的消耗。 3、在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代 替 create table,避免 log,提高速度;如果数据量不大,为了缓和系统表的资源, 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第19页 建议先 create table,然后 insert。 4、如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立 索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到 该临时表的索引。 5、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除, 先 truncate table,然后 drop table,这样可以避免系统表的较长时间锁定。 6、慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这 种操作会在一条语句中多次使用 tempdb 的系统表。 2.2.3.5 合理的算法使用:合理的算法使用: 结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。 具体可用 ASE 调优命令:set statistics io on, set statistics time on , set showplan on 等。 2.2.4 Java 编程方面编程方面 2.2.4.1 InputStream/OutputStream 未关闭问题未关闭问题 严重级别:严重严重级别:严重 1、问题造成的后果 对文件对象构造的 InputStream/OutputStream 对象未关闭会造成在同一段程序中 调用 File.delete()方法删除同一个文件时删除失败的情况。 2、解决的方法 在对 InputStream/OutputStream 对象使用完毕后需要显式的关闭流对象。为了防 止在程序执行过程中出现异常造成流对象无法关闭的情况,也可以在 finally 段中关 闭流对象。 2.2.4.2 资源使用完成的释放资源使用完成的释放方式方式 严重级别:严重严重级别:严重 问题代码:问题代码: String fileFullName = getUploadFileFullName(request, imageurl); File imagfile=new File(fileFullName); imagefileInputstream = new FileInputStream(fileFullName); 中软国际 Java 项目开发 CodeReview 常见问题实例分析及指南 第20页 String sql =Select max(SERIAL) SERIAL from T_M_C_LICENCEANNEX where APPLYCODE =+code+; if(conn!=null) stmt = conn.createStatement(); if(stmt!=null) rs = stmt.executeQuery(sql); try conn= getConnection(DBUtil.DS_JNDI); TCCExameinfoHe

温馨提示

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

评论

0/150

提交评论