- 浏览: 137492 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
shantuijun:
不能下载啊
eclipse开发J2EE项目系列(2)——Struts2+Hibernate3+mysql5 -
q595153335:
十一月 20, 2013 2:00:41 下午 org.apa ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建 -
frand_feng:
为什么我的Eclipse添加完struts2的框架就开始报错呀 ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建 -
dingyushuang:
为什么我的Eclipse添加完struts2的框架就开始报错呀 ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建 -
xp1056:
博主,不知道你的例子不行,还是我配置的IDE(Eclipse ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建
简介
多年来,作为一名软件开发者和顾问,我看到过各种程序语言编写的大量代码。其中有书写优雅的,也有书写丑陋的,不幸的是很
多代码都属于后者。我希望说服你和我的开发伙伴我们应该在代码风格上给予更多的关注,就像我们关注用户界面和应用程序的其它部分那样。这一系列由两部分组
成,在第一部分中,我将解释为什么我们应该关心代码看起来到底是什么样子,并向你展示良好Java风格的一些基本要素。
为什么风格如此重要
虽然Java是用来写程序而不是写散文的,但它也是用来表达思想和想法的。而且,除了传递信息,这些思想和想法也必须确实在解决一些问题。也许你会顾虑好的风格或许会像是在浪费时间,但它可以让我们在代码中表达的思想和想法格外的清晰。
这里是使用良好风格的一些理由[来自"Java Code Conventions," Sun Microsystems]:
一个软件产品一生80%的花费是在维护上。
任何软件都几乎不可能一生都由软件的原作者来维护。
好的风格能够提高软件代码的可维护性。
如果软件还附带源码的话,那它应该像产品的其它部分那样结构良好,清晰,专业。
以良好的风格编写代码还有下面这些好处:
提高代码的可阅读性,连贯性和一致性,这样使代码容易理解和维护。
易于跟踪和调试,因为代码是清晰和连贯的。
易于从你或别的程序员停止的地方继续编写代码,特别是经过较长的一段时间以后。
提高代码指南的价值,因为参与者可以更加集中注意力去了解代码正在做什么。
一般原则
以良好的风格编写Java并不困难,但确实需要注意细节。这里是一些应该遵守的一般原则:
使代码清晰并易于阅读。
使代码一致。
使用明显的标识符。
有逻辑地组织文件和类。
每个文件只有一个类(不包括内部类)。
最大行宽在80-90个字符之间。
使用空格和(或)其它易于判断的分隔符。
缩进使用空格而不是制表符。
制表符 vs. 空格
制表符 vs. 空格是一个有关编写代码的严谨问题,我并不想让你认为只有一种正确方式。我赞成使用空格是因为它确保我的代码在我的编辑器里和在你的编辑器里看起来一样,反之亦然。如果你感觉使用空格而不是制表符“就是不对”,那么就用制表符吧。
大括号和缩进
缩进风格(参看,Raymond, "Indent Style")或者大括号("{" 和 "}")和相关的代
码缩进是另一个关于编写代码的严谨问题。像Java这种C风格的编程语言,有很多种缩进风格,并且我也不想说它们其中的哪一种就更好一些。在这篇文章的大
部分示例代码中,我使用人们常说的K&R风格。如果你不喜欢K&R,那就用另一种风格好了。
注释
你可以有两种类型的注释放到你的Java代码中:Javadoc注释(也叫文档注释)和实现注释。Javadoc注释可以用javadoc工具提取并产生API文档。实现注释用来解释代码的“如何”和“为什么”。使用下面的原则来注释你的Java代码。
在任何允许使用Javadoc注释的地方使用Javadoc注释(最起码用在类和方法上)。
使用块注释而不是行尾(拖尾)注释,除了一些特殊情况,比如变量的声明。
而且,要记住好的注释总是有帮助的;而坏的注释却是令人讨厌的。
例1. 坏的注释风格。
- // applyRotAscii() -- Apply ASCII ROT
- private void applyRotAscii(){
- try {
- int rotLength = Integer .parseInt(rotationLengthField.getText().trim()); // get rot len
- RotAscii cipher = new RotAscii(rotLength); // new cipher
- textArea.setText(cipher.transform(textArea.getText())); // transform
- }catch (Exception ex){
- /* Show exception */
- ExceptionDialog.show(this , "Invalid rotation length: " , ex); }
- }
例2. 好的注释风格。
- /**
- * Apply the ASCII rotation cipher to the user's text. The length is retrieved
- * from the rotation length field, and the user's text is retrieved from the
- * text area.
- *
- * @author Thornton Rose
- */
- private void applyRotAscii() {
- int rotLength = 0; // rotation length
- RotAscii cipher = null ; // ASCII rotation cipher
- try {
- // Get rotation length field and convert to integer.
- rotLength = Integer .parseInt(rotationLengthField.getText().trim());
- // Create ASCII rotation cipher and transform the user's text with it.
- cipher = new RotAscii(rotLength);
- textArea.setText(cipher.transform(textArea.getText()));
- } catch (Exception ex) {
- // Report the exception to the user.
- ExceptionDialog.show(this , "Invalid rotation length: " , ex);
- }
- }
块和声明
使用下面的原则来写块和声明:
每行只放置一个声明。
控制声明的时候总是使用大括号(比如,'if')。
考虑在块结束的地方做注释(比如,} //end if),特别是那些长的或者嵌套的块。
把各种变量的声明放在块的开头。
总是初始化变量。
如果想做完美主义者,左对齐变量名。
switch块中缩进case子句。
操作符的前后分别加上空格。
使用if,for,或者while的时候,在"("前面加上空格。
在表达式中使用空格和圆括号以提高可阅读性。
'for'循环中的变量在应用“把各种变量的声明放在块的开头”的原则时是个例外。循环变量应该在for语句的初始化部分进行声明,比如,for(int i = 0; ...)
在块结束的地方放置一个声明有助于你捕捉到意外删除的结束大括号。有时候,在一个巨大的文件中要想找到它们真的会把你逼疯的。
例3. 坏的块风格。
- try {
- for (int i=0;i<5;i++){
- ...
- }
- int threshold=calculateThreshold();
- float variance=(threshold*2.8)-1;
- int c=0;
- if (threshold<=15) c=calculateCoefficient();
- switch (c){
- case 1: setCeiling(c*2); break ;
- case 2: setCeiling(c*3); break ;
- else : freakOut();
- }
- }catch (Exception ex){ ... }
例4. 好的块风格。
- try {
- int threshold = 0;
- float variance = 0.0;
- int coefficient = 0;
- // Prepare 5 cycles.
- for (int i = 0; i < 5; i ++){
- prepareCycle(i);
- }
- // Calculate the threshold and variance.
- threshold = calculateThreshold();
- variance = (threshold * 2.8) - 1;
- // If the threshold is less than the maximum, calculate the coefficient.
- // Otherwise, throw an exception.
- if (threshold <= MAX_THRESHOLD) {
- coefficient = calculateCoefficient();
- } else {
- throw new RuntimeException ("Threshold exceeded!" );
- }
- // Set the ceiling based on the coefficient.
- switch (coefficient) {
- case 1:
- setCeiling(coefficient * 2);
- break ;
- case 2:
- setCeiling(coefficient * 3);
- break ;
- else :
- freakOut();
- } // end switch
- } catch (Exception ex) {
- ...
- } // end try
简介
这是这个两部分的关于Java编码风格系列的结论部分。在第一部分中,我介绍了我用良好的习惯来编写Java的一些情况,解释了为什么我们
应该关心我们代码的样子,并且展示了良好Java风格的一些基本要素。在这个部分,我会展示良好Java风格的更多要素,并把我的情况作一个总结。
源文件
有很多种方式来组织Java源文件。这是工作得很好的一个:
文件头注释(可选)。
包声明。
空行或其它分隔符。
导入声明。
空行或其它分隔符。
类。
例1. 坏的文件组织。
- package org.rotpad;
- import java.awt.*;
- import javax.swing.event.*;
- import org.javacogs.*;
- import javax.swing.*;
- import java.awt.event.*;
- class Foo {
- ...
- }
- public class RotPad extends JFrame {
- ...
- }
例2. 好的文件组织。
- package org.rotpad;
- // Java classes
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.event.*;
- // JavaCogs classes
- import org.javacogs.*;
- /**
- * RotPad is a simple GUI application for performing rotation ciphers on plain
- * text.
- *
- * @author Thornton Rose
- * @version 1.0
- */
- public class RotPad extends JFrame {
- ...
- }
- //-----------------------------------------------------------------------------
- /**
- * Foo is ...
- *
- * @author Thornton Rose
- * @version 1.0
- */
- class Foo {
- ...
- }
导入声明
一个复杂的类可以有大量的导入,这些导入会变得不可控制,特别是如果你喜欢导入单个类而不是整个包(比如,java.awt.*)。为了能够处理这些导入,像下面这样来处理它们:
Java标准类(java.*)。
Java扩展类(javax.*)。
第三方类。
应用程序类。
一定要为第三方类和应用程序类作注释,特别是那些名字不容易让人辨认的类。使用行尾注释,或者在这一部分的开头放一个注释。同样,如果你真的想成为一个完美主义者,那么按照字母顺序为导入的每一组类进行排序。
例3. 坏的导入风格。
- import java.util.*;
- import javax.swing.*;
- import java.awt.event*;
- import com.gensym.com.*;
- import javax.swing.table.*;
- import com.pv.jfcx.*;
- import java.awt.*;
- import com.melthorn.util.*;
例4a. 好的导入风格。
- import java.awt.*;
- import java.awt.event*;
- import java.util.*;
- import javax.swing.table.*;
- import com.gensym.com.*; // BeanXporter
- import com.pv.jfcx.*; // ProtoView
- import com.melthorn.util.*; // Utilities
例4b. 好的导入风格。
- // Java classes
- import java.awt.*;
- import java.awt.event*;
- import java.util.*;
- import javax.swing.table.*;
- // BeanXporter
- import com.gensym.com.*;
- // ProtoView GUI components
- import com.pv.jfcx.*;
- // Application classes
- import com.melthorn.util.*;
类
组织Java源文件的时候如果不把类组织好,那么你同样得不到良好的风格。现在教你如何组织源文件里的类。
Javadoc注释或者其它头注释。
类声明。
域(Field)声明。
空行或其它分隔符。
构建器。
空行或其它分隔符。
方法,除了main(),有逻辑的聚合起来。
空行或其它分隔符。
内部类。
空行或其它分隔符。
main()。
例5. 坏的类风格。
- // RotPad -- GUI app. for ROT ciphering
- public class RotPad extends JFrame {
- private static final String TRANSFORM_ROT13 = "ROT13" ;
- private static final String TRANSFORM_ROT13N5 = "ROT13N5" ;
- private static final String TRANSFORM_ROTASCII = "ROT-ASCII" ;
- private void jbInit() throws Exception {
- ...
- }
- public static final String TITLE = "RotPad" ;
- public static final String VERSION = "1.0" ;
- public static void main(String [] args) {
- ...
- }
- public RotPad() {
- ...
- }
- private JPanel jPanel1 = new JPanel ();
- private JPanel jPanel2 = new JPanel ();
- private BorderLayout borderLayout1 = new BorderLayout ();
- ...
- }
例6. 好的类风格。
- /**
- * RotPad is a simple GUI application for performing rotation ciphers on plain
- * text.
- *
- * @author Thornton Rose
- * @version 1.0
- */
- public class RotPad extends JFrame {
- // Public constants
- public static final String TITLE = "RotPad" ;
- public static final String VERSION = "1.0" ;
- // Private constants
- private static final String TRANSFORM_ROT13 = "ROT13" ;
- private static final String TRANSFORM_ROT13N5 = "ROT13N5" ;
- private static final String TRANSFORM_ROTASCII = "ROT-ASCII" ;
- // GUI components [JBuilder generated]
- private BorderLayout borderLayout1 = new BorderLayout ();
- private JPanel jPanel1 = new JPanel ();
- private JPanel jPanel2 = new JPanel ();
- ...
- /**
- * Construct a new instance of this class.
- */
- public RotPad() {
- ...
- }
- /**
- * Initialize UI components. [JBuilder generated]
- */
- private void jbInit() throws Exception {
- ...
- }
- ...
- //--------------------------------------------------------------------------
- /**
- * Start the application.
- */
- public static void main(String [] args) {
- ...
- }
- }
域声明
一些类有大量的域,如果不组织好的话,维护起来是非常难的。像下面这样来组织它们:
public常量(final和static final)。
public变量。
protected常量
protected变量。
package常量。
package变量。
private常量。
private变量。
而且,写域声明的时候遵守下面的原则:
每行只写一个声明。
最起码,为public和protected域写Javadoc注释。
常量名用大写,因为大写使它们在声明和表达式中都更加显眼。
如果你使用能够产生域声明的工具,比如JBuilder或者Visual Cafe,要把自动产生的域和其它的域分开,这样维护UI代码的时候会容易一些。
例7. 坏的域风格。
- public class CustomerSearchDialog extends JDialog {
- private JLabel firstNameLabel = new JLabel ();
- private JLabel lastNameLabel = new JLabel ();
- public static final RESULT_SELECT = 1;
- private Vector results = new Vector (); // Search results.
- private DefaultTableModel tableModel = new DefaultTableModel ();
- public static final RESULT_CANCEL = 0;
- // ...
- }
例8. 好的域风格。
- /**
- * ...
- */
- public class CustomerSearchDialog extends JDialog {
- /**
- * Indicates that search was cancelled; returned by showDialog() when
- * user clicks cancel button.
- */
- public static final RESULT_CANCEL = 0;
- /**
- * Indicates that a customer was selected; returned by showDialog() when
- * user clicks select button.
- */
- public static final RESULT_SELECT = 1;
- private Vector results = new Vector (); // Search results.
- private DefaultTableModel tableModel = new DefaultTableModel (); // Grid model.
- // GUI fields. [JBuilder]
- private JLabel firstNameLabel = new JLabel ();
- private JLabel lastNameLabel = new JLabel ();
- // ...
- }
方法声明
编写方法声明的时候遵守下面的原则:
总是要有Javadoc注释或其它头注释。
总是要把访问修饰符放在前面。
如果行太长,把它分为一行或多行。
如果方法参数过多,考虑每行只放一个。
不要在方法名和开圆括号("(")之间加入空格。
总是在闭圆括号(")")和开大括号("{")之间加入空格(它可以是一个分行符)。
例9. 坏的方法风格。
- public int getTypeCount (String custType)
- {
- ...
- }
- static public getInstance(){ ... };
- public void showRange()
- throws RangeException {
- ...
- }
例10. 好的方法风格。
- /**
- * Return the single instance of this class.
- */
- public static CalculationEngine getInstance() {
- return instance;
- }
- /**
- * Calculate the consumption coefficient.
- */
- public float calculateConsumptionCoefficient(int base, float variance,
- int iterations) throws RangeException {
- // ...
- }
- /**
- * Calculate the consumption coefficient.
- */
- public float calculateConsumptionCoefficient(
- int base,
- float variance,
- int iterations)
- throws RangeException
- {
- // ...
- }
- /**
- * Calculate the consumption coefficient.
- */
- public float calculateConsumptionCoefficient(int base,
- float variance,
- int iterations)
- throws RangeException
- {
- // ...
- }
结论
至于结论,在关于编码风格的主题上,我有一个最终的想法告诉你。无论你遵守怎样的原则,也无论你关于一些事情比如缩进风格(参 看, Raymond, "Indent Style")的信仰是如何强烈,你要记住的是当你编写代码的时候你总的目标应该是让代码在别人眼里看起来是可 以理解和可以维护的。
发表评论
-
线程的使用方法
2009-06-09 17:25 1190创建线程有两种方法:继承Thread类和实现Runnable接 ... -
如何才算掌握Java(J2SE篇)
2009-06-09 17:25 1036时常看到一些人说掌握 ... -
探讨static的执行顺序
2009-06-09 17:24 1438public class Test { ... -
java链表倒序
2009-06-09 17:23 3536=============Node.java========= ... -
获取web服务器绝对路径
2009-06-09 17:10 4091如果想在一个web工程中用java生成一个文件,则获得服务器的 ... -
全世界所有JAVA程序员都会犯的错误-蔡学镛
2009-06-09 17:10 736当年,国际巨星成龙的「龙种」曝光,众人指责他对不起娇妻林凤娇, ... -
java对象序列化学习笔记
2009-06-09 17:09 741目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原 ... -
java文件操作大全
2009-06-09 17:08 753java文件操作大全 文件的建立/检查与删除 <%@ ... -
Java中static、this、super、final用法简谈
2009-06-09 17:04 671本篇旨在帮助准备学习J ... -
操纵java数组
2009-06-09 17:04 749如果你做过很多java程序,你可能对java集合类很熟悉,例如 ... -
计算Java日期
2009-06-09 17:02 662作者:Robert Nielsen 翻 ... -
使用java.util.Timer 分享修改删除
2009-06-09 17:00 1938在应用开发中,经常需要一些周期性的操作,比如每5分钟检查一下新 ... -
利用JExcel API操作EXCEL文件(部分转载)
2009-06-09 16:53 3372AVA EXCEL API简介 ... -
java读文件
2009-06-09 16:40 1741最初JAVA是不支持对文本文件的处理的,为了弥补这个缺憾而引入 ... -
java环境变量
2008-12-11 14:13 1589一直用IDE,很少配置环境变量,今天看到有人问这方 ... -
电梯问题
2008-12-09 16:42 994昨天在网上看到有朋友问如何解决电梯问题,感觉比较有意 ...
相关推荐
Java编程风格与规范,经典书籍转义成的文档。每个JAVA编程者都必须掌握的书,一本权威书。
学会编制结构清晰、风格良好适当的java语言程序,从而具备解决综合性实际问题的能力1.2课程设计内容和要求1、系统需实现基础功能:增、删、改、查。2、学生可自行添加完善功能。3、界面美观得体,(1)登陆界面醒目...
java写的画图软件,支持画线,画方等,可以选择画笔颜色。
Java代码编程的风格的介绍以及推荐,很好的给出了编写Java甚至是其他代码的一些良好的编程习惯,对于Java初学者有较好的指导意义
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...
关于培养良好的编程风格的一些建议 希望对大家有用······
技能目标 :・培养学生规范编码和良好的程序设计风格; :・能够应用Java语言进行程序设计; 数据类型、运算符、字符串、数组等知识在编程过程中能熟练、准确应用; ・:・能熟练、准确地应用分支、循环、跳转三种...
初级java笔试题Twitter Java 风格指南 Java 风格指南 本指南的目的是提供一组鼓励良好代码的约定。 它是许多人年软件工程和 Java 开发经验的结晶。 虽然有些建议比其他建议更严格,但您应该始终保持良好的判断力。 ...
1)可以用C++或者Java撰写,不需要写界面; 2)要求在通用开发平台上可以调试并无误运行; 3)代码长度没有要求;...5)代码需要给出必要的注释,书写风格良好; 6)以读文件的形式读入“测试数据”.
java编码规范,帮助您编写具有良好风格的java程序
本文在参考业界已有的编码风格的基础上,描述了一个基于 JBuilder 的项目风格,力求一种统一的编程风格,并从整体编码风格、代码文件风格、函数编写风格、变量风格、注释风格等几个方面进行阐述。(这些规范并不是...
北京大学《JAVA语言程序... 能编写出具有良好风格的程序。 (2). 掌握JAVA程序设计的基本技能和面向对象的概念和方法。 (3). 了解多线程、安全和网络等编程技术。 <br>第二部分 各章重点、难点和复习要求说明
为使开发项目中所有的JAVA程序代码的风格保持一致,增加代码的可读性,便于维护及内部交流,使JAVA程序开发人员养成良好的编码习惯,有必要对JAVA程序的代码编码风格做统一的规范约束。本文档定义了我公司软件开发...
世界风java源码Java 风格指南 任何傻瓜都可以编写计算机可以理解的代码。 优秀的程序员会编写人类可以理解的代码。 马丁花 如果您使用 IntelijIdea,本文档中的大部分要点都可以通过使用自动格式化来完成,所以不要...
一个带界面的java小程序,可实现对所选任何类型的文件进行拷贝,并对此复制过程有进度条显示。代码风格良好,适合初学者借鉴。
7、具备良好的编码风格和开发习惯,熟练掌握UML设计工具; 8、熟悉linux或unix操作系统文件系统以及常用命令; 9. 熟悉Tomcat等应用服务器的使用,熟悉LINUX操作系统,熟悉TCP/IP、HTTP等网络协议,掌握多线程编程,...
本书以介绍Java语言为主线,不仅涵盖 Java语言的基本知识,而且介绍了软件工程技术以及如何应用良好的程序设计风格进行开发等内容
2.5 良好的Java程序代码编写风格 32 2.5.1 程序语句 32 2.5.2 程序块 33 2.5.3 程序注释 33 2.5.4 避免太长的程序代码 33 2.5.5 程序代码缩排 33 学习评估 34 第3章 变量、数据类型与运算符 35 3.1...