kooyee ‘s blog

          開源軟件, 眾人努力的結晶, 全人類的共同財富
          posts - 103, comments - 55, trackbacks - 0, articles - 66
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JAVA基礎知識: Java語言編碼規范(2)

          Posted on 2007-07-14 05:06 kooyee 閱讀(131) 評論(0)  編輯  收藏 所屬分類: Java

           
          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 < 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
           
          }
           

          注意:空格不應該置于方法名與其左括號之間。這將有助于區分關鍵字和方法調用。
          - 空白應該位于參數列表中逗號的后面
          - 所有的二元運算符,除了".",應該使用空格將之與操作數分開。一元操作符和操作數之間不因該加空格,比如:負號("-")、自增("++")和自減("--")。例如:

          += c + d; 
          = (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.engcom.apple.quicktime.v2edu.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)賦值運算符試圖提高運行時的效率,這是編譯器的工作。例如:

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

          應該寫成 
          = b + c; 
          = 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 >= 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 
          }
           
          }
           
          主站蜘蛛池模板: 潜山县| 新津县| 黔南| 蛟河市| 黄冈市| 云林县| 巴中市| 乌苏市| 永修县| 阳江市| 壶关县| 普陀区| 龙口市| 抚州市| 梁河县| 呈贡县| 苍溪县| 茶陵县| 唐河县| 砀山县| 托克托县| 二手房| 井研县| 福州市| 乡宁县| 新龙县| 如东县| 西藏| 英吉沙县| 武川县| 合肥市| 开远市| 安吉县| 蓬溪县| 鄯善县| 瑞安市| 兴国县| 厦门市| 武平县| 鄢陵县| 巨野县|