- 浏览: 118432 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
myprincejava:
请问博主?都是通过ajp来分发的,我通过你这个配置怎么imag ...
[问题已解决]stickysession=JSESSIONID 无效.. 这可怎么办啊. -
peterwei:
<div class="quote_title ...
面试时应该问什么? -
dotjar:
我也是有些郁闷,辞职成功了,但是不想投简历,不想找工作
面试时应该问什么? -
yinjj472:
应该是面试官想了解一下你对系统的了解程度,从这方面可以看出你对 ...
面试时应该问什么? -
happyforever82:
没要关注 自己Up 求评价`~~
面试时应该问什么?
代码规范每家都有, 可发现开发的时候执行力很差. 所以自己小结了一下具有"可操作性"的规定. 呵呵.
(备注: 感谢几位朋友的关注, 我写这个帖子, 更关心"可操作性的"的程度, 接下来对项目实际开发中如何"操作"来说明一下.)
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
评论
<div class="quote_div">
6/ 使用枚举而不要使用string来区分类型[<span style="color: #ff0000;">只要让程序员来接触一个全新的系统, 很短的时间内让他整理一个报表出来, 他就明白了"为什么使用枚举"</span>]
(之前使用字符串来标识"成功"/"失败"/"挂起", 后来发现接手的人不知道查询条件是什么...不要跟我说"你们的文档呢"..当你的面对一百来篇文档时, 你的后面还有一个老
</div>
这个,enum还不是用的string么?而且一般都有toString函数。
确实就是使用enum的String. 使用enum的String的好处是,可以将sql语句where条件值锁定在那几项上。而不用到处去翻文档,找出某个表的某个字段的所有可能值及其含义。
日志用AOP吧,为何还会这样做呢?
兄弟可以问问你们维护部门的同事, 当他们接到用户报的错误时会怎么作。一般花多久时间来找到问题出在哪里。
日志用AOP吧,为何还会这样做呢?
有几位都在关心log了, 这里解释一下哈。
我这里规定log信息的写法,除了是为了方便开发和调试,更重要是的方便系统上线之后,维护部门的XD们方便。
上线时,会把log日志保存到系统的根目录下。当有用户出现问题,可以直接访问log文件,把当时的情况完整的重现出来。避免问题不可重现。规定日志的写法也是为了让非开发人员更好的进行维护。毕竟,软件的生命周期有一大部分是运行和维护期。日志的内容和设计一一对应,更容易判断出问题出在哪里。
日志用AOP吧,为何还会这样做呢?
这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。
真有特殊情况必须记录的话,可以使用AOP,修改也容易。
实际场景是这样的:
当你的系统上线或者在测试的时候出了问题, 那么好, 首先: 测试的人会告诉你出了问题,
并且MM们会告诉你她的期望输出和你的实际输出有差别; 然后: 你拿到email后再去照着做一遍(注意: 同样的工作两个人都操作了一遍), 查一遍逻辑流程发现了错误. 你再回去找设计文档, 看看哪里的逻辑错误了, 再进行修改代码. 提交, 布署, 测试, 通过.
那么好, 我的情况是这样的: 当测试的MM发现了错误, 接下来, 她一手去拿设计文档, 一手打开log, 发现你哪个Log信息和文档中写的不一样, 她把它们记录下来再email给你. 当你收到email之后, 是不是会觉得这个email中承载了更多的有用信息呢? 应该会节省时间了吧.
日志当然需要打,但我的意思是说不用打这么细,细到“所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人”
就上面所说的这些分析,
开始和结束时间:这是为了统计方法的执行耗时吗?想不出场景。
记录功能点名称:这是为了对异常进行定位吗?异常的debug日志中本身就包含类名、方法名及源码行号。
功能负责人:这个貌似更没有必要,测试时,测试人员跟开发人员往往有对应关系,测试人员不会不知道她测的程序是谁写的吧?再说,源码中的javadoc也会标记这些信息。
还有,关闭debug日志,并不代表打日志的那几行代码就不跑了,还是会执行的,还是会耗时的。
以前有项目组规定,在执行数据库操作前,必许把要执行的sql打出来,这种感觉还是很有用的。
但lz的这个,说实话,我感觉实用性不大,但操作起来很繁琐,因为每个方法都要打,会写很多代码(ctrl+C+V)。当然,也有可能lz的项目有实际的需求,所以才要这么做。
<div class="quote_div">
<p>6/ 使用枚举而不要使用string来区分类型[<span style="color: #ff0000;">只要让程序员来接触一个全新的系统, 很短的时间内让他整理一个报表出来, 他就明白了"为什么使用枚举"</span>]</p>
<p> (之前使用字符串来标识"成功"/"失败"/"挂起", 后来发现接手的人不知道查询条件是什么...不要跟我说"你们的文档呢"..当你的面对一百来篇文档时, 你的后面还有一个老</p>
</div>
<p> </p>
<p>这个,enum还不是用的string么?而且一般都有toString函数。</p>
<p> </p>
这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。
真有特殊情况必须记录的话,可以使用AOP,修改也容易。
实际场景是这样的:
当你的系统上线或者在测试的时候出了问题, 那么好, 首先: 测试的人会告诉你出了问题,
并且MM们会告诉你她的期望输出和你的实际输出有差别; 然后: 你拿到email后再去照着做一遍(注意: 同样的工作两个人都操作了一遍), 查一遍逻辑流程发现了错误. 你再回去找设计文档, 看看哪里的逻辑错误了, 再进行修改代码. 提交, 布署, 测试, 通过.
那么好, 我的情况是这样的: 当测试的MM发现了错误, 接下来, 她一手去拿设计文档, 一手打开log, 发现你哪个Log信息和文档中写的不一样, 她把它们记录下来再email给你. 当你收到email之后, 是不是会觉得这个email中承载了更多的有用信息呢? 应该会节省时间了吧.
<div class="quote_div">
<div class="quote_title">超级潜水艇 写道</div>
<div class="quote_div">第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的</div>
<br>这个挺好,方便很多。<br>但没看到官方有说明...<br>
</div>
<p> </p>
<p>这个容易,JDK5编译器就会优化字符串+操作了。不过不要在loop里面使用+(每次loop都会创建一个StringBulider):</p>
<pre name="code" class="java"> /**
* @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;
}
}</pre>
<p> 然后用javap看一下字节码,一目了然:</p>
<pre name="code" class="java">javap -verbose StringConcatTest > c:\cyy.txt</pre>
<p> 下面是文件内容,有点类汇编:</p>
<pre name="code" class="c">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
}</pre>
这个挺好,方便很多。
但没看到官方有说明...
这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。
真有特殊情况必须记录的话,可以使用AOP,修改也容易。
一. 编码风格规范
- 代码命名规范采用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次执行。
这个改为StringBuilder会好一点。
我也正在摸索JAVA开发的规范性,对于LZ的第3点,我以前是比较认同的,如果发现代码重复了,就提取出来做成一个方法,然后重用。但最近看CMMI的文档里面描述,在提取重复代码的时候,一定要这块代码是有独立的逻辑功能的,才能提取。不知道大家是否真的这样做呢?
发表评论
-
关于 架构师 的问题
2010-04-20 12:19 2663昨天和人聊个问题: 他问我, 你在这家公司已经工作五年了,怎 ... -
使用visualVM监控远程Tomcat
2010-02-09 13:29 3300远程服务器 IP: 192.168.2.99 ... -
高并发访问jsp页面, out of memory问题.
2010-02-09 12:20 1666今天和同事, 用三台机器同时跑jmeter对一台tomcat进 ... -
IBM SOA方案及软件产品介绍PPT
2010-02-08 16:52 4748IBM SOA方案及软件产品介绍PPT -
java Server端与Python客户端的Socket交互
2010-01-27 16:59 4507今天做了一个不同语言 ... -
javaee-5_0-fr-spec (四)
2009-11-24 17:18 955(英语完整翻译太困难了..一堆堆的同义词, 我都不知道怎么安排 ... -
javaee-5_0-fr-spec (三)
2009-11-20 18:01 860EE.2.4 资源适配器 资源 ... -
javaee-5_0-fr-spec (二)
2009-11-20 16:02 918EE.1.1 鸣谢 这份规范汇集了很多人的工作. Vl ... -
javaee-5_0-fr-spec EE.1 章
2009-11-20 14:39 831(题记, 个人觉得练习翻译对自己的帮助较大. 每天翻译一点点. ... -
tomcat,url中奇数个汉字乱码的解决办法
2009-08-17 17:04 2105除了 urlEncodeing="utf8" ... -
struts2项目,使用get方法提交的汉字参数乱码
2009-08-12 09:25 3259我的JAVA文件, 模板文件均为 utf-8编码. get取到 ... -
struts2,去掉烦人的warn
2009-07-21 09:09 1186<!--l version="1.0" ... -
js删除table一列
2009-07-15 14:52 1600function h(colIndex){ var tb ... -
ant checkout svn. 并ftp上传 运行远程命令
2009-06-16 13:01 3501<project basedir=".&quo ... -
add jar to classpath on runtime :动态载入java类。(相当有用)
2009-04-30 12:05 2116(哈哈,50多浏览量, 看的人挺多的啊。) 当你的系统不允许 ... -
String的substring方法. 难道是JAVA的bug?
2009-03-25 11:21 2727前几天写个小东西有个大问题。 使用java获取网页的源代码截东 ...
相关推荐
GB8566-88 计算机软件开发规范 目的:详细规定计算机软件开发过程胡各个阶段及没法儿阶段胡任务、 实施步骤、实施要求 、完成标志及交付文件。为软件开人员和管理人员提供一系列之有效的准则、方法和规范。
《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总 结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大 开发者。现代软件行业的高速发展对开发者的综合素质要求...
oracle数据库的开发规范,包括字段名称、表名、列格式、权限等各个方面详细的规定了开发标准。规范开发更有利于系统的拓展和规避更多的潜在的性能问题。
阿里巴巴开发手册,开发规范,新手、老手程序员必备开发规范,详细规定了常量定义、命名规范、注释规范,给出了数据库建表、索引、sql的规范。
阿里巴巴java开发规范手册详细规范了java以及mysql数据库创建时的具体要求。分为编程规约、异常处理、Mysql规约、工程规约、安全规约等。编程规约包含命名规约、常量定义、格式规约、oop规约、集合处理、并发处理、...
在B/S开发模式中,Web前端作为开发团队中不可或缺的一部分,需要按照相关规定进行合理编写。每个团队都有自己的风格和规范,此文仅作参考,并非权威。
本规范适用于所有基于.Net开发的项目。具体项目中的更明确的规定可以覆盖本规中的相应要求。 编写本规范的目的是统一基于.Net项目代码的风格,提高代码的可读性、易维护性和质量。同时也是为了保证一致性、统一性而...
本文阐述软件项目开发和管理的流程规范,作为软件项目开发的高级指引,本规范定义了软件开发的各个阶段以及每个阶段的工作活动和工件,但不对活动和工件的细节作过多规定。在项目开发过程中,每个项目根据自身的需要...
用于.NET开发中的简单开发规范文本,规定了代码编写规范等
本规范是龙芯中科技术有限公司制定的企业规范,暂无国家相关行业通用规范可参考。 本规范是对龙芯开发系统及其衍生兼容机的 Linux 内核开发、测试及发布过程的技术规定。
来自阿里内部的java开发规范,总结了多年的java编写代码需要注意的事项,详细规定了java编程应该严格遵守的约定,有利于代码的规范性
软件开发安全管理规定
详细规定计算机软件开发过程胡各个阶段及没法儿阶段胡任务、实施步骤、实施要求 、完成标志及交付文件。为软件开人员和管理人员提供一系列之有效的准则、方法和规范。
产品硬件项目的开发,首先是要...这主要表现在,技术的采用要经过总体组的评审,器件和厂家的选择要参照物料认证部的相关文件,开发过程完成相应的规定文档,另外,常用的硬件电路(如ID.WDT)要采用通用的标准设计。
操作手册编写规范.doc 测试分析报告编写规范.doc 测试计划文档编写规范.doc 概要设计说明书编写规范.doc 开发进度月报编写规范.doc 模块开发卷宗编写规范.doc 软件配置管理计划编写规范.doc 软件需求说明书编写规范....
本规范为物探化探软件开发工作的需求分析、设计、实现、测试、验收及文档等方面规定了统一的基本要求 严格遵守本规范可使开发的软件具有可靠性和可维护性,且能成为产品。
研发部源代码管理规范 参考互联网资料,制定的简单的源代码管理规范,使用svn,如使用git也可以参考。规范应该是企业自身开发标准。
本规范规定了手机软件开发中C/C++语言的编程规范。 本规范适用于手机软件部内使用C/C++语言编码的所有手机软件。本规范自生效之日起,对以后新编写的和修改的代码有约束力。 在本规范中没有说明的,请按照公司制订...
信息系统集成项目软件开发国家相关规范文档及法律法规