Chinaunix首页 | 论坛 | 博客
  • 博客访问: 754993
  • 博文数量: 771
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 14:24
文章分类

全部博文(771)

文章存档

2011年(1)

2008年(770)

我的朋友

分类:

2008-09-11 14:32:28


  rivershan(原作)
  
  
  前几天整理出来的一个JAVA的代码书写规范!
  
  项目开发规范
  
  一、目的
  
    对于代码,首要要求是它必须正确,能够按照程序员的真实思想去运行;第二个的要求是代码必须清晰易懂,使别的程序员能够容易理解代码所进行的实际工作。在软件工程领域,源程序的风格统一标志着可维护性、可读性,是软件项目的一个重要组成部分。而目前还没有成文的编码风格文档,以致于很多时候,程序员没有一个共同的标准可以遵守,编码风格各异,程序可维护性差、可读性也很差。通过建立代码编写规范,形成开发小组编码约定,提高程序的可靠性、可读性、可修改性、可维护性、可继承性和一致性,可以保证程序代码的质量,继承软件开发成果,充分利用资源,使开发人员之间的工作成果可以共享。
  
   本文在参考业界已有的编码风格的基础上,描述了一个基于 JBuilder 的项目风格,力求一种统一的编程风格,并从整体编码风格、代码文件风格、函数编写风格、变量风格、注释风格等几个方面进行阐述。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)
  
  
  二、整体编码风格
  
  1、缩进
  
   缩进建议以4个空格为单位。建议在 Tools/Editor Options 中设置 Editor 页面的Block ident为4,Tab Size 为8。预处理语句、全局数据、标题、附加说明、函数说明、标号等均顶格书写。语句块的"{"、"}"配对对齐,并与其前一行对齐,语句块类的语句缩进建议每个"{"、"}"单独占一行,便于匹对。JBuilder 中的默认方式是开始的"{"不是单独一行,建议更改成上述格式(在 Project/Default Project Properties 中设置 Code Style 中选择 Braces 为 Next line)。
  
  2、空格
  
   原则上变量、类、常量数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如:if ( ... ) 等。运算符的空格规定如下:"::"、"->"、"["、"]"、"++"、"--"、"~"、"!"、"+"、"-"(指正负号)、"&"(引用)等几个运算符两边不加空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符"?:"两边均加一空格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。","运算符只在其后空一格,需对齐时也可不空或多空格。不论是否有括号,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。个人认为此项可以依照个人习惯决定遵循与否。
  
  3、对齐
  
   原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在","处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。
  
   变量定义最好通过添加空格形成对齐,同一类型的变量最好放在一起。如下例所示:
  int Value;
  int Result;
  int Length;
  DWORD Size;
  DWORD BufSize;
  
  个人认为此项可以依照个人习惯决定遵循与否。
  
  4、空行
  
  不得存在无规则的空行,比如说连续十个空行。程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行,由于每个函数还要有函数说明注释,故通常只需空一行或不空,但对于没有函数说明的情况至少应再空一行。对自己写的函数,建议也加上“//------”做分隔。函数内部数据与代码之间应空至少一行,代码中适当处应以空行空开,建议在代码中出现变量声明时,在其前空一行。类中四个“p”之间至少空一行,在其中的数据与函数之间也应空行。
  
  5、注释
  
  注释是软件可读性的具体体现。程序注释量一般占程序编码量的20%,软件工程要求不少于20%。程序注释不能用抽象的语言,类似于"处理"、"循环"这样的计算机抽象语言,要精确表达出程序的处理说明。例如:"计算净需求"、"计算第一道工序的加工工时"等。避免每行程序都使用注释,可以在一段程序的前面加一段注释,具有明确的处理逻辑。
  
  注释必不可少,但也不应过多,不要被动的为写注释而写注释。以下是四种必要的注释:
  
  A. 标题、附加说明。
  
  B. 函数、类等的说明。对几乎每个函数都应有适当的说明,通常加在函数实现之前,在没有函数实现部分的情况下则加在函数原型前,其内容主要是函数的功能、目的、算法等说明,参数说明、返回值说明等,必要时还要有一些如特别的软硬件要求等说明。公用函数、公用类的声明必须由注解说明其使用方法和设计思路,当然选择恰当的命名格式能够帮助你把事情解释得更清楚。
  
  C. 在代码不明晰或不可移植处必须有一定的说明。
  
  D. 及少量的其它注释,如自定义变量的注释、代码书写时间等。
  
   注释有块注释和行注释两种,分别是指:"/**/"和"//"建议对A用块注释,D用行注释,B、C则视情况而定,但应统一,至少在一个单元中B类注释形式应统一。具体对不同文件、结构的注释会在后面详细说明。
  
  6、代码长度
  
  对于每一个函数建议尽可能控制其代码长度为53行左右,超过53行的代码要重新考虑将其拆分为两个或两个以上的函数。函数拆分规则应该一不破坏原有算法为基础,同时拆分出来的部分应该是可以重复利用的。对于在多个模块或者窗体中都要用到的重复性代码,完全可以将起独立成为一个具备公用性质的函数,放置于一个公用模块中。
  
  7、页宽
  
  页宽应该设置为80字符。源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.
  
  8、行数
  
  一般的集成编程环境下,每屏大概只能显示不超过50行的程序,所以这个函数大概要5-6屏显示,在某些环境下要8屏左右才能显示完。这样一来,无论是读程序还是修改程序,都会有困难。因此建议把完成比较独立功能的程序块抽出,单独成为一个函数。把完成相同或相近功能的程序块抽出,独立为一个子函数。可以发现,越是上层的函数越简单,就是调用几个子函数,越是底层的函数完成的越是具体的工作。这是好程序的一个标志。这样,我们就可以在较上层函数里容易控制整个程序的逻辑,而在底层的函数里专注于某方面的功能的实现了。
  
  
  三、代码文件风格
  
  所有的 (*.java) 文件都必须遵守如下的样式规则:
  
  . 文件生成
  
  对于规范的 JAVA 派生类,尽量用 JBuilder 的 Object Gallery 工具来生成文件格式,避免用手工制作的头文件/实现文件。
  
  . package/import
  
  package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
  
  package hotlava.net.stats;
  
  import java.io.*;
  import java.util.Observable;
  import hotlava.util.Application;
  
  这里 java.io.* 使用来代替InputStream and OutputStream 的。
  
  . 文件头部注释
  
  文件头部注释主要是表明该文件的一些信息,是程序的总体说明,可以增强程序的可读性和可维护性。文件头部注释一般位于 package/imports 语句之后,Class 描述之前。要求至少写出文件名、创建者、创建时间和内容描述。JBuilder 的 Object Gallery 工具生成的代码中会在类、工程文件中等自动添加注释,我们也要添加一些注释,其格式应该尽量约束如下:
  
  /**
  * Title: 确定鼠标位置类
  * Description: 确定鼠标当前在哪个作业栏位中并返回作业号
  * @Copyright: Copyright (c) 2002
  * @Company: HIT
  * @author: rivershan
  * @version: 1.0
  * @time: 2002.10.30
  */
  
  . Class
  
  接下来的是类的注释,一般是用来解释类的。
  
  /**
  * A class representing a set of packet and byte counters
  * It is observable to allow it to be watched, but only
  * reports changes when the current set is complete
  */
  
  接下来是类定义,包含了在不同的行的 extends 和 implements
  
  public class CounterSet
   extends Observable
   implements Cloneable
  
  .Class Fields
  
  接下来是类的成员变量:
  
  /**
  * Packet counters
  */
  
  protected int[] packets;
  
  public 的成员变量必须生成文档(Doc)。proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。
  
  . 存取方法
  
  接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。(个人认为尽量分行写)
  
  /**
  * Get the counters
  * @return an array containing the statistical data. This array has been
  * freshly allocated and can be modified by the caller.
  */
  
  public int[] getPackets()
  {
   return copyArray(packets, offset);
  }
  
  public int[] get
【责编:admin】

--------------------next---------------------

阅读(481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~