`
happyforever82
  • 浏览: 118432 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自己规定的开发规范

    博客分类:
  • java
阅读更多

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

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

 

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

分享到:
评论
14 楼 happyforever82 2010-02-04  
moonjava 写道
<div class="quote_title">happyforever82 写道</div>
<div class="quote_div">
6/ 使用枚举而不要使用string来区分类型[<span style="color: #ff0000;">只要让程序员来接触一个全新的系统, 很短的时间内让他整理一个报表出来, 他就明白了"为什么使用枚举"</span>]

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

</div>
 

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

 


确实就是使用enum的String. 使用enum的String的好处是,可以将sql语句where条件值锁定在那几项上。而不用到处去翻文档,找出某个表的某个字段的所有可能值及其含义。
13 楼 happyforever82 2010-02-04  
hommy8 写道
"但lz的这个,说实话,我感觉实用性不大,但操作起来很繁琐,因为每个方法都要打,会写很多代码(ctrl+C+V)。当然,也有可能lz的项目有实际的需求,所以才要这么做。"

日志用AOP吧,为何还会这样做呢?


兄弟可以问问你们维护部门的同事, 当他们接到用户报的错误时会怎么作。一般花多久时间来找到问题出在哪里。
12 楼 happyforever82 2010-02-04  
hommy8 写道
"但lz的这个,说实话,我感觉实用性不大,但操作起来很繁琐,因为每个方法都要打,会写很多代码(ctrl+C+V)。当然,也有可能lz的项目有实际的需求,所以才要这么做。"

日志用AOP吧,为何还会这样做呢?


有几位都在关心log了, 这里解释一下哈。
我这里规定log信息的写法,除了是为了方便开发和调试,更重要是的方便系统上线之后,维护部门的XD们方便。

上线时,会把log日志保存到系统的根目录下。当有用户出现问题,可以直接访问log文件,把当时的情况完整的重现出来。避免问题不可重现。规定日志的写法也是为了让非开发人员更好的进行维护。毕竟,软件的生命周期有一大部分是运行和维护期。日志的内容和设计一一对应,更容易判断出问题出在哪里。
11 楼 hommy8 2010-02-04  
"但lz的这个,说实话,我感觉实用性不大,但操作起来很繁琐,因为每个方法都要打,会写很多代码(ctrl+C+V)。当然,也有可能lz的项目有实际的需求,所以才要这么做。"

日志用AOP吧,为何还会这样做呢?
10 楼 zli.ray 2010-02-04  
happyforever82 写道
zli.ray 写道
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人

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


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

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

日志当然需要打,但我的意思是说不用打这么细,细到“所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人”

就上面所说的这些分析,
开始和结束时间:这是为了统计方法的执行耗时吗?想不出场景。
记录功能点名称:这是为了对异常进行定位吗?异常的debug日志中本身就包含类名、方法名及源码行号。
功能负责人:这个貌似更没有必要,测试时,测试人员跟开发人员往往有对应关系,测试人员不会不知道她测的程序是谁写的吧?再说,源码中的javadoc也会标记这些信息。

还有,关闭debug日志,并不代表打日志的那几行代码就不跑了,还是会执行的,还是会耗时的。
以前有项目组规定,在执行数据库操作前,必许把要执行的sql打出来,这种感觉还是很有用的。
但lz的这个,说实话,我感觉实用性不大,但操作起来很繁琐,因为每个方法都要打,会写很多代码(ctrl+C+V)。当然,也有可能lz的项目有实际的需求,所以才要这么做。
9 楼 moonjava 2010-02-04  
<div class="quote_title">happyforever82 写道</div>
<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>
8 楼 happyforever82 2010-02-04  
zli.ray 写道
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人

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


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

那么好, 我的情况是这样的: 当测试的MM发现了错误, 接下来, 她一手去拿设计文档, 一手打开log, 发现你哪个Log信息和文档中写的不一样, 她把它们记录下来再email给你. 当你收到email之后, 是不是会觉得这个email中承载了更多的有用信息呢? 应该会节省时间了吧.
7 楼 曾经de迷茫 2010-02-03  
<div class="quote_title">zli.ray 写道</div>
<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&gt;0;i--){
                        begin+=""+i;
                }
                return begin;
        }
}</pre>
<p> 然后用javap看一下字节码,一目了然:</p>
<pre name="code" class="java">javap -verbose StringConcatTest &gt; 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."&lt;init&gt;":(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."&lt;init&gt;":(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>
6 楼 ningmenglovesoft 2010-02-03  
契约编程,这是我们遵守最基本的代码规范
5 楼 zli.ray 2010-02-03  
超级潜水艇 写道
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的

这个挺好,方便很多。
但没看到官方有说明...
4 楼 zli.ray 2010-02-03  
2/ 所有操作的入口都必须log开始和结束时间, 并记录功能点名称 及功能负责人

这个感觉没有必要,会使debug日志过于臃肿,降低执行速度,并且感觉这些信息也没什么大用处。
真有特殊情况必须记录的话,可以使用AOP,修改也容易。
3 楼 myreligion 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次执行。
2 楼 超级潜水艇 2010-02-03  
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的
1 楼 hommy8 2010-02-03  
7/ 使用StringBuffer构建长字符串而不要使用加号

这个改为StringBuilder会好一点。

我也正在摸索JAVA开发的规范性,对于LZ的第3点,我以前是比较认同的,如果发现代码重复了,就提取出来做成一个方法,然后重用。但最近看CMMI的文档里面描述,在提取重复代码的时候,一定要这块代码是有独立的逻辑功能的,才能提取。不知道大家是否真的这样做呢?

相关推荐

    计算机软件开发规范PDF

    GB8566-88 计算机软件开发规范 目的:详细规定计算机软件开发过程胡各个阶段及没法儿阶段胡任务、 实施步骤、实施要求 、完成标志及交付文件。为软件开人员和管理人员提供一系列之有效的准则、方法和规范。

    阿里巴巴开发规范.rar

    《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总 结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大 开发者。现代软件行业的高速发展对开发者的综合素质要求...

    Oracle 数据库设计开发规范

    oracle数据库的开发规范,包括字段名称、表名、列格式、权限等各个方面详细的规定了开发标准。规范开发更有利于系统的拓展和规避更多的潜在的性能问题。

    阿里巴巴开发手册;开发规范;新手、老手程序员必备

    阿里巴巴开发手册,开发规范,新手、老手程序员必备开发规范,详细规定了常量定义、命名规范、注释规范,给出了数据库建表、索引、sql的规范。

    阿里巴巴java开发规范

    阿里巴巴java开发规范手册详细规范了java以及mysql数据库创建时的具体要求。分为编程规约、异常处理、Mysql规约、工程规约、安全规约等。编程规约包含命名规约、常量定义、格式规约、oop规约、集合处理、并发处理、...

    Web前端开发规范.pdf

    在B/S开发模式中,Web前端作为开发团队中不可或缺的一部分,需要按照相关规定进行合理编写。每个团队都有自己的风格和规范,此文仅作参考,并非权威。

    C#开发规范(非常全面的编码规范)

    本规范适用于所有基于.Net开发的项目。具体项目中的更明确的规定可以覆盖本规中的相应要求。 编写本规范的目的是统一基于.Net项目代码的风格,提高代码的可读性、易维护性和质量。同时也是为了保证一致性、统一性而...

    软件开发规范

    本文阐述软件项目开发和管理的流程规范,作为软件项目开发的高级指引,本规范定义了软件开发的各个阶段以及每个阶段的工作活动和工件,但不对活动和工件的细节作过多规定。在项目开发过程中,每个项目根据自身的需要...

    .NET开发规范文本

    用于.NET开发中的简单开发规范文本,规定了代码编写规范等

    龙芯CPU开发系统PMON固件开发规范_V1.0.pdf

    本规范是龙芯中科技术有限公司制定的企业规范,暂无国家相关行业通用规范可参考。 本规范是对龙芯开发系统及其衍生兼容机的 Linux 内核开发、测试及发布过程的技术规定。

    java开发规范-阿里

    来自阿里内部的java开发规范,总结了多年的java编写代码需要注意的事项,详细规定了java编程应该严格遵守的约定,有利于代码的规范性

    软件开发安全管理规定.doc

    软件开发安全管理规定

    计算机软件开发规范 GB 8566-88

    详细规定计算机软件开发过程胡各个阶段及没法儿阶段胡任务、实施步骤、实施要求 、完成标志及交付文件。为软件开人员和管理人员提供一系列之有效的准则、方法和规范。

    硬件开发流程及规范 硬件开发的基本过程和规范化 硬件工程师职责和硬件工程师基本素质与技术 硬件开发流程 硬件开发文档规范 与硬件开发相关的流程文件介绍

    产品硬件项目的开发,首先是要...这主要表现在,技术的采用要经过总体组的评审,器件和厂家的选择要参照物料认证部的相关文件,开发过程完成相应的规定文档,另外,常用的硬件电路(如ID.WDT)要采用通用的标准设计。

    国家标准-软件开发规范 【包括14份文档】

    操作手册编写规范.doc 测试分析报告编写规范.doc 测试计划文档编写规范.doc 概要设计说明书编写规范.doc 开发进度月报编写规范.doc 模块开发卷宗编写规范.doc 软件配置管理计划编写规范.doc 软件需求说明书编写规范....

    物探化探计算机软件开发规范

    本规范为物探化探软件开发工作的需求分析、设计、实现、测试、验收及文档等方面规定了统一的基本要求 严格遵守本规范可使开发的软件具有可靠性和可维护性,且能成为产品。

    研发部源代码管理规范

    研发部源代码管理规范 参考互联网资料,制定的简单的源代码管理规范,使用svn,如使用git也可以参考。规范应该是企业自身开发标准。

    手机软件编程规范(V1.0)

    本规范规定了手机软件开发中C/C++语言的编程规范。 本规范适用于手机软件部内使用C/C++语言编码的所有手机软件。本规范自生效之日起,对以后新编写的和修改的代码有约束力。 在本规范中没有说明的,请按照公司制订...

    信息系统集成项目软件开发国家相关规范文档及法律法规

    信息系统集成项目软件开发国家相关规范文档及法律法规

Global site tag (gtag.js) - Google Analytics