论坛首页 Java企业应用论坛

自己规定的开发规范

浏览 5976 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2010-02-01   最后修改:2010-02-04

代码规范每家都有, 可发现开发的时候执行力很差. 所以自己小结了一下具有"可操作性"的规定. 呵呵.

(备注: 感谢几位朋友的关注, 我写这个帖子, 更关心"可操作性的"的程度, 接下来对项目实际开发中如何"操作"来说明一下.)

 

1/ 所有文件编码为utf-8 [可以写个小程序来遍历文件夹]
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人[可以由测试的MM负责]
3/ 及时重构[这个需要程序员们主动配合, 呵呵. 当人变懒的时候就不好推动了.]

    (不要出现重复的代码. 代码越少, 复杂度越小, 需要大改的时候可以来一个"华丽丽的转身". 船小好调头)
4/ 详细的log信息【要知道发生了什么】[这个可以由测试的MM来负责]

    (测试的MM会按照你的log信息和功能文档来对比, 你的log信息中有没有实现"一对一") (如果log信息太多影响性能, 就关掉log嘛...)
5/ 自定义类要重载 toString()方法[当log信息中出来 java.lang.XXXX#121323 之类的东西出来, 就揪出来打板子]

    (方便log的输出)
6/ 使用枚举而不要使用string来区分类型[只要让程序员来接触一个全新的系统, 很短的时间内让他整理一个报表出来, 他就明白了"为什么使用枚举"]

    (之前使用字符串来标识"成功"/"失败"/"挂起", 后来发现接手的人不知道查询条件是什么...不要跟我说"你们的文档呢"..当你的面对一百来篇文档时, 你的后面还有一个老大来看着你的进度..你就会知道我说的什么意思.)
7/ 使用StringBuffer构建长字符串而不要使用加号 [让大家看看实际的性能例子, 或者 全项目搜索 加号.呵呵. 被查出来的负责买咸水花生吃饭] 我们还是使用jdk1.4/1.5来开发, 近期不会上jdk6的, 所以这个习惯还是要养成.
8/ 写单元测试

    (这个不太好操作. 因为测试的粒度每个项目会不一样)
9/ 使用 findBugs 代码自查
   http://findbugs.cs.umd.edu/eclipse

   发表时间:2010-02-03  
7/ 使用StringBuffer构建长字符串而不要使用加号

这个改为StringBuilder会好一点。

我也正在摸索JAVA开发的规范性,对于LZ的第3点,我以前是比较认同的,如果发现代码重复了,就提取出来做成一个方法,然后重用。但最近看CMMI的文档里面描述,在提取重复代码的时候,一定要这块代码是有独立的逻辑功能的,才能提取。不知道大家是否真的这样做呢?
0 请登录后投票
   发表时间:2010-02-03  
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的
0 请登录后投票
   发表时间:2010-02-03  
有点意思,我们的规范,看看能不能执行下去。

一. 编码风格规范
  • 代码命名规范采用Sun命名规范。
  • 代码布局规范采用MyEclipse建议(Source->Format)。
  • 每个java类长度不得超过1000行;大型类需要备案。
二. 编程规范
  • 代码中禁止出现System.out/System.err调用
  • 代码中任何对HttpSession的引用和使用必须备案
  • 代码中关键位置需要书写完整的注释,包括:代码的作用,适用返回,特殊的输入和输出参数等。如果此处出现过bug,需要记录bug出现的原因以及修复办法。
  • 代码中关键位置和错误需要记录到log中,采用apache common logs进行日志记录。
  • 所有某些数据库专用的sql语句需要备案,并尽量避免。
  • 关键代码需要编写测试用例,测试采用JUnit。
三. 代码管理
  • 代码服务器采用SVN。
  • 每天早上需要从SVN下载最新的代码,每天晚上下班前提交本地代码。
  • 提交到SVN的代码需要保证可以随时运行,有问题的代码不得提交。
四. 设计与资源限定
  • 数据库表每列总长度不得超过1024字节。
  • 超过1024字节的表,字段数不得超过5个。
  • 执行时长超过1秒的sql语句,每分钟不得多于1次执行。
  • 执行join查询的sql语句,每秒钟不得多于1次执行。
0 请登录后投票
   发表时间:2010-02-03  
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人

这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。
真有特殊情况必须记录的话,可以使用AOP,修改也容易。
0 请登录后投票
   发表时间:2010-02-03  
超级潜水艇 写道
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的

这个挺好,方便很多。
但没看到官方有说明...
0 请登录后投票
   发表时间:2010-02-03  
契约编程,这是我们遵守最基本的代码规范
0 请登录后投票
   发表时间:2010-02-03   最后修改:2010-02-03
zli.ray 写道
超级潜水艇 写道
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的

这个挺好,方便很多。
但没看到官方有说明...

 

这个容易,JDK5编译器就会优化字符串+操作了。不过不要在loop里面使用+(每次loop都会创建一个StringBulider):

 /**
    * @version $Id: StringConcatTest.java Exp $              
   */

 public class StringConcatTest {
        //普通字符串相加,JDK5 ↑编译器会自动转为StringBulider处理
        public static String testConcat(String begin){
                return begin+"5"+"2"+"1";
        }
        // 不要循环里相加,每次循环创建一个StringBulider
        public static String testConcatInLoop(String begin){
                for(int i=10;i>0;i--){
                        begin+=""+i;
                }
                return begin;
        }
}

 然后用javap看一下字节码,一目了然:

javap -verbose StringConcatTest > c:\cyy.txt

 下面是文件内容,有点类汇编:

public static java.lang.String testConcat(java.lang.String);
  Code:
   Stack=3, Locals=1, Args_size=1
   0:	new	#16; //class java/lang/StringBuilder
   3:	dup
   4:	aload_0
   5:	invokestatic	#18; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   8:	invokespecial	#24; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   11:	ldc	#27; //String 5
   13:	invokevirtual	#29; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   16:	ldc	#33; //String 2
   18:	invokevirtual	#29; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   21:	ldc	#35; //String 1
   23:	invokevirtual	#29; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   26:	invokevirtual	#37; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   29:	areturn
  LineNumberTable: 
   line 18: 0

  LocalVariableTable: 
   Start  Length  Slot  Name   Signature
   0      30      0    begin       Ljava/lang/String;


public static java.lang.String testConcatInLoop(java.lang.String);
  Code:
   Stack=3, Locals=2, Args_size=1
   0:	bipush	10
   2:	istore_1
   3:	goto	28
   6:	new	#16; //class java/lang/StringBuilder
   9:	dup
   10:	aload_0
   11:	invokestatic	#18; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   14:	invokespecial	#24; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   17:	iload_1
   18:	invokevirtual	#44; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   21:	invokevirtual	#37; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   24:	astore_0
   25:	iinc	1, -1
   28:	iload_1
   29:	ifgt	6  //循环内调用 + 操作,又跳至第6行创建了一个StringBulider
   32:	aload_0
   33:	areturn
  LineNumberTable: 
   line 22: 0
   line 23: 6
   line 22: 25
   line 25: 32

  LocalVariableTable: 
   Start  Length  Slot  Name   Signature
   0      34      0    begin       Ljava/lang/String;
   3      29      1    i       I


}
0 请登录后投票
   发表时间:2010-02-04  
zli.ray 写道
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人

这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。
真有特殊情况必须记录的话,可以使用AOP,修改也容易。


实际场景是这样的:
当你的系统上线或者在测试的时候出了问题, 那么好, 首先: 测试的人会告诉你出了问题,
并且MM们会告诉你她的期望输出和你的实际输出有差别; 然后: 你拿到email后再去照着做一遍(注意: 同样的工作两个人都操作了一遍), 查一遍逻辑流程发现了错误. 你再回去找设计文档, 看看哪里的逻辑错误了, 再进行修改代码. 提交, 布署, 测试, 通过.

那么好, 我的情况是这样的: 当测试的MM发现了错误, 接下来, 她一手去拿设计文档, 一手打开log, 发现你哪个Log信息和文档中写的不一样, 她把它们记录下来再email给你. 当你收到email之后, 是不是会觉得这个email中承载了更多的有用信息呢? 应该会节省时间了吧.
0 请登录后投票
   发表时间:2010-02-04  
happyforever82 写道

6/ 使用枚举而不要使用string来区分类型[只要让程序员来接触一个全新的系统, 很短的时间内让他整理一个报表出来, 他就明白了"为什么使用枚举"]

    (之前使用字符串来标识"成功"/"失败"/"挂起", 后来发现接手的人不知道查询条件是什么...不要跟我说"你们的文档呢"..当你的面对一百来篇文档时, 你的后面还有一个老

 

这个,enum还不是用的string么?而且一般都有toString函数。

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics