- 浏览: 121152 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 2774昨天和人聊个问题: 他问我, 你在这家公司已经工作五年了,怎 ... -
使用visualVM监控远程Tomcat
2010-02-09 13:29 3342远程服务器 IP: 192.168.2.99 ... -
高并发访问jsp页面, out of memory问题.
2010-02-09 12:20 1708今天和同事, 用三台机器同时跑jmeter对一台tomcat进 ... -
IBM SOA方案及软件产品介绍PPT
2010-02-08 16:52 4790IBM SOA方案及软件产品介绍PPT -
java Server端与Python客户端的Socket交互
2010-01-27 16:59 4558今天做了一个不同语言 ... -
javaee-5_0-fr-spec (四)
2009-11-24 17:18 998(英语完整翻译太困难了..一堆堆的同义词, 我都不知道怎么安排 ... -
javaee-5_0-fr-spec (三)
2009-11-20 18:01 900EE.2.4 资源适配器 资源 ... -
javaee-5_0-fr-spec (二)
2009-11-20 16:02 962EE.1.1 鸣谢 这份规范汇集了很多人的工作. Vl ... -
javaee-5_0-fr-spec EE.1 章
2009-11-20 14:39 878(题记, 个人觉得练习翻译对自己的帮助较大. 每天翻译一点点. ... -
tomcat,url中奇数个汉字乱码的解决办法
2009-08-17 17:04 2147除了 urlEncodeing="utf8" ... -
struts2项目,使用get方法提交的汉字参数乱码
2009-08-12 09:25 3291我的JAVA文件, 模板文件均为 utf-8编码. get取到 ... -
struts2,去掉烦人的warn
2009-07-21 09:09 1207<!--l version="1.0" ... -
js删除table一列
2009-07-15 14:52 1650function h(colIndex){ var tb ... -
ant checkout svn. 并ftp上传 运行远程命令
2009-06-16 13:01 3549<project basedir=".&quo ... -
add jar to classpath on runtime :动态载入java类。(相当有用)
2009-04-30 12:05 2162(哈哈,50多浏览量, 看的人挺多的啊。) 当你的系统不允许 ... -
String的substring方法. 难道是JAVA的bug?
2009-03-25 11:21 2777前几天写个小东西有个大问题。 使用java获取网页的源代码截东 ...
相关推荐
阿里前端开发规范规定,项目命名应该遵循以下规则: * 项目名称应该是有意义的英文单词或组合词 * 项目名称不得含有特殊字符、数字和中文字符 * 项目名称的长度不得超过 20 个字符 目录命名是指项目文件夹的命名,...
Java后端开发规范是指导Java开发者遵循的一套标准和最佳实践,旨在提高代码质量、可维护性、可扩展性和团队协作效率。这份"java后端开发规范word文档"包含了多个方面的内容,包括但不限于编程风格、命名规则、异常...
在 Oracle 数据库设计开发规范中,数据库设计包括了表名、字段名称、列格式、权限等多个方面的规定,以确保整个系统的安全性和可扩展性。 本规范共分为多个章节,包括范围和简介、数据库整体设计规范、数据库安全...
### 阿里巴巴Java开发规范精要解读 #### 一、编程规约 ##### (一) 命名规约 **强制规定**:所有代码中的命名均不能以下划线`_`或美元符号`$`开始或结束。例如,`_name`、`__name`、`$Object`、`name_`、`name$`、...
以上介绍的是.NET开发规范中关于编程规约的部分,这些规定旨在提高代码的可读性、可维护性和安全性。通过对命名风格、异常处理、日志记录等方面的规范,不仅能够提升团队协作的效率,还能够有效减少错误和缺陷的发生...
《软件开发规范》是指导软件开发过程的重要文档,它涵盖了从项目启动到软件交付的各个环节,旨在提升开发效率,保证代码质量,降低维护成本,并促进团队间的协作与沟通。本压缩包包含两个主要文件:“软件开发规范”...
- **页面开发规范**:详细规定了不同类型的页面(如新增、修改、查看、删除操作以及列表展示等)的技术要求和实现方式,确保用户体验和功能的统一。 5. **页面开发规范**: - **新增页面**:要求提供清晰的用户...
《Java开发手册》是阿里巴巴集团技术团队总结的编程规范文档,它详细规定了Java开发中的各项规范和要求。手册的核心目的是引导开发者编写高质量代码,提高代码的可读性和可维护性,确保软件系统的稳定性和性能。文档...
《腾讯PHP开发规范v1.0》是一份由腾讯科技(深圳)有限公司制定的、针对PHP编程语言的开发规范文档,旨在提升代码质量和团队协作效率。这份规范详细规定了从项目结构、命名规则到错误处理等多个方面的编程标准,是...
Java 后端开发规范是确保代码可读性、可维护性和团队协作的重要准则。以下是根据提供的文件内容提炼出的关键知识点: 1. **命名规范**: - 类名使用 UpperCamelCase 风格,例如 `MarcoPolo`,但特殊情况下如 DO/BO...
《OA界面开发规范》 在信息化时代,OA(Office Automation)系统的界面开发规范显得尤为重要,它不仅关乎用户体验,还直接影响到工作效率和系统易用性。本文档主要针对凯欣达协同办公自动化管理系统_WEBOA的界面...
以下是C#代码开发规范中的一些详细规定: 1. 命名规范: * 类名用Pascal标志法 * 方法名用Pascal标志法 * 变量及参数名用Camel标志法 * 接口名前加“I” * 不要用匈牙利标志法给变量名命名 * 变量名要有示意性,...
### 计算机软件开发规范_GB_8566-88 #### 一、标准概述 《计算机软件开发规范_GB_8566-88》是一项国家标准,旨在为软件开发过程提供一套完整的指导原则。该标准详细规定了软件开发过程中各个阶段的任务、实施步骤...
在前端开发领域,一套完善的开发规范是提升团队协作效率、保证代码质量和可维护性的关键。这份"前端开发规范文档_pdf文件"涵盖了多个重要的知识点,旨在帮助开发者建立良好的编码习惯,提高代码的可读性和规范性。 ...
阿里前端开发规范是一套旨在提升前端工程质量和团队协作效率的准则。这套规范涵盖了代码风格、命名规则、项目结构、注释规范、错误处理、性能优化等多个方面,旨在帮助开发者写出可读性强、易于维护的代码,同时促进...