`
celsword
  • 浏览: 23931 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

JAVA项目之SSH编码规范

阅读更多
编码规范目的:风格统一、代码可读性增强,便于维护

适用范围:J2EE项目,用SSH作为开发框架

一、包命名规范

1、servlet类所在包命名规范:公司名称.项目名称.web.servlet

      如com.ninetowns.Lims.web.servlet

2、Action类所在包命名规范:公司名称.项目名称.web.struts.action

      如com.ninetowns.Lims.web.action

3、Action类所在包命名规范:公司名称.名项目名称.web.form

     如com.ninetowns.Lims.web.form

4、hibernate的bean类所在包命名规范:公司名称.名项目名称.bean

     如com.ninetowns.Lims.bean

5、全局类所在包命名规范:公司名称.名项目名称.global

     如com.ninetowns.Lims.global

6、dao层接口所在包命名规范:公司名称.名项目名称.dao

     如com.ninetowns.Lims.dao

7、dao层接口实现类所在包命名规范:公司名称.名项目名称.dao.impl

    如com.ninetowns.Lims.dao.impl

8、业务层接口所在包命名规范:公司名称.名项目名称.bus

    如com.ninetowns.Lims.bus

9、业务层接口实现类所在包命名规范:公司名称.名项目名称.bus.impl

   如com.ninetowns.Lims.bus.impl

二、类命名规范

1、以大写字母开头,多个单词每个单词开头字母大写

    如DataFile

2、接口命名:以大写字母“I”开头

   如IApplyImport

3、实现类命名:将接口的大写字母“I”去掉,加后缀“Impl”

   如ApplyImportImpl

三、其它命名规范

    1、变量命名:

变量名首字母必须小写,如果该变量名有多个单词组成,后面的单 词首字母大写,单词与单词之间不要使用"_"做连接,变量名访问控制必须为私有, 可以对其增加setter与getter方法。

     2、常量命名:

        所有字母大写,如果有多个单词组成,单词与单词之间以” _“隔开。而  且该变量必须是公共、静态、final类型   

     3、方法命名:

      首字母必须小写,如果该变量名有多个单词组成,后面的单词首字母  大写,单词与单词之间不要使用"_"做连接。单词不要使用名词

四、项目组织

     在项目组织上,分为文档和源文件进行管理

    如Lims下有两个文件夹分别是“工作文档”和“code”。在“工作文档”下有“需求分析”、“系统设计”、“数据模型”、“系统原型”、“系统测试”、“部署发布”和“开发计划”等文档;在“code”下放源代码,对其进行版本控制。


Java部分
所有的程序开发手册都包含了各种规则。一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的。这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑。

命名规范
定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)

Package 的命名
Package 的名字应该都是由一个小写单词组成。

Class 的命名
Class 的名字必须由大写字母开头而其他字母都小写的单词组成

Class 变量的命名
变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。

Static Final 变量的命名
Static Final 变量的名字应该都大写,并且指出完整含义。

参数的命名
参数的名字必须和变量的命名规范一致。

数组的命名
数组应该总是用下面的方式来命名:
byte[] buffer;
复制代码
而不是:
byte buffer[];
复制代码
方法的参数
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size){

this.size = size;

}
复制代码
Java 文件样式
所有的 Java(*.java) 文件都必须遵守如下的样式规则

版权信息
版权信息必须在 java 文件的开头,比如:
/**

* Copyright ? 2000 Shanghai XXX Co. Ltd.

* All right reserved.

*/
复制代码
其他不需要出现在 javadoc 的信息也可以包含在这里。

Package/Imports
package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
package hotlava.net.stats;



import java.io.*;

import java.util.Observable;

import hotlava.util.Application;
复制代码
这里 java.io.* 使用来代替InputStream and OutputStream 的。

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 的成员变量必须生成文档(JavaDoc)。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[] getBytes() { return copyArray(bytes, offset); }

public int[] getPackets() { return packets; }

public void setPackets(int[] packets) { this.packets = packets; }
复制代码
其它的方法不要写在一行上

构造函数
接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。
访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
public

CounterSet(int size){

this.size = size;

}
复制代码
克隆方法
如果这个类是可以被克隆的,那么下一步就是 clone 方法:
public

Object clone() {

try {

CounterSet obj = (CounterSet)super.clone();

obj.packets = (int[])packets.clone();

obj.size = size;

return obj;

}catch(CloneNotSupportedException e) {

throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());

}

}
复制代码
类方法
下面开始写类的方法:
/**

* Set the packet counters

* (such as when restoring from a database)

*/

protected final

void setArray(int[] r1, int[] r2, int[] r3, int[] r4)

throws IllegalArgumentException

{

//

// Ensure the arrays are of equal size

//

if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)

throw new IllegalArgumentException("Arrays must be of the same size");

System.arraycopy(r1, 0, r3, 0, r1.length);

System.arraycopy(r2, 0, r4, 0, r1.length);

}
复制代码
toString 方法
无论如何,每一个类都应该定义 toString 方法:
public

String toString() {

String retval = "CounterSet: ";

for (int i = 0; i < data.length(); i++) {

retval += data.bytes.toString();

retval += data.packets.toString();

}

return retval;

}

}
复制代码
main 方法
如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.

代码编写格式

代码样式
代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行)

文档化
必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。使用 @author 标记是不被推荐的,因为代码不应该是被个人拥有的。

缩进
缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.
如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室2个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。

页宽
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.
{} 对
{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:
if (i>0) { i ++ }; // 错误, { 和 } 在同一行



if (i>0) {

i ++

}; // 正确, { 单独作为一行
复制代码
} 语句永远单独作为一行.

如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。

括号
左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:
CallProc( AParameter ); // 错误

CallProc(AParameter); // 正确

复制代码
不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:
if ((I) = 42) { // 错误 - 括号毫无意义

if (I == 42) or (J == 42) then // 正确 - 的确需要括号

复制代码
程序编写规范
exit()
exit 除了在 main 中可以被调用外,其他的地方不应该调用。因为这样做不给任何代码代码机会来截获退出。一个类似后台服务地程序不应该因为某一个库模块决定了要退出就退出。

异常
申明的错误应该抛出一个RuntimeException或者派生的异常。
顶层的main()函数应该截获所有的异常,并且打印(或者记录在日志中)在屏幕上。

垃圾收集
JAVA使用成熟的后台垃圾收集技术来代替引用计数。但是这样会导致一个问题:你必须在使用完对象的实例以后进行清场工作。比如一个prel的程序员可能这么写:
...

{

FileOutputStream fos = new FileOutputStream(projectFile);

project.save(fos, "IDE Project File");

}

...
复制代码
除非输出流一出作用域就关闭,非引用计数的程序语言,比如JAVA,是不能自动完成变量的清场工作的。必须象下面一样写:
FileOutputStream fos = new FileOutputStream(projectFile);

project.save(fos, "IDE Project File");

fos.close();
复制代码
Clone
下面是一种有用的方法:
implements Cloneable



public

Object clone()

{

try {

ThisClass obj = (ThisClass)super.clone();

obj.field1 = (int[])field1.clone();

obj.field2 = field2;

return obj;

} catch(CloneNotSupportedException e) {

throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());

}

}
复制代码
final 类
绝对不要因为性能的原因将类定义为 final 的(除非程序的框架要求)
如果一个类还没有准备好被继承,最好在类文档中注明,而不要将她定义为 final 的。这是因为没有人可以保证会不会由于什么原因需要继承她。
访问类的成员变量
大部分的类成员变量应该定义为 protected 的来防止继承类使用他们。
注意,要用"int[] packets",而不是"int packets[]",后一种永远也不要用。
public void setPackets(int[] packets) { this.packets = packets; }



CounterSet(int size)

{

this.size = size;

}
复制代码
编程技巧
byte 数组转换到 characters
为了将 byte 数组转换到 characters,你可以这么做:
"Hello world!".getBytes();
复制代码
Utility 类
Utility 类(仅仅提供方法的类)应该被申明为抽象的来防止被继承或被初始化。

初始化
下面的代码是一种很好的初始化数组的方法:
objectArguments = new Object[] { arguments };
复制代码
枚举类型
JAVA 对枚举的支持不好,但是下面的代码是一种很有用的模板:
class Colour {

public static final Colour BLACK = new Colour(0, 0, 0);

public static final Colour RED = new Colour(0xFF, 0, 0);

public static final Colour GREEN = new Colour(0, 0xFF, 0);

public static final Colour BLUE = new Colour(0, 0, 0xFF);

public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);

}
复制代码
这种技术实现了RED, GREEN, BLUE 等可以象其他语言的枚举类型一样使用的常量。 他们可以用 '==' 操作符来比较。
但是这样使用有一个缺陷:如果一个用户用这样的方法来创建颜色 BLACK
new Colour(0,0,0)
复制代码
那么这就是另外一个对象,'=='操作符就会产生错误。她的 equal() 方法仍然有效。由于这个原因,这个技术的缺陷最好注明在文档中,或者只在自己的包中使用。

Swing
避免使用 AWT 组件
混合使用 AWT 和 Swing 组件
如果要将 AWT 组件和 Swing 组件混合起来使用的话,请小心使用。实际上,尽量不要将他们混合起来使用。

滚动的 AWT 组件
AWT 组件绝对不要用 JscrollPane 类来实现滚动。滚动 AWT 组件的时候一定要用 AWT ScrollPane 组件来实现。

避免在 InternalFrame 组件中使用 AWT 组件
尽量不要这么做,要不然会出现不可预料的后果。

Z-Order 问题
AWT 组件总是显示在 Swing 组件之上。当使用包含 AWT 组件的 POP-UP 菜单的时候要小心,尽量不要这样使用。

调试
调试在软件开发中是一个很重要的部分,存在软件生命周期的各个部分中。调试能够用配置开、关是最基本的。

很常用的一种调试方法就是用一个 PrintStream 类成员,在没有定义调试流的时候就为 ,类要定义一个 debug 方法来设置调试用的流。

性能
在写代码的时候,从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。比如:如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。

不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后。
不必要的对象构造
不要在循环中构造和释放对象

使用 StringBuffer 对象
在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用 StringBuffer 对象和她的 append() 方法。如果我们用 String 对象代替 StringBuffer 对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。

避免太多的使用 synchronized 关键字
避免不必要的使用关键字 synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。

可移植性
Borland Jbulider 不喜欢 synchronized 这个关键字,如果你的断点设在这些关键字的作用域内的话,调试的时候你会发现的断点会到处乱跳,让你不知所措。除非必须,尽量不要使用。

换行
如果需要换行的话,尽量用 println 来代替在字符串中使用"\n"。
你不要这样:
System.out.print("Hello,world!\n");

复制代码
要这样:
System.out.println("Hello,world!");
复制代码
或者你构造一个带换行符的字符串,至少要象这样:
String newline = System.getProperty("line.separator");

System.out.println("Hello world" + newline);
复制代码
PrintStream
PrintStream 已经被不赞成(deprecated)使用,用 PrintWrite 来代替她


本文来自: 我要JAVA(www.wyjava.com) 详细文章参考:http://www.wyjava.com/forum-viewthread-tid-1567-page-1-authorid-9.html
分享到:
评论

相关推荐

    SSH.rar_java ssh_java框架项目_ssh

    总的来说,SSH框架的运用使得Java Web开发更加高效和规范,它结合了Spring的强大功能、Struts的优秀架构以及Hibernate的数据库操作便利性,是许多企业级应用的首选框架。通过学习和实践SSH,开发者能够掌握企业级...

    ssh编码规范(简略版)

    本文档将详细介绍《SSH编码规范(简略版)》中的关键知识点,包括JSP页面命名规则、Java方法命名规范、类命名规则以及变量命名规则,并对部分配置文件进行了示例说明。 #### 二、JSP页面命名 在项目中,对于不同的...

    java编码规范

    2. **SSH编码规范** - **Spring框架**: - 遵循IoC(控制反转)和AOP(面向切面编程)原则,尽量减少硬编码。 - 使用@Autowired注解进行依赖注入,避免使用XML配置。 - Service层接口与实现类的命名,接口以`I`...

    完整ssh框架详细项目

    通过阅读和分析这些代码,你可以深入理解SSH框架如何协同工作,以及如何设计和实现一个完整的Java Web项目。 此外,为了学习这个项目,你需要具备Java基础,了解MVC架构,对SQL有一定了解,并且熟悉基本的Web开发...

    JAVA毕业设计源码,门户网站,SSH框架

    同时,为了保证代码质量和可维护性,良好的编码规范、模块化设计和单元测试也是必不可少的环节。 总的来说,这个"JAVA毕业设计源码"是一个综合性的Java Web项目,涵盖了从用户界面到数据库交互的完整流程,对于学习...

    完整的企业人力资源管理系统(SSH+java开发)

    企业人力资源管理系统是一个全面管理企业内部人力...总的来说,一个完整的企业人力资源管理系统是一个涵盖了多种技术、多个层面的复杂项目,需要综合运用SSH框架和Java的优势,以满足企业对人力资源管理的高效需求。

    北大青鸟毕业设计项目SSH客户信息管理系统

    SSH客户信息管理系统是北大青鸟教育机构毕业生在学习过程中的一项重要实践项目,旨在通过实际操作加深对Java开发、SSH框架及客户关系管理的理解与应用。这个系统具备可运行性,并且内含数据库,使用SQL Server作为...

    基于SSH框架的项目

    【SSH框架详解】 SSH框架是Java Web开发中的一个经典组合,由Struts2、Spring3和...同时,良好的设计模式和编码规范也是确保项目质量的关键。理解并熟练运用SSH框架,能帮助开发者构建出稳定、高效的企业级应用。

    JavaEE 编码规范

    ### JavaEE 编码规范详解 ...综上所述,JavaEE编码规范涵盖了从包命名、类命名到注释规范等多个方面,有助于提升代码质量和项目的可维护性。开发者应严格按照这些规范进行开发,以保证项目的顺利进行。

    工作流项目ssh

    工作流项目SSH是一个基于Java技术栈的Web应用项目,它主要使用了三个核心的开源框架:Struts2、Hibernate和Spring。这些框架的整合旨在提供一个高效、灵活且可维护的业务流程管理系统。 **Struts2框架**是MVC(模型...

    ssh项目 需要的jar包整合

    在开发过程中,遵循良好的编码规范和设计原则,比如使用接口而非实现类,保持Action和Service层的职责清晰,利用Spring的AOP进行切面编程,以及使用Hibernate的懒加载策略等,都能提高代码质量和项目的可维护性。...

    酒店管理系统源代码java+ssh+mysql

    【标题】"酒店管理系统源代码java+ssh+mysql"揭示了这是一个...开发过程中,利用了Eclipse等IDE进行编码,并遵循了一定的项目结构规范。对于学习Java Web开发,尤其是酒店行业的管理系统开发,这是一个很好的实践案例。

    Java SSH 家教平台管理系统

    家教平台管理系统采用SSH框架搭建,数据库为mysql,编码比较规范合理,内附整套程序的代码讲解视频,如果看不明白的可以结合视频去学习,比较适合学生下载下来作为毕业设计或者课程设计 ssh,mysql

    SSH商城项目+说明文档.zip

    5. **开发流程**:列出开发步骤,包括需求分析、设计、编码、测试和部署,帮助新手遵循规范完成项目。 Shop子目录很可能是项目的源代码,包含以下几个关键部分: 1. **控制器层**:Struts2的Action类,处理用户...

    ssh框架小项目(东北大学软件学院实验)

    项目的实现中,开发者可能遵循了良好的编码规范,确保了代码的可读性和可维护性。每个功能模块,如登录、注册、增删改查,都有独立的业务逻辑和对应的接口。此外,项目还附带了说明文档,可能包括安装步骤、配置说明...

    基于SSH的OA办公项目源码

    【SSH框架详解】 SSH,全称为Struts2 + Spring + Hibernate,是Java ...学习这个基于SSH的OA办公项目源码,不仅可以掌握SSH框架的实际运用,还能了解企业级应用的开发流程和规范,对于提升Java Web开发技能大有裨益。

    SSH个人相册项目

    6. **最佳实践**:在开发过程中,遵循良好的编码规范和设计原则,比如单一职责原则、开闭原则等,可以使代码更加清晰易懂。同时,使用版本控制系统(如Git)进行代码管理,定期进行单元测试和集成测试,确保代码质量...

    SSH开发规范[文].pdf

    这份文档主要涉及了开发环境、设置规范、编码规范、目录结构、命名规则以及代码组织等多个方面,旨在提高团队协作效率和代码质量。 1. **环境规范**: - 系统设计工具:使用ROSE进行系统设计。 - 数据库设计工具...

Global site tag (gtag.js) - Google Analytics