锁定老帖子 主题:自己规定的开发规范
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-01
最后修改:2010-02-04
代码规范每家都有, 可发现开发的时候执行力很差. 所以自己小结了一下具有"可操作性"的规定. 呵呵. (备注: 感谢几位朋友的关注, 我写这个帖子, 更关心"可操作性的"的程度, 接下来对项目实际开发中如何"操作"来说明一下.)
1/ 所有文件编码为utf-8 [可以写个小程序来遍历文件夹] (不要出现重复的代码. 代码越少, 复杂度越小, 需要大改的时候可以来一个"华丽丽的转身". 船小好调头) (测试的MM会按照你的log信息和功能文档来对比, 你的log信息中有没有实现"一对一") (如果log信息太多影响性能, 就关掉log嘛...) (方便log的输出) (之前使用字符串来标识"成功"/"失败"/"挂起", 后来发现接手的人不知道查询条件是什么...不要跟我说"你们的文档呢"..当你的面对一百来篇文档时, 你的后面还有一个老大来看着你的进度..你就会知道我说的什么意思.) (这个不太好操作. 因为测试的粒度每个项目会不一样) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-02-03
7/ 使用StringBuffer构建长字符串而不要使用加号
这个改为StringBuilder会好一点。 我也正在摸索JAVA开发的规范性,对于LZ的第3点,我以前是比较认同的,如果发现代码重复了,就提取出来做成一个方法,然后重用。但最近看CMMI的文档里面描述,在提取重复代码的时候,一定要这块代码是有独立的逻辑功能的,才能提取。不知道大家是否真的这样做呢? |
|
返回顶楼 | |
发表时间:2010-02-03
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的
|
|
返回顶楼 | |
发表时间:2010-02-03
有点意思,我们的规范,看看能不能执行下去。
一. 编码风格规范
|
|
返回顶楼 | |
发表时间:2010-02-03
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人
这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。 真有特殊情况必须记录的话,可以使用AOP,修改也容易。 |
|
返回顶楼 | |
发表时间:2010-02-03
超级潜水艇 写道 第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的
这个挺好,方便很多。 但没看到官方有说明... |
|
返回顶楼 | |
发表时间:2010-02-03
契约编程,这是我们遵守最基本的代码规范
|
|
返回顶楼 | |
发表时间: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 } |
|
返回顶楼 | |
发表时间:2010-02-04
zli.ray 写道 2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人
这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。 真有特殊情况必须记录的话,可以使用AOP,修改也容易。 实际场景是这样的: 当你的系统上线或者在测试的时候出了问题, 那么好, 首先: 测试的人会告诉你出了问题, 并且MM们会告诉你她的期望输出和你的实际输出有差别; 然后: 你拿到email后再去照着做一遍(注意: 同样的工作两个人都操作了一遍), 查一遍逻辑流程发现了错误. 你再回去找设计文档, 看看哪里的逻辑错误了, 再进行修改代码. 提交, 布署, 测试, 通过. 那么好, 我的情况是这样的: 当测试的MM发现了错误, 接下来, 她一手去拿设计文档, 一手打开log, 发现你哪个Log信息和文档中写的不一样, 她把它们记录下来再email给你. 当你收到email之后, 是不是会觉得这个email中承载了更多的有用信息呢? 应该会节省时间了吧. |
|
返回顶楼 | |
发表时间:2010-02-04
happyforever82 写道
6/ 使用枚举而不要使用string来区分类型[只要让程序员来接触一个全新的系统, 很短的时间内让他整理一个报表出来, 他就明白了"为什么使用枚举"] (之前使用字符串来标识"成功"/"失败"/"挂起", 后来发现接手的人不知道查询条件是什么...不要跟我说"你们的文档呢"..当你的面对一百来篇文档时, 你的后面还有一个老
这个,enum还不是用的string么?而且一般都有toString函数。
|
|
返回顶楼 | |