<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[G]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[God bless you...]]></description>
<link>http://hi.baidu.com/lord%5Fwy</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[Java语言编码规范]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/9cb1071f56c0e0c1a6866977.html]]></link>
        <description><![CDATA[
		
		名称 Java语言编码规范(Java Code Conventions) 
译者 晨光（Morning） 
　简介 本文档讲述了Java语言的编码规范，较之陈世忠先生《c++编码规范》的浩繁详尽，此文当属短小精悍了。而其中所列之各项条款，从编码风格，到注意事项，不单只Java，对于其他语言，也都很有借鉴意义。因为简短，所以易记，大家不妨将此作为handbook，常备案头，逐一对验。 
　声明 如需复制、传播，请附上本声明，谢谢。 
原文出处：http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html， 
译文出处：http://morningspace.51.net/，moyingzz@etang.com  
　目录 

1 介绍 
1.1 为什么要有编码规范 
1.2 版权声明 
2 文件名 
2.1 文件后缀 
2.2 常用文件名 
3 文件组织 
3.1 Java源文件 
3.1.1 开头注释 
3.1.2 包和引入语句 
3.1.3 类和接口声明 
4 缩进排版 
4.1 行长度 
4.2 换行 
5 注释 
5.1 实现注释的格式 
5.1.1 块注释 
5.1.2 单行注释 
5.1.3 尾端注释 
5.1.4 行末注释 
5.2 文挡注释 
6 声明 
6.1 每行声明变量的数量 
6.2 初始化 
6.3 布局 
6.4 类和接口的声明 
7 语句 
7.1 简单语句 
7.2 复合语句 
7.3 返回语句 
7.4 if，if-else，if else-if else语句 
7.5 for语句 
7.6 while语句 
7.7 do-while语句 
7.8 switch语句 
7.9 try-catch语句 
8 空白 
8.1 空行 
8.2 空格 
9 命名规范 
10 编程惯例 
10.1 提供对实例以及类变量的访问控制 
10.2 引用类变量和类方法 
10.3 常量 
10.4 变量赋值 
10.5 其它惯例 
10.5.1 圆括号 
10.5.2 返回值 
10.5.3 条件运算符"?"前的表达式"?"前的表达式 
10.5.4 特殊注释 
11 代码范例 
11.1 Java源文件范例 

  
1 介绍(Introduction) 

1.1 为什么要有编码规范(Why Have Code Conventions) 

编码规范对于程序员而言尤为重要，有以下几个原因： 

- 一个软件的生命周期中，80%的花费在于维护 
- 几乎没有任何一个软件，在其整个生命周期中，均由最初的开发人员来维护 
- 编码规范可以改善软件的可读性，可以让程序员尽快而彻底地理解新的代码 
- 如果你将源码作为产品发布，就需要确任它是否被很好的打包并且清晰无误，一如你已构建的其它任何产品 

为了执行规范，每个软件开发人员必须一致遵守编码规范。每个人。 

1.2 版权声明(Acknowledgments) 

本文档反映的是Sun MicroSystems公司，Java语言规范中的编码标准部分。主要贡献者包括：Peter King，Patrick Naughton，Mike DeMoney，Jonni Kanerva，Kathy Walrath以及Scott Hommel。 

本文档现由Scott Hommel维护，有关评论意见请发至shommel@eng.sun.com 

2 文件名(File Names) 

这部分列出了常用的文件名及其后缀。 

2.1 文件后缀(File Suffixes) 

Java程序使用下列文件后缀： 

文件类别 文件后缀 
Java源文件 .java 
Java字节码文件 .class 

2.2 常用文件名(Common File Names) 

常用的文件名包括： 

文件名 用途 
GNUmakefile makefiles的首选文件名。我们采用gnumake来创建（build）软件。 
README 概述特定目录下所含内容的文件的首选文件名 

3 文件组织(File Organization) 

一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成。超过2000行的程序难以阅读，应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。 

3.1 Java源文件(Java Source Files) 

每个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联，可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。 

Java源文件还遵循以下规则： 

- 开头注释（参见"开头注释"） 
- 包和引入语句（参见"包和引入语句"） 
- 类和接口声明（参见"类和接口声明"） 

3.1.1 开头注释(Beginning Comments) 

所有的源文件都应该在开头有一个C语言风格的注释，其中列出类名、版本信息、日期和版权声明： 

  /* 
   * Classname 
   * 
   * Version information 
   * 
   * Date 
   * 
   * Copyright notice 
   */ 
  

3.1.2 包和引入语句(Package and Import Statements) 

在多数Java源文件中，第一个非注释行是包语句。在它之后可以跟引入语句。例如： 

  package java.awt; 

  import java.awt.peer.CanvasPeer; 
  

3.1.3 类和接口声明(Class and Interface Declarations) 

下表描述了类和接口声明的各个部分以及它们出现的先后次序。参见"Java源文件范例"中一个包含注释的例子。 

  类/接口声明的各部分 注解 
1 类/接口文档注释(/**……*/) 该注释中所需包含的信息，参见"文档注释" 
2 类或接口的声明   
3 类/接口实现的注释(/*……*/)如果有必要的话 该注释应包含任何有关整个类或接口的信息，而这些信息又不适合作为类/接口文档注释。 
4 类的(静态)变量 首先是类的公共变量，随后是保护变量，再后是包一级别的变量(没有访问修饰符，access modifier)，最后是私有变量。 
5 实例变量 首先是公共级别的，随后是保护级别的，再后是包一级别的(没有访问修饰符)，最后是私有级别的。 
6 构造器   
7 方法 这些方法应该按功能，而非作用域或访问权限，分组。例如，一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码。 

4 缩进排版(Indentation) 

4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。一个制表符等于8个空格(而非4个)。 

4.1 行长度(Line Length) 

尽量避免一行的长度超过80个字符，因为很多终端和工具不能很好处理之。 

注意：用于文档中的例子应该使用更短的行长，长度一般不超过70个字符。 

4.2 换行(Wrapping Lines) 

当一个表达式无法容纳在一行内时，可以依据如下一般规则断开之： 

- 在一个逗号后面断开 
- 在一个操作符前面断开 
- 宁可选择较高级别(higher-level)的断开，而非较低级别(lower-level)的断开 
- 新的一行应该与上一行同一级别表达式的开头处对齐 
- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边，那就代之以缩进8个空格。 

以下是断开方法调用的一些例子： 

  someMethod(longExpression1, longExpression2, longExpression3, 
                   longExpression4, longExpression5); 

  var = someMethod1(longExpression1, 
                            someMethod2(longExpression2, 
                                               longExpression3)); 
  

以下是两个断开算术表达式的例子。前者更好，因为断开处位于括号表达式的外边，这是个较高级别的断开。 

  longName1 = longName2 * (longName3 + longName4 - longName5) 
                     + 4 * longname6; //PREFFER 

  longName1 = longName2 * (longName3 + longName4 
                                         - longName5) + 4 * longname6; //AVOID 
  

以下是两个缩进方法声明的例子。前者是常规情形。后者若使用常规的缩进方式将会使第二行和第三行移得很靠右，所以代之以缩进8个空格 

  //CONVENTIONAL INDENTATION 
  someMethod(int anArg, Object anotherArg, String yetAnotherArg, 
                    Object andStillAnother) { 
    ... 
  } 

  //INDENT 8 SPACES TO AVOID VERY DEEP INDENTS 
  private static synchronized horkingLongMethodName(int anArg, 
          Object anotherArg, String yetAnotherArg, 
          Object andStillAnother) { 
    ... 
  } 
  

if语句的换行通常使用8个空格的规则，因为常规缩进(4个空格)会使语句体看起来比较费劲。比如： 

  //DON’T USE THIS INDENTATION 
  if ((condition1 && condition2) 
      || (condition3 && condition4) 
      ||!(condition5 && condition6)) { //BAD WRAPS 
      doSomethingAboutIt();             //MAKE THIS LINE EASY TO MISS 
  } 

  //USE THIS INDENTATION INSTEAD 
  if ((condition1 && condition2) 
          || (condition3 && condition4) 
          ||!(condition5 && condition6)) { 
      doSomethingAboutIt(); 
  } 

  //OR USE THIS 
  if ((condition1 && condition2) || (condition3 && condition4) 
          ||!(condition5 && condition6)) { 
      doSomethingAboutIt(); 
  } 
  

这里有三种可行的方法用于处理三元运算表达式： 

  alpha = (aLongBooleanExpression) ? beta : gamma; 

  alpha = (aLongBooleanExpression) ? beta 
                                   : gamma; 

  alpha = (aLongBooleanExpression) 
          ? beta 
          : gamma; 
  

5 注释(Comments) 

Java程序有两类注释：实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的，使用/*...*/和//界定的注释。文档注释(被称为"doc comments")是Java独有的，并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。 

实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。 

注释应被用来给出代码的总括，并提供代码自身没有提供的附加信息。注释应该仅包含与阅读和理解程序有关的信息。例如，相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中。 

在注释里，对设计决策中重要的或者不是显而易见的地方进行说明是可以的，但应避免提供代码中己清晰表达出来的重复信息。多余的的注释很容易过时。通常应避免那些代码更新就可能过时的注释。 

注意：频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候，考虑一下重写代码使其更清晰。 

注释不应写在用星号或其他字符画出来的大框里。注释不应包括诸如制表符和回退符之类的特殊字符。 

5.1 实现注释的格式(Implementation Comment Formats) 

程序可以有4种实现注释的风格：块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。 

5.1.1 块注释(Block Comments) 

块注释通常用于提供对文件，方法，数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方，比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。 

块注释之首应该有一个空行，用于把块注释和代码分割开来，比如： 

  /* 
   * Here is a block comment. 
   */ 
  

块注释可以以/*-开头，这样indent(1)就可以将之识别为一个代码块的开始，而不会重排它。 

  /*- 
    * Here is a block comment with some very special 
    * formatting that I want indent(1) to ignore. 
    * 
    *    one 
    *        two 
    *            three 
    */ 
  

注意：如果你不使用indent(1)，就不必在代码中使用/*-，或为他人可能对你的代码运行indent(1)作让步。 

参见"文档注释" 

5.1.2 单行注释(Single-Line Comments) 

短注释可以显示在一行内，并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完，就该采用块注释(参见"块注释")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子： 

  if (condition) { 

    /* Handle the condition. */ 
    ... 
  } 
  

5.1.3 尾端注释(Trailing Comments) 

极短的注释可以与它们所要描述的代码位于同一行，但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中，它们应该具有相同的缩进。 

以下是一个Java代码中尾端注释的例子： 

  if (a == 2) { 
      return TRUE;              /* special case */ 
  } else { 
      return isPrime(a);         /* works only for odd a */ 
  } 
  

5.1.4 行末注释(End-Of-Line Comments) 

注释界定符"//"，可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本；然而，它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子： 

  if (foo &gt; 1) { 

      // Do a double-flip. 
      ... 
  } 
  else { 
      return false;          // Explain why here. 
  } 

  //if (bar &gt; 1) { 
  // 
  //    // Do a triple-flip. 
  //    ... 
  //} 
  //else { 
  //    return false; 
  //} 
  

5.2 文档注释(Documentation Comments) 

注意：此处描述的注释格式之范例，参见"Java源文件范例" 

若想了解更多，参见"How to Write Doc Comments for Javadoc"，其中包含了有关文档注释标记的信息(@return, @param, @see)： 

http://java.sun.com/javadoc/writingdoccomments/index.html 

若想了解更多有关文档注释和javadoc的详细资料，参见javadoc的主页： 

http://java.sun.com/javadoc/index.html 

文档注释描述Java的类、接口、构造器，方法，以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中，一个注释对应一个类、接口或成员。该注释应位于声明之前： 

  /** 
    * The Example class provides ... 
    */ 
  public class Example { ... 
  

注意顶层(top-level)的类和接口是不缩进的，而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进；随后的文档注释每行都缩进1格(使星号纵向对齐)。成员，包括构造函数在内，其文档注释的第一行缩进4格，随后每行都缩进5格。 

若你想给出有关类、接口、变量或方法的信息，而这些信息又不适合写在文档中，则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如，有关一个类实现的细节，应放入紧跟在类声明后面的实现块注释中，而不是放在文档注释中。 

文档注释不能放在一个方法或构造器的定义块中，因为Java会将位于文档注释之后的第一个声明与其相关联。 

6 声明(Declarations) 

6.1 每行声明变量的数量(Number Per Line) 

推荐一行一个声明，因为这样以利于写注释。亦即， 

  int level;  // indentation level 
  int size;   // size of table 
  

要优于， 

int level, size; 

不要将不同类型变量的声明放在同一行，例如： 

  int foo,  fooarray[];   //WRONG! 
  

注意：上面的例子中，在类型和标识符之间放了一个空格，另一种被允许的替代方式是使用制表符： 

  int level;         // indentation level 
  int size;          // size of table 
  Object currentEntry;  // currently selected table entry 
  

6.2 初始化(Initialization) 

尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。 

6.3 布局(Placement) 

只在代码块的开始处声明变量。（一个块是指任何被包含在大括号"{"和"}"中间的代码。）不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂，同时会妨碍代码在该作用域内的可移植性。 

  void myMethod() { 
      int int1 = 0;         // beginning of method block 

      if (condition) { 
          int int2 = 0;     // beginning of "if" block 
          ... 
      } 
  } 
  

该规则的一个例外是for循环的索引变量 

  for (int i = 0; i &lt; maxLoops; i++) { ... } 
  

避免声明的局部变量覆盖上一级声明的变量。例如，不要在内部代码块中声明相同的变量名： 

  int count; 
  ... 
  myMethod() { 
      if (condition) { 
          int count = 0;     // AVOID! 
          ... 
      } 
      ... 
  } 
  

6.4 类和接口的声明(Class and Interface Declarations) 

当编写类和接口是，应该遵守以下格式规则： 

- 在方法名与其参数列表之前的左括号"("间不要有空格 
- 左大括号"{"位于声明语句同行的末尾 
- 右大括号"}"另起一行，与相应的声明语句对齐，除非是一个空语句，"}"应紧跟在"{"之后 

  class Sample extends Object { 
      int ivar1; 
      int ivar2; 

      Sample(int i, int j) { 
          ivar1 = i; 
          ivar2 = j; 
      } 

      int emptyMethod() {} 

      ... 
  } 
  
- 方法与方法之间以空行分隔 

7 语句(Statements) 

7.1 简单语句(Simple Statements) 

每行至多包含一条语句，例如： 

  argv++;       // Correct 
  argc--;       // Correct 
  argv++; argc--;       // AVOID! 
  

7.2 复合语句(Compound Statements) 

复合语句是包含在大括号中的语句序列，形如"{ 语句 }"。例如下面各段。 

- 被括其中的语句应该较之复合语句缩进一个层次 
- 左大括号"{"应位于复合语句起始行的行尾；右大括号"}"应另起一行并与复合语句首行对齐。 
- 大括号可以被用于所有语句，包括单个语句，只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。 

7.3 返回语句(return Statements) 

一个带返回值的return语句不使用小括号"()"，除非它们以某种方式使返回值更为显见。例如： 

  return; 

  return myDisk.size(); 

  return (size ? size : defaultSize); 
  

7.4 if，if-else，if else-if else语句(if, if-else, if else-if else Statements) 

if-else语句应该具有如下格式： 

  if (condition) { 
      statements; 
  } 

  if (condition) { 
      statements; 
  } else { 
      statements; 
  } 

  if (condition) { 
      statements; 
  } else if (condition) { 
      statements; 
  } else{ 
      statements; 
  } 
  

注意：if语句总是用"{"和"}"括起来，避免使用如下容易引起错误的格式： 

  if (condition) //AVOID! THIS OMITS THE BRACES {}! 
      statement; 
  

7.5 for语句(for Statements) 

一个for语句应该具有如下格式： 

  for (initialization; condition; update) { 
      statements; 
  } 
  

一个空的for语句(所有工作都在初始化，条件判断，更新子句中完成）应该具有如下格式： 

  for (initialization; condition; update); 
  

当在for语句的初始化或更新子句中使用逗号时，避免因使用三个以上变量，而导致复杂度提高。若需要，可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。 

7.6 while语句(while Statements) 

一个while语句应该具有如下格式 

  while (condition) { 
      statements; 
  } 
  

一个空的while语句应该具有如下格式： 

  while (condition); 
  

7.7 do-while语句(do-while Statements) 

一个do-while语句应该具有如下格式： 

  do { 
      statements; 
  } while (condition); 
  

7.8 switch语句(switch Statements) 

一个switch语句应该具有如下格式： 

  switch (condition) { 
  case ABC: 
      statements; 
      /* falls through */ 
  case DEF: 
      statements; 
      break; 

  case XYZ: 
      statements; 
      break; 

  default: 
      statements; 
      break; 
  } 
  

每当一个case顺着往下执行时(因为没有break语句)，通常应在break语句的位置添加注释。上面的示例代码中就包含注释/* falls through */。 

7.9 try-catch语句(try-catch Statements) 

一个try-catch语句应该具有如下格式： 

  try { 
      statements; 
  } catch (ExceptionClass e) { 
      statements; 
  } 
  

一个try-catch语句后面也可能跟着一个finally语句，不论try代码块是否顺利执行完，它都会被执行。 

  try { 
      statements; 
  } catch (ExceptionClass e) { 
      statements; 
  } finally { 
      statements; 
  } 
  

8 空白(White Space) 

8.1 空行(Blank Lines) 

空行将逻辑相关的代码段分隔开，以提高可读性。 

下列情况应该总是使用两个空行： 

- 一个源文件的两个片段(section)之间 
- 类声明和接口声明之间 

下列情况应该总是使用一个空行： 

- 两个方法之间 
- 方法内的局部变量和方法的第一条语句之间 
- 块注释（参见"5.1.1"）或单行注释（参见"5.1.2"）之前 
- 一个方法内的两个逻辑段之间，用以提高可读性 

8.2 空格(Blank Spaces) 

下列情况应该使用空格： 

- 一个紧跟着括号的关键字应该被空格分开，例如： 

  while (true) { 
      ... 
  } 
  
注意：空格不应该置于方法名与其左括号之间。这将有助于区分关键字和方法调用。 
- 空白应该位于参数列表中逗号的后面 
- 所有的二元运算符，除了"."，应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格，比如：负号("-")、自增("++")和自减("--")。例如： 
    a += c + d; 
    a = (a + b) / (c * d); 

    while (d++ = s++) { 
        n++; 
    } 
    printSize("size is " + foo + "\n"); 
  
- for语句中的表达式应该被空格分开，例如： 
    for (expr1; expr2; expr3) 
  
- 强制转型后应该跟一个空格，例如： 
    myMethod((byte) aNum, (Object) x); 
    myMethod((int) (cp + 5), ((int) (i + 3)) + 1); 
  

9 命名规范(Naming Conventions) 

命名规范使程序更易读，从而更易于理解。它们也可以提供一些有关标识符功能的信息，以助于理解代码，例如，不论它是一个常量，包，还是类。 

标识符类型 命名规则 例子 
包(Packages) 一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名，通常是com，edu，gov，mil，net，org，或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department)，项目(project)，机器(machine)，或注册名(login names)。 com.sun.eng 
com.apple.quicktime.v2 
edu.cmu.cs.bovik.cheese 
类(Classes) 命名规则：类名是个一名词，采用大小写混合的方式，每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词，避免缩写词(除非该缩写词被更广泛使用，像URL，HTML) class Raster; 
class ImageSprite; 
接口(Interfaces) 命名规则：大小写规则与类名相似 interface RasterDelegate; 
interface Storing; 
方法(Methods) 方法名是一个动词，采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。 run(); 
runFast(); 
getBackground(); 
变量(Variables) 除了变量名外，所有实例，包括类，类常量，均采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。变量名不应以下划线或美元符号开头，尽管这在语法上是允许的。 
变量名应简短且富于描述。变量名的选用应该易于记忆，即，能够指出其用途。尽量避免单个字符的变量名，除非是一次性的临时变量。临时变量通常被取名为i，j，k，m和n，它们一般用于整型；c，d，e，它们一般用于字符型。 char c; 
int i; 
float myWidth; 
实例变量(Instance Variables) 大小写规则和变量名相似，除了前面需要一个下划线 int _employeeId; 
String _name; 
Customer _customer; 
常量(Constants) 类常量和ANSI常量的声明，应该全部大写，单词间用下划线隔开。(尽量避免ANSI常量，容易引起错误) static final int MIN_WIDTH = 4; 
static final int MAX_WIDTH = 999; 
static final int GET_THE_CPU = 1; 

10 编程惯例(Programming Practices) 

10.1 提供对实例以及类变量的访问控制(Providing Access to Instance and Class Variables) 

若没有足够理由，不要把实例或类变量声明为公有。通常，实例变量无需显式的设置(set)和获取(gotten)，通常这作为方法调用的边缘效应 (side effect)而产生。 

一个具有公有实例变量的恰当例子，是类仅作为数据结构，没有行为。亦即，若你要使用一个结构(struct)而非一个类(如果java支持结构的话)，那么把类的实例变量声明为公有是合适的。 

10.2 引用类变量和类方法(Referring to Class Variables and Methods) 

避免用一个对象访问一个类的静态变量和方法。应该用类名替代。例如： 

  classMethod();             //OK 
  AClass.classMethod();      //OK 
  anObject.classMethod();    //AVOID! 
  

10.3 常量(Constants) 

位于for循环中作为计数器值的数字常量，除了-1,0和1之外，不应被直接写入代码。 

10.4 变量赋值(Variable Assignments) 

避免在一个语句中给多个变量赋相同的值。它很难读懂。例如： 

  fooBar.fChar = barFoo.lchar = 'c'; // AVOID! 
  

不要将赋值运算符用在容易与相等关系运算符混淆的地方。例如： 

  if (c++ = d++) {        // AVOID! (Java disallows) 
      ... 
  } 
  

应该写成 

  if ((c++ = d++) != 0) { 
    ... 
  } 
  

不要使用内嵌(embedded)赋值运算符试图提高运行时的效率，这是编译器的工作。例如： 

  d = (a = b + c) + r;        // AVOID! 
  

应该写成 

  a = b + c; 
  d = a + r; 
  

10.5 其它惯例(Miscellaneous Practices) 

10.5.1 圆括号(Parentheses) 

一般而言，在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题，是个好方法。即使运算符的优先级对你而言可能很清楚，但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。 

  if (a == b && c == d)     // AVOID! 
  if ((a == b) && (c == d))  // RIGHT 
  

10.5.2 返回值(Returning Values) 

设法让你的程序结构符合目的。例如： 

  if (booleanExpression) { 
      return true; 
  } else { 
      return false; 
  } 
  

应该代之以如下方法： 

  return booleanExpression; 
  

类似地： 

  if (condition) { 
      return x; 
  } 
  return y; 
  

应该写做： 

  return (condition ? x : y); 
  

10.5.3 条件运算符"?"前的表达式(Expressions before '?' in the Conditional Operator) 

如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前，那么应该给表达式添上一对圆括号。例如： 

  (x &gt;= 0) ? x : -x; 
  

10.5.4 特殊注释(Special Comments) 

在注释中使用XXX来标识某些未实现(bogus)的但可以工作(works)的内容。用FIXME来标识某些假的和错误的内容。 

11 代码范例(Code Examples) 

11.1 Java源文件范例(Java Source File Example) 

下面的例子，展示了如何合理布局一个包含单一公共类的Java源程序。接口的布局与其相似。更多信息参见"类和接口声明"以及"文挡注释"。 

/* 
* @(#)Blah.java        1.82 99/03/18 
* 
* Copyright (c) 1994-1999 Sun Microsystems, Inc. 
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. 
* All rights reserved. 
* 
* This software is the confidential and proprietary information of Sun 
* Microsystems, Inc. ("Confidential Information").  You shall not 
* disclose such Confidential Information and shall use it only in 
* accordance with the terms of the license agreement you entered into 
* with Sun. 
*/ 

package java.blah; 

import java.blah.blahdy.BlahBlah; 

/** 
* Class description goes here. 
* 
* @version 1.82 18 Mar 1999 
* @author Firstname Lastname 
*/ 
public class Blah extends SomeClass { 
    /* A class implementation comment can go here. */ 

    /** classVar1 documentation comment */ 
    public static int classVar1; 

    /** 
     * classVar2 documentation comment that happens to be 
     * more than one line long 
     */ 
    private static Object classVar2; 

    /** instanceVar1 documentation comment */ 
    public Object instanceVar1; 

    /** instanceVar2 documentation comment */ 
    protected int instanceVar2; 

    /** instanceVar3 documentation comment */ 
    private Object[] instanceVar3; 

    /** 
     * ...constructor Blah documentation comment... 
     */ 
    public Blah() { 
        // ...implementation goes here... 
    } 

    /** 
     * ...method doSomething documentation comment... 
     */ 
    public void doSomething() { 
        // ...implementation goes here... 
    } 

    /** 
     * ...method doSomethingElse documentation comment... 
     * @param someParam description 
     */ 
    public void doSomethingElse(Object someParam) { 
        // ...implementation goes here... 
    } 
} <a href="http://hi.baidu.com/lord%5Fwy/blog/item/9cb1071f56c0e0c1a6866977.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/J2ee">J2ee</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/9cb1071f56c0e0c1a6866977.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-01  13:47</pubDate>
        <category><![CDATA[J2ee]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/9cb1071f56c0e0c1a6866977.html</guid>
</item>

<item>
        <title><![CDATA[出卖你的16个小动作]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/952494fd140d021e08244d17.html]]></link>
        <description><![CDATA[
		
		1、边说边笑：这种人与你交谈时你会觉得非常轻松愉快。他们大都性格开朗，对生活[要求从不苛刻，很注意&ldquo;知足常乐&rdquo;，富有人情味。感情专一，对友情、亲情特别珍惜。人缘较好，喜爱平静的生活。 <br>
<br>
2、掰手指节：这种人习惯于把自己的手指掰得咯嗒咯嗒地响。他们通常精力旺盛，非常健谈，喜欢钻&ldquo;牛角尖&rdquo;。对事业、工作环境比较挑剔，如果是他喜欢干的事，他会不计任何代价而踏实努力地去干。 <br>
<br>
3、腿脚抖动：这类人总是喜欢用脚或脚尖使整个腿部抖动；最明显的表现是自私，很少考虑别人，凡事从利己出发，对别人很吝啬，对自己却很知足。但是很善于思考，能经常提出一些意想不到的问题。 <br>
<br>
4、 拍打头部：这个动作是表示懊悔和自我谴责。这种人对人苛刻，但对事业有一种开拓进取的精神。他们一般心直口快，为人真诚，富有同情心，愿意帮助他人，但守不住秘密。 <br>
<br>
5、摆弄饰物：这种人多为女性，一般都比较内向，不轻易使感情外露。她们的另一个特点是做事认真踏实，大凡有座谈会、晚会或舞会，人们都散了，但最后收拾打扫会场的总是她们。 <br>
<br>
6、 耸肩摊手：这种动作是表示自己无所谓。这类人大都为人热情，而且诚恳，富有想象力，会创造生活，也会享受生活，他们追求的最大幸福是生活在和睦、舒畅的环境中。 <br>
<br>
7、抹嘴捏鼻：习惯于抹嘴捏鼻的人，大都喜欢捉弄别人，却又不敢&ldquo;敢做敢当&rdquo;，爱好哗众取宠。这种人最终是被人支配的人，别人要他做什么，他就可能做什么，购物时常拿不定主意。 <br>
<br>
8、常常低头：慎重派。讨厌过分激烈、轻浮的事，孜孜勤劳，交朋友也很慎重。 <br>
<br>
9、托腮：服务精神旺盛，讨厌错误的事情，工作时对松懈型的合作对象会很反感。 <br>
<br>
10、两手腕交叉：对事情保持着独特的看法，常给人冷漠的感觉，属于易吃亏型的人，稍微有些自我主义。 <br>
<br>
11、摸弄头发：这是一个情绪化的，常常感到郁闷焦躁的人物。对流行很敏感，但忽冷忽热。 <br>
<br>
12 把手放在嘴上：属于敏感型，是秘密主义者，常常嘴上逞强，但内心却很温柔。 <br>
<br>
13、手握着手臂：保守派非理性的人，因为不太拒绝别人的要求，有遭致吃亏的可能。 <br>
<br>
14、靠着某样物体：冷酷的性格，有责任感和韧性，属独自奋斗型。 <br>
<br>
15、到处张望：具有社交性格的乐天派，有顺应性，对什么事都有兴趣，对人有明显的好恶感。 <br>
<br>
16、 摇头晃脑：这种人特别自信，以至于唯我独尊。他们在社交场合很会表现自己，对事业一往无前的精神常受人赞叹 <br>
<br> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/952494fd140d021e08244d17.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/952494fd140d021e08244d17.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-26  13:26</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/952494fd140d021e08244d17.html</guid>
</item>

<item>
        <title><![CDATA[Extjs图表问题]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/60404e81ebd265d0bd3e1e84.html]]></link>
        <description><![CDATA[
		
		<p>Extjs 解决icon 和文字重叠问题，加入如下css补丁</p>
<p><strong><font color="#ff0000">.ext-ie .x-menu-item-icon {left: -24px; top: 0px;}<br>
.ext-strict .x-menu-item-icon {left: 3px; top: 3px;}<br>
.ext-ie6 .x-menu-item-icon {left: -24px; top: 0px;}</font></strong></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/Javascript">Javascript</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/60404e81ebd265d0bd3e1e84.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-21  12:40</pubDate>
        <category><![CDATA[Javascript]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/60404e81ebd265d0bd3e1e84.html</guid>
</item>

<item>
        <title><![CDATA[showModelDialog传值]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/d3c1450924077dc73ac76326.html]]></link>
        <description><![CDATA[
		
		<p>被调用的画面，也就是showModelDialog出来的画面里，当需要往调用它的画面传值时，js这样：<br>
这个例子是返回两个值。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  function select(data1,data2){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  var str = new Array(2);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  str[0]=data1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  str[1]=data2;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  window.returnValue=str;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  window.close();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
调用的画面，这样调用画面：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  str=window.showModalDialog('被调用的画面地址');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(str!=undefined){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(str[0]!=&quot;SystemError&quot;){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  alert(str[0]);// 获得被调用画面传的值1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  alert(str[1]);// 获得被调用画面传的值2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
文章出处：DIY部落(<a href="http://www.diybl.com/course/1_web/ /jsjs/200863/121305.html">http://www.diybl.com/course/1_web/javascript/jsjs/200863/121305.html</a>)</p> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/d3c1450924077dc73ac76326.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/Javascript">Javascript</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/d3c1450924077dc73ac76326.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-05  14:46</pubDate>
        <category><![CDATA[Javascript]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/d3c1450924077dc73ac76326.html</guid>
</item>

<item>
        <title><![CDATA[javascript Element]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/079b214f5e32fb3eaec3abae.html]]></link>
        <description><![CDATA[
		
		<div class="cnt">1.document.formName.item(&quot;itemName&quot;) 问题<br>
<p><strong><br>
</strong>说明:IE下,可以使用document.formName.item(&quot;itemName&quot;)或 document.formName.elements[&quot;elementName&quot;];Firefox下,只能使用 document.formName.elements[&quot;elementName&quot;].<br>
解决方法:统一使用document.formName.elements[&quot;elementName&quot;].<br>
<br>
<strong>2.集合类对象问题</strong><br>
<br>
说明:IE下,可以使用()或[]获取集合类对象;Firefox下,只能使用[]获取集合类对象.<br>
解决方法:统一使用[]获取集合类对象.<br>
<br>
<strong>3.自定义属性问题</strong><br>
<br>
说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;Firefox下,只能使用getAttribute()获取自定义属性.<br>
解决方法:统一通过getAttribute()获取自定义属性.<br>
<br>
<strong>4.eval(&quot;idName&quot;)问题</strong><br>
<br>
说明:IE下,,可以使用eval(&quot;idName&quot;)或getElementById(&quot;idName&quot;)来取得id为idName的HTML对象;Firefox下只能使用getElementById(&quot;idName&quot;)来取得id为idName的HTML对象.<br>
解决方法:统一用getElementById(&quot;idName&quot;)来取得id为idName的HTML对象. <br>
<br>
<strong>5.变量名与某HTML对象ID相同的问题</strong><br>
<br>
说明:IE下,HTML对象的ID可以作为document的下属对象变量名直接使用;Firefox下则不能.Firefox下,可以使用与HTML对象ID相同的变量名;IE下则不能。<br>
解决方法:使用document.getElementById(&quot;idName&quot;)代替document.idName.最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var,以避免歧义.<br>
<br>
<strong>6.const问题</strong><br>
<br>
说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量.<br>
解决方法:统一使用var关键字来定义常量.<br>
<br>
<strong>7.input.type属性问题</strong><br>
<br>
说明:IE下input.type属性为只读;但是Firefox下input.type属性为读写.<br>
<br>
<strong>8.window.event问题</strong><br>
<br>
说明:window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.<br>
解决方法:<br>
IE:<br>
&lt;input name=&quot;Button8_1&quot; type=&quot;button&quot; value=&quot;IE&quot; onclick=&quot;javascript:gotoSubmit8_1()&quot;/&gt;<br>
...<br>
&lt;script language=&quot;javascript&quot;&gt;<br>
function gotoSubmit8_1() {<br>
...<br>
alert(window.event); //use window.event<br>
...<br>
}<br>
&lt;/script&gt;<br>
IE&amp;Firefox:<br>
&lt;input name=&quot;Button8_2&quot; type=&quot;button&quot; value=&quot;IE&quot; onclick=&quot;javascript:gotoSubmit8_2(event)&quot;/&gt;<br>
...<br>
&lt;script language=&quot;javascript&quot;&gt;<br>
function gotoSubmit8_2(evt) {<br>
...<br>
evt=evt?evt:(window.event?window.event:null);<br>
alert(evt); //use evt<br>
...<br>
}<br>
&lt;/script&gt;<br>
<br>
<strong>9.event.x与event.y问题</strong><br>
<br>
说明:IE下,even对象有x,y属性,但是没有pageX,pageY属性;Firefox下,even对象有pageX,pageY属性,但是没有x,y属性.<br>
解决方法:使用mX(mX = event.x ? event.x : event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX.<br>
<br>
<strong>10.event.srcElement问题</strong><br>
<br>
说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.<br>
解决方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)来代替IE下的event.srcElement或者Firefox下的event.target. <br>
<br>
<strong>11.window.location.href问题</strong><br>
<br>
说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.<br>
解决方法:使用window.location来代替window.location.href.<br>
<br>
<strong>12.模态和非模态窗口问题</strong><br>
<br>
说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能.<br>
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口。如果需要将子窗口中的参数传递回父窗口, 可以在子窗口中使用window.opener来访问父窗口. 例如：var parWin = window.opener; parWin.document.getElementById(&quot;Aqing&quot;).value = &quot;Aqing&quot;;<br>
<br>
<strong>13.frame问题</strong><br>
<br>
以下面的frame为例：<br>
&lt;frame src=&quot;xxx.html&quot; id=&quot;frameId&quot; name=&quot;frameName&quot; /&gt;<br>
<br>
(1)访问frame对象:<br>
IE:使用window.frameId或者window.frameName来访问这个frame对象.<br>
Firefox:只能使用window.frameName来访问这个frame对象.<br>
另外，在IE和Firefox中都可以使用window.document.getElementById(&quot;frameId&quot;)来访问这个frame对象.<br>
<br>
(2)切换frame内容:<br>
在IE和Firefox中都可以使用window.document.getElementById(&quot;testFrame&quot;).src = &quot;xxx.html&quot;或window.frameName.location = &quot;xxx.html&quot;来切换frame的内容.<br>
<br>
如果需要将frame中的参数传回父窗口，可以在frme中使用parent来访问父窗口。例如：parent.document.form1.filename.value=&quot;Aqing&quot;;<br>
<br>
<strong>14.body问题</strong><br>
<br>
Firefox的body在body标签没有被浏览器完全读入之前就存在；而IE的body则必须在body标签被浏览器完全读入之后才存在.<br>
<br>
例如：<br>
Firefox：<br>
&lt;body&gt;<br>
&lt;script type=&quot;text/javascript&quot;&gt;<br>
document.body.onclick = function(evt){<br>
evt = evt || window.event;<br>
alert(evt);<br>
}<br>
&lt;/script&gt;<br>
&lt;/body&gt;<br>
IE&amp;Firefox：<br>
&lt;body&gt;<br>
&lt;/body&gt;<br>
&lt;script type=&quot;text/javascript&quot;&gt;<br>
document.body.onclick= function(evt){<br>
evt = evt || window.event;<br>
alert(evt);<br>
} &lt;/script&gt;<br>
<br>
<strong>15. 事件委托方法</strong><br>
<br>
IE：document.body.onload = inject; //Function inject()在这之前已被实现<br>
Firefox：document.body.onload = inject();<br>
有人说标准是：<br>
document.body.onload=new Function('inject()');<br>
<br>
<strong>16. firefox与IE(parentElement)的父元素的区别</strong><br>
<br>
IE：obj.parentElement<br>
firefox：obj.parentNode<br>
解决方法: 因为firefox与IE都支持DOM,因此使用obj.parentNode是不错选择.<br>
<br>
<strong>17.cursor:hand VS cursor:pointer</strong><br>
<br>
firefox不支持hand，但ie支持pointer<br>
解决方法: 统一使用pointer<br>
<br>
<strong>18.innerText在IE中能正常工作，但是innerText在FireFox中却不行.</strong><br>
<br>
解决方法:<br>
if(navigator.appName.indexOf(&quot;Explorer&quot;) &gt; -1){<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  document.getElementById('element').innerText = &quot;my text&quot;;<br>
<br>
} else{<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  document.getElementById('element').textContent = &quot;my text&quot;;<br>
<br>
}<br>
<br>
<strong>19. FireFox中类似 obj.style.height = imgObj.height 的语句无效</strong><br>
<br>
解决方法：<br>
obj.style.height = imgObj.height + 'px';<br>
<br>
<strong>20. ie,firefox以及其它浏览器对于 table 标签的操作都各不相同，在ie中不允许对table和tr的innerHTML赋值，使用js增加一个tr时，使用appendChile方法也不管用。</strong><br>
<br>
解决方法：<br>
//向table追加一个空行：<br>
var row = otable.insertRow(-1);<br>
var cell = document.createElement(&quot;td&quot;);<br>
cell.innerHTML = &quot; &quot;;<br>
cell.className = &quot;XXXX&quot;;<br>
row.appendChild(cell);<br>
<br>
<strong>21. padding 问题</strong><br>
<br>
padding 5px 4px 3px 1px FireFox无法解释简写,必须改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;<br>
<br>
<strong>22. 消除ul、ol等列表的缩进时</strong><br>
<br>
样式应写成:list-style:none;margin:0px;padding:0px;<br>
其中margin属性对IE有效，padding属性对FireFox有效<br>
<br>
<strong>23. CSS透明</strong><br>
<br>
IE：filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。<br>
FF：opacity:0.6。<br>
<br>
<strong>24. CSS圆角</strong><br>
<br>
IE：不支持圆角。<br>
FF： -moz-border-radius:4px，或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border- radius- bottomright:4px;。<br>
<br>
<strong>25. CSS双线凹凸边框</strong><br>
<br>
IE：border:2px outset;。<br>
FF： -moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;</p>
<p> </p>
<p>以下以 IE 代替 Internet Explorer，以 MF或FF代替 Mozzila Firefox<br>
1：innerText<br>
IE支持，FIREFOX不支持<br>
解决办法：用innerHTML,2种浏览器都识别innerHTML</p>
<p>2：document.createElement<br>
document.appendChild<br>
在往表里插入行时<br>
FIREFOX支持，IE不支持<br>
解决办法：把行插入到TBODY中，不要直接插入到表</p>
<p>3：setAttribute('style','color:red;')<br>
FIREFOX支持(除了IE，现在所有浏览器都支持)，IE不支持<br>
解决办法：不用setAttribute('style','color:red')<br>
而用object.style.cssText = 'color:red;'(这写法也有例外)<br>
最好的办法是上面种方法都用上，万无一失 ^_^<br>
4:class<br>
setAttribute('class','styleClass')<br>
FIREFOX支持，IE不支持(指定属性名为CLASS，IE不会设置元素的CLASS属性，相反只使用SETATTRIBUTE时IE自动识别CLASSNAME属性)<br>
解决办法：<br>
setAttribute('class','styleClass')<br>
setAttribute('className','styleClass')<br>
2种都用上（注：IE和FF都支持object.className）</p>
<p>5:用setAttribute设置事件<br>
var obj = document.getElementById('objId');<br>
obj.setAttribute(onclick,'funcitonname();');<br>
FIREFOX支持，IE不支持<br>
解决办法：<br>
IE中必须用点记法来引用所需的事件处理程序,并且要用赋予匿名函数<br>
如下：<br>
var obj = document.getElementById('objId');<br>
obj.onclick=function(){fucntionname();};<br>
这种方法所有浏览器都支持</p>
<p>6：建立单选钮<br>
IE以外的浏览器<br>
var rdo = document.createElement('input');<br>
rdo.setAttribute('type','radio');<br>
rdo.setAttribute('name','radiobtn');<br>
rdo.setAttribute('value','checked');</p>
<p>IE:<br>
var rdo =document.createElement(&quot;&lt;input type='radio' name='radiobtn' value='checked'&gt;&quot;);<br>
解决办法：<br>
这一点区别和前面的都不一样。这次完全不同，所以找不到共同的办法来解决，那么只有IF-ELSE了<br>
万幸的是，IE可以识别出document的uniqueID属性，别的浏览器都不可以识别出这一属性。问题解决。</p>
<p>0：共同的一些技巧<br>
在动态建立INPUT型输入元素时，一般是先加入，在设置TYPE。这就有可能出错</p>
<p>好习惯：var btn = document.createElement('input');<br>
btn.setAttribut('type','button');<br>
document.getElementById('formId').appendChild(btn);</p>
<p>==================================================================================<br>
1. document.form.item 问题<br>
(1)现有问题：<br>
现有代码中存在许多 document.formName.item(&quot;itemName&quot;) 这样的语句，不能在 MF 下运行<br>
(2)解决方法：<br>
改用 document.formName.elements[&quot;elementName&quot;]<br>
(3)其它<br>
参见 2</p>
<p>2. 集合类对象问题<br>
(1)现有问题：<br>
现有代码中许多集合类对象取用时使用 ()，IE 能接受，MF 不能。<br>
(2)解决方法：<br>
改用 [] 作为下标运算。如：document.forms(&quot;formName&quot;) 改为 document.forms[&quot;formName&quot;]。<br>
又如：document.getElementsByName(&quot;inputName&quot;)(1) 改为 document.getElementsByName(&quot;inputName&quot;)[1]<br>
(3)其它</p>
<p>3. window.event<br>
(1)现有问题：<br>
使用 window.event 无法在 MF 上运行<br>
(2)解决方法：<br>
MF 的 event 只能在事件发生的现场使用，此问题暂无法解决。可以这样变通：<br>
原代码(可在IE中运行)：<br>
&lt;input type=&quot;button&quot; name=&quot;someButton&quot; value=&quot;提交&quot; onclick=&quot;java script:gotoSubmit()&quot;/&gt;<br>
...<br>
&lt;script language=&quot;javascript&quot;&gt;<br>
function gotoSubmit() {<br>
...<br>
alert(window.event); // use window.event<br>
...<br>
}<br>
&lt;/script&gt;</p>
<p>新代码(可在IE和MF中运行)：<br>
&lt;input type=&quot;button&quot; name=&quot;someButton&quot; value=&quot;提交&quot; onclick=&quot;java script:gotoSubmit(event)&quot;/&gt;<br>
...<br>
&lt;script language=&quot;javascript&quot;&gt;<br>
function gotoSubmit(evt) {<br>
evt = evt ? evt : (window.event ? window.event : null);<br>
...<br>
alert(evt); // use evt<br>
...<br>
}<br>
&lt;/script&gt;<br>
此外，如果新代码中第一行不改，与老代码一样的话(即 gotoSubmit 调用没有给参数)，则仍然只能在IE中运行，但不会出错。所以，这种方案 tpl 部分仍与老代码兼容。</p>
<p>4. HTML 对象的 id 作为对象名的问题<br>
(1)现有问题<br>
在 IE 中，HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。<br>
(2)解决方法<br>
用 getElementById(&quot;idName&quot;) 代替 idName 作为对象变量使用。</p>
<p>5. 用idName字符串取得对象的问题<br>
(1)现有问题<br>
在IE中，利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象，在MF 中不能。<br>
(2)解决方法<br>
用 getElementById(idName) 代替 eval(idName)。</p>
<p>6. 变量名与某 HTML 对象 id 相同的问题<br>
(1)现有问题<br>
在 MF 中，因为对象 id 不作为 HTML 对象的名称，所以可以使用与 HTML 对象 id 相同的变量名，IE 中不能。<br>
(2)解决方法<br>
在声明变量时，一律加上 var ，以避免歧义，这样在 IE 中亦可正常运行。<br>
此外，最好不要取与 HTML 对象 id 相同的变量名，以减少错误。<br>
(3)其它<br>
参见 问题4</p>
<p>7. event.x 与 event.y 问题<br>
(1)现有问题<br>
在IE 中，event 对象有 x, y 属性，MF中没有。<br>
(2)解决方法<br>
在MF中，与event.x 等效的是 event.pageX。但event.pageX IE中没有。<br>
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。<br>
event.clientX 与 event.pageX 有微妙的差别（当整个页面有滚动条的时候），不过大多数时候是等效的。</p>
<p>如果要完全一样，可以稍麻烦些：<br>
mX = event.x ? event.x : event.pageX;<br>
然后用 mX 代替 event.x<br>
(3)其它<br>
event.layerX 在 IE 与 MF 中都有，具体意义有无差别尚未试验。</p>
<p>8. 关于frame<br>
(1)现有问题<br>
在 IE中 可以用window.testFrame取得该frame，mf中不行<br>
(2)解决方法<br>
在frame的使用方面mf和ie的最主要的区别是：<br>
如果在frame标签中书写了以下属性：<br>
&lt;frame src=&quot;xx.htm&quot; id=&quot;frameId&quot; name=&quot;frameName&quot; /&gt;<br>
那么ie可以通过id或者name访问这个frame对应的window对象<br>
而mf只可以通过name来访问这个frame对应的window对象<br>
例如如果上述frame标签写在最上层的window里面的htm里面，那么可以这样访问<br>
ie： window.top.frameId或者window.top.frameName来访问这个window对象<br>
mf： 只能这样window.top.frameName来访问这个window对象</p>
<p>另外，在mf和ie中都可以使用window.top.document.getElementById(&quot;frameId&quot;)来访问frame标签<br>
并且可以通过window.top.document.getElementById(&quot;testFrame&quot;).src = 'xx.htm'来切换frame的内容<br>
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容<br>
关于frame和window的描述可以参见bbs的&lsquo;window与frame&rsquo;文章<br>
以及/test/js/test_frame/目录下面的测试</p>
<p>9. 在mf中，自己定义的属性必须getAttribute()取得<br>
10.在mf中没有 parentElement parement.children 而用<br>
parentNode parentNode.childNodes<br>
childNodes的下标的含义在IE和MF中不同，MF使用DOM规范，childNodes中会插入空白文本节点。<br>
一般可以通过node.getElementsByTagName()来回避这个问题。<br>
当html中节点缺失时，IE和MF对parentNode的解释不同，例如<br>
&lt;form&gt;<br>
&lt;table&gt;<br>
&lt;input/&gt;<br>
&lt;/table&gt;<br>
&lt;/form&gt;<br>
MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点</p>
<p>MF中节点没有removeNode方法，必须使用如下方法 node.parentNode.removeChild(node)</p>
<p>11.const 问题<br>
(1)现有问题:<br>
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。<br>
(2)解决方法:<br>
不使用 const ，以 var 代替。</p>
<p>12. body 对象<br>
MF的body在body标签没有被浏览器完全读入之前就存在，而IE则必须在body完全被读入之后才存在</p>
<p>13. url encoding<br>
在js中如果书写url就直接写&amp;不要写&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';<br>
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器<br>
一般会服务器报错参数没有找到<br>
当然如果是在tpl中例外，因为tpl中符合xml规范，要求&amp;书写为&amp;<br>
一般MF无法识别js中的</p>
<p>14. nodeName 和 tagName 问题<br>
(1)现有问题：<br>
在MF中，所有节点均有 nodeName 值，但 textNode 没有 tagName 值。在 IE 中，nodeName 的使用好象<br>
有问题（具体情况没有测试，但我的IE已经死了好几次）。<br>
(2)解决方法：<br>
使用 tagName，但应检测其是否为空。</p>
<p>15. 元素属性<br>
IE下 input.type属性为只读，但是MF下可以修改</p>
<p>16. document.getElementsByName() 和 document.all[name] 的问题<br>
(1)现有问题：<br>
在 IE 中，getElementsByName()、document.all[name] 均不能用来取得 div 元素（是否还有其它不能取的元素还不知道）。</p>
<p>======================================================================================================<br>
1. 向表中追加行<br>
这是IE和Firefox,Safari,Opera都支持的代码<br>
var cell = documentcreateElement(&quot;td&quot;).appendChild(document.createTextNode(&quot;foo&quot;)); <br>
var row = document.createElement(&quot;tr&quot;).appendChild(cell); <br>
document.getElementById(&quot;MyTableBoyd&quot;).appendChild(row); <br>
或者：在TR的父节点添加TBODY。（注：在IE中，利用DOM动态添加表格的行时，在TR的上一层必须添加TBODY，否则动态添加之后无法显示出来）</p>
<p>2. 通过JAVASCRIPT设置元素的样式<br>
var spanElement = document.getElementById(&quot;myspan&quot;); <br>
//spanElement.setAttribute(&quot;style&quot;,&quot;font-weight:bold;color:red&quot;); //IE之外的浏览器<br>
spanElement.style.cssText=&quot;font-weight:bold;color:red&quot;; //IE的方法cssText不是标准属性,但得到IE支持</p>
<p>3. IE和FF在添加Option兼容操作，这里直接贴出本人的代码（注：FF支持直接将Option列表以innerHTML形式嵌入到select节点，但IE不支持）<br>
function removeAllOptions(select_id){<br>
&nbsp;&nbsp;&nbsp;  var com=document.getElementById(select_id);<br>
&nbsp;&nbsp;&nbsp;  var len=com.options.length;<br>
&nbsp;&nbsp;&nbsp;  for(var i=0;i&lt;len;i++){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  com.remove(0);<br>
&nbsp;&nbsp;&nbsp;  }<br>
}<br>
function addOption(e_select,value,text){<br>
&nbsp;&nbsp;  var oOption = document.createElement(&quot;option&quot;);<br>
&nbsp;&nbsp;  e_select.options.add(oOption);<br>
&nbsp;&nbsp;  if(text!=null){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  var text_node=document.createTextNode(text);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  oOption.appendChild(text_node);<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  if(value!=null){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  oOption.value = value;<br>
&nbsp;&nbsp;  }<br>
}</p>
<p>4. 创建输入元素(通用代码)<br>
var button = document.createElement(&quot;input&quot;); <br>
button.setAttribute(&quot;type&quot;,&quot;button&quot;); <br>
document.getElementById(&quot;form&quot;).appendChild(button);</p>
<p>5. 向输入元素增加事件处理程序(通用代码)<br>
var element = document.getElementById(&quot;ee&quot;); <br>
element.onclick=function(){todo();};</p>
<p>6. 创建单选按钮<br>
var ration = document.createElement(&quot;&lt;input type='radio' name='radionsss' value='checked'&gt;&rdquo;);//ie <br>
//非ie创建方法<br>
vat radion = document.createElement(&quot;input&quot;); <br>
radion .setAttribute(&quot;type&quot;,&quot;radio&quot;); <br>
radion.setAttribute(&quot;name&quot;,&quot;radionsss&quot;); <br>
radion.setAttribute(&quot;value&quot;,&quot;checked&quot;);</p>
</div> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/079b214f5e32fb3eaec3abae.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/J2ee">J2ee</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/079b214f5e32fb3eaec3abae.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-05  10:55</pubDate>
        <category><![CDATA[J2ee]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/079b214f5e32fb3eaec3abae.html</guid>
</item>

<item>
        <title><![CDATA[JDBC连接DB2、Oracle、MySQL、PostgreSQL，并取当前时间]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/fd25a3cb108b5bfa53664f33.html]]></link>
        <description><![CDATA[
		
		<span > 
<p>package com.terac.util;</p>
<p>import java.sql.Connection;<br>
import java.sql.DriverManager;<br>
import java.sql.ResultSet;<br>
import java.sql.Statement;</p>
<p>public class DBTest {<br>
public static void main(String[] args) {<br>
try {<br>
String user = &quot;user&quot;;<br>
String password = &quot;password&quot;;<br>
String driver = &quot;COM.ibm.db2.jdbc.net.DB2Driver&quot;;<br>
//&quot;oracle.jdbc.driver.OracleDriver&quot;;<br>
//&quot;com.mysql.jdbc.Driver&quot;;<br>
//&quot;org.postgresql.Driver&quot;;<br>
String url = &quot;jdbc:db2://localhost/a&quot;;<br>
//&quot;jdbc:oracle:thin:@localhost:1521:a&quot;;<br>
//&quot;jdbc:mysql://localhost/a&quot;;<br>
//&quot;jdbc:postgresql://localhost:5740/a&quot;;<br>
String sql = &quot;SELECT current timestamp FROM sysibm.sysdummy1&quot;;<br>
//&quot;SELECT sysdate FROM dual&quot;;<br>
//&quot;SELECT now()&quot;;<br>
//&quot;SELECT current_timestamp&quot;;<br>
Class.forName(driver).newInstance();<br>
Connection c = DriverManager.getConnection(url, user, password);<br>
Statement stmt = c.createStatement();<br>
ResultSet rs = stmt.executeQuery(sql);<br>
while (rs.next()) {<br>
System.out.println(rs.getString(1));<br>
}<br>
} catch (Exception e) {<br>
e.printStackTrace();<br>
}<br>
}<br>
}</p>
</span> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/fd25a3cb108b5bfa53664f33.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/J2ee">J2ee</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/fd25a3cb108b5bfa53664f33.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-19  15:13</pubDate>
        <category><![CDATA[J2ee]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/fd25a3cb108b5bfa53664f33.html</guid>
</item>

<item>
        <title><![CDATA[岸部真明翻弹youtube参考视频]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/8c5b64239c2173549922edb9.html]]></link>
        <description><![CDATA[
		
		<p><strong>流れ行く雲</strong></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/PaGchMwf5eQ" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><br>
<strong>樹氷の輝き</strong></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/6JscrafE0O4" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p> </p>
<p> </p> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/8c5b64239c2173549922edb9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/%C4%BE%BC%AA%CB%FB">木吉他</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/8c5b64239c2173549922edb9.html#comment">查看评论</a>]]></description>
        <pubDate>2008-10-16  22:44</pubDate>
        <category><![CDATA[木吉他]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/8c5b64239c2173549922edb9.html</guid>
</item>

<item>
        <title><![CDATA[oshio kotaro 押尾光太郎新视频]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/daf669364ef9fedba2cc2b39.html]]></link>
        <description><![CDATA[
		
		<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/99DMnq3MaZ4" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/DNPoxrGZnvQ" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/UGeY4I_0iD4" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/iqWvMdZBZd8" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/daf669364ef9fedba2cc2b39.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/daf669364ef9fedba2cc2b39.html#comment">查看评论</a>]]></description>
        <pubDate>2008-10-07  20:26</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/daf669364ef9fedba2cc2b39.html</guid>
</item>

<item>
        <title><![CDATA[Justin King]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/da3985ef37564d10fcfa3c30.html]]></link>
        <description><![CDATA[
		
		<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/N6NA9nd4Fgs" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/k-pk4osQ5to" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/aOdcqUTju5k" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p><embed style="width: 450px; height: 390px" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/yh_24DXNy8E" width="450" height="390" type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false" menu="false"></embed></p>
<p> </p> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/da3985ef37564d10fcfa3c30.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/%C4%BE%BC%AA%CB%FB">木吉他</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/da3985ef37564d10fcfa3c30.html#comment">查看评论</a>]]></description>
        <pubDate>2008-10-07  20:10</pubDate>
        <category><![CDATA[木吉他]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/da3985ef37564d10fcfa3c30.html</guid>
</item>

<item>
        <title><![CDATA[对日软件外包项目问题探讨]]></title>
        <link><![CDATA[http://hi.baidu.com/lord%5Fwy/blog/item/d71376e70b4baf2ab83820fa.html]]></link>
        <description><![CDATA[
		
		<font style="font-size: 12px;">软件外包已经成为全球IT行业的大趋势，当前软件发包方主要来自欧美和<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%C8%D5%B1%BE">日本</span>。对日软件外包相对技术难度不高，但是质量要求相当苛刻。 <br>
<br>
  &nbsp;&nbsp;  &nbsp;&nbsp;   软件外包已经成为全球IT行业的大趋势，当前软件发包方主要来自欧美和日本。我国对日软件外包具备很多竞争优势，中国各地如北京、上海、<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%B4%F3%C1%AC">大连</span>、西安、杭州、合肥等城市的对日软件外包正在迅速发展，并逐渐形成产业规模，中小规模的软件企业纷纷建立对日软件出口联盟。   <br>
<br>
  &nbsp;&nbsp;  &nbsp;&nbsp;    对日软件外包相对技术难度不高，但是质量要求相当苛刻，外包项目失败的例子不少。以下就对日软件外包常见的一些问题进行简单探讨，希望与同行的朋友更多交流，总结经验，共同成功。   <br>
<br>
1、日方SE认为理所当然的地方，很多细节不会在式样书中明确写出，或者说日方SE完全按照在日本国做项目设计的习惯写式样书；由于中日<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%CE%C4%BB%AF">文化</span>和思维习惯的差异，可能导致中国软件开发人员对这些习惯问题理解有误。 <br>
<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%B6%D4%B2%DF">对策</span>： <br>
1）积累经验，参照同类系统； <br>
2）提QA表确认。   <br>
<br>
2、在纳品期间，对于某些BUG，可能会出现这样的争执：中方开发人员说是由于日方的式样书没有写明确，式样书不够细致，日方设计人员说是中方理解式样书不对，有些地方不写出来也应该能自己理解。 <br>
对策： <br>
1）首先确保纳品质量和纳期； <br>
2）加强双方的交流； <br>
3）加强测试。   <br>
<br>
3、有的项目是日方边设计，需要中方同步开发，中方开发人员认为式样书上写多少就做多少，没有写的就不做。 <br>
对策： <br>
1）加强项目的交流，主动提出设计思考让日方人员确认是不是这样的<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%D2%E2%CB%BC">意思</span>？   <br>
<br>
4、中方开发人员的<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%C8%D5%D3%EF">日语</span>熟练程度不够 <br>
对策： <br>
1）加强IT日语教育，开发人员至少达到能理解日语式样书的水平； <br>
2）配置专业的日语翻译辅助。   <br>
<br>
5、对于一些中方开发人员不太在意的一些细节问题，例如字体、颜色、对齐方式等等，要求不够严谨。 <br>
对策：强化质量意识，建立开发和测试规范。   <br>
<br>
6、开发过程的规范性与开发人员的态度：日本企业的开发管理，讲究中规中矩，非常重视文档的规范化管理，力求做到&quot;凡事必求有据&quot;；而中国企业在文档的规 范化管理方面相对淡薄；日本企业项目管理对涉及的过程和文档规定了极其严格的次序和样式，要求开发人员严格执行。而中国企业在具体执行方面，开发人员往往 对这些规范和要求的遵照不够严谨。 <br>
对策： <br>
1）完全按照<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%BF%CD%BB%A7">客户</span>要求进行纳品，包括文档，如：开发进度报告、测试用例（Test&nbsp;&nbsp; Case）、测试报告等等； <br>
2）加强开发过程管理，规范开发过程，引入CMM模式； <br>
3）加强软件质量保证，如代码评审、文档审核、测试。 <br>
&nbsp;&nbsp;<br>
7、中国企业的开发人员比较喜欢技术创新，在开发过程中对于一些技术问题提出自己的技术方案，可能会导致部分模块技术实现方式与整体要求有差异 <br>
对策： <br>
1）完全尊重日本客户的文化和管理模式，积极提出技术建议； <br>
2）对于有要求遵照Sample代码或对具体技术实现细节有严格要求的，开发人员必须严格遵循，不允许采用自己的技术实现； <br>
3）加强代码审查（Code&nbsp;&nbsp; Review）。   <br>
<br>
8、一些需要日本企业与中国企业的SE共同参与设计或交流的项目 <br>
对策： <br>
1）在日本的合作伙伴企业派遣SE到项目现场进行设计； <br>
2）派遣中国SE到日本参与设计，设计完成后带回中国开发； <br>
3）日本企业短期派遣SE到中国。   <br>
<br>
9、软件外包知识产权保护与客户保密问题 <br>
对策： <br>
1）严格保护日本客户商业秘密和知识产权； <br>
2）中国企业与日本企业签订保密协议； <br>
3）中国企业与开发人员签订保密协议。   <br>
<br>
10、日本企业对中国企业开发进度的掌握 <br>
对策： <br>
1）按照日本企业项目管理要求报告项目进度； <br>
2）分阶段纳品交付；   <br>
<br>
11、远程协同合作开发的交流手段和方式 <br>
对策： <br>
1）实时消息/语音/视频交流，例如：MSN&nbsp;&nbsp; Messenger、Yahoo&nbsp;&nbsp; Messenger <br>
2）<span class="t_tag" href="http://www.hahajp.com/bbs/tag.php?name=%CA%D3%C6%B5">视频</span>会议系统 <br>
3）远程控制、远程协助、远程调试 <br>
4）Email、FTP <br>
5）相互人才派遣，人才交流   <br>
<br>
12、中国企业开发队伍的稳定性   <br>
对策：稳定项目流量，为特定客户配置固定的开发队伍&nbsp;&nbsp;  <br>
</font> <a href="http://hi.baidu.com/lord%5Fwy/blog/item/d71376e70b4baf2ab83820fa.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lord%5Fwy/blog/category/%C8%ED%BC%FE%B9%AB%CB%BE%CA%C2%CE%F1%BC%B0%CF%EE%C4%BF%B9%DC%C0%ED">软件公司事务及项目管理</a>&nbsp;<a href="http://hi.baidu.com/lord%5Fwy/blog/item/d71376e70b4baf2ab83820fa.html#comment">查看评论</a>]]></description>
        <pubDate>2008-02-13  14:11</pubDate>
        <category><![CDATA[软件公司事务及项目管理]]></category>
        <author><![CDATA[lord_wy]]></author>
		<guid>http://hi.baidu.com/lord%5Fwy/blog/item/d71376e70b4baf2ab83820fa.html</guid>
</item>


</channel>
</rss>