kooyee ‘s blog

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

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

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

           
          6.3 布局(Placement)

          只在代碼塊的開始處聲明變量。(一個塊是指任何被包含在大括號"{"和"}"中間的代碼。)不要在首次用到該變量時才聲明之。這會把注意力不集中的程序員搞糊涂,同時會妨礙代碼在該作用域內(nèi)的可移植性。


           

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

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


          該規(guī)則的一個例外是for循環(huán)的索引變量


           

          for (int i = 0; i < maxLoops; i++ }

           


          避免聲明的局部變量覆蓋上一級聲明的變量。例如,不要在內(nèi)部代碼塊中聲明相同的變量名:


           

          int count; 
           
          myMethod() 

          if (condition) 
          int count = 0// AVOID! 
           
          }
           
           
          }
           


          6.4 類和接口的聲明(Class and Interface Declarations)

          當(dāng)編寫類和接口是,應(yīng)該遵守以下格式規(guī)則:

          - 在方法名與其參數(shù)列表之前的左括號"("間不要有空格
          - 左大括號"{"位于聲明語句同行的末尾
          - 右大括號"}"另起一行,與相應(yīng)的聲明語句對齊,除非是一個空語句,"}"應(yīng)緊跟在"{"之后

           

          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 復(fù)合語句(Compound Statements)

          復(fù)合語句是包含在大括號中的語句序列,形如"{ 語句 }"。例如下面各段。

          - 被括其中的語句應(yīng)該較之復(fù)合語句縮進(jìn)一個層次
          - 左大括號"{"應(yīng)位于復(fù)合語句起始行的行尾;右大括號"}"應(yīng)另起一行并與復(fù)合語句首行對齊。
          - 大括號可以被用于所有語句,包括單個語句,只要這些語句是諸如if-else或for控制結(jié)構(gòu)的一部分。這樣便于添加語句而無需擔(dān)心由于忘了加括號而引入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語句應(yīng)該具有如下格式:


           

          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語句應(yīng)該具有如下格式:


           

          for (initialization; condition; update) 
          statements; 
          }
           


          一個空的for語句(所有工作都在初始化,條件判斷,更新子句中完成)應(yīng)該具有如下格式:


           

          for (initialization; condition; update);

           


          當(dāng)在for語句的初始化或更新子句中使用逗號時,避免因使用三個以上變量,而導(dǎo)致復(fù)雜度提高。若需要,可以在for循環(huán)之前(為初始化子句)或for循環(huán)末尾(為更新子句)使用單獨的語句。


          7.6 while語句(while Statements)

          一個while語句應(yīng)該具有如下格式


           

          while (condition) 
          statements; 
          }
           


          一個空的while語句應(yīng)該具有如下格式:


           

          while (condition); 

           



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

          一個do-while語句應(yīng)該具有如下格式:


           

          do 
          statements; 
          }
           while (condition); 



          7.8 switch語句(switch Statements)

          一個switch語句應(yīng)該具有如下格式:


           

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

          case XYZ: 
          statements; 
          break

          default
          statements; 
          break
          }
           


          每當(dāng)一個case順著往下執(zhí)行時(因為沒有break語句),通常應(yīng)在break語句的位置添加注釋。上面的示例代碼中就包含注釋/* falls through */。


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

          一個try-catch語句應(yīng)該具有如下格式:


           

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

           


          一個try-catch語句后面也可能跟著一個finally語句,不論try代碼塊是否順利執(zhí)行完,它都會被執(zhí)行。


           

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



          8 空白(White Space)


          8.1 空行(Blank Lines)

          空行將邏輯相關(guān)的代碼段分隔開,以提高可讀性。
          下列情況應(yīng)該總是使用兩個空行:
          - 一個源文件的兩個片段(section)之間
          - 類聲明和接口聲明之間
          下列情況應(yīng)該總是使用一個空行:
          - 兩個方法之間
          - 方法內(nèi)的局部變量和方法的第一條語句之間
          - 塊注釋(參見"5.1.1")或單行注釋(參見"5.1.2")之前
          - 一個方法內(nèi)的兩個邏輯段之間,用以提高可讀性


          8.2 空格(Blank Spaces)

          下列情況應(yīng)該使用空格:
          - 一個緊跟著括號的關(guān)鍵字應(yīng)該被空格分開,例如:

          while (true
           
          }
           

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

          += c + d; 
          = (a + b) / (c * d); 

          while (d++ = s++
          n
          ++
          }
           
          printSize(
          "size is " + foo + "\n"); 

           

          - for語句中的表達(dá)式應(yīng)該被空格分開,例如:

          for (expr1; expr2; expr3) 

           

          - 強制轉(zhuǎn)型后應(yīng)該跟一個空格,例如:

          myMethod((byte) aNum, (Object) x); 
          myMethod((
          int) (cp + 5), ((int) (i + 3)) + 1);

           

          9 命名規(guī)范(Naming Conventions)


          命名規(guī)范使程序更易讀,從而更易于理解。它們也可以提供一些有關(guān)標(biāo)識符功能的信息,以助于理解代碼,例如,不論它是一個常量,包,還是類。 

           
          包(Packages) 一個唯一包名的前綴總是全部小寫的ASCII字母并且是一個頂級域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166標(biāo)準(zhǔn)所指定的標(biāo)識國家的英文雙字符代碼。包名的后續(xù)部分根據(jù)不同機構(gòu)各自內(nèi)部的命名規(guī)范而不盡相同。這類命名規(guī)范可能以特定目錄名的組成來區(qū)分部門(department),項目(project),機器(machine),或注冊名(login names)。

          com.sun.engcom.apple.quicktime.v2edu.cmu.cs.bovik.cheese

           

          (Classes) 命名規(guī)則:類名是個一名詞,采用大小寫混合的方式,每個單詞的首字母大寫。盡量使你的類名簡潔而富于描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用,像URL,HTML) class Raster;class ImageSprite;

          接口(Interfaces) 命名規(guī)則:大小寫規(guī)則與類名相似 interface RasterDelegate;interface Storing;

          方法(Methods) 方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。 run();runFast();getBackground();

          變量(Variables) 除了變量名外,所有實例,包括類,類常量,均采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。變量名不應(yīng)以下劃線或美元符號開頭,盡管這在語法上是允許的。變量名應(yīng)簡短且富于描述。變量名的選用應(yīng)該易于記憶,即,能夠指出其用途。盡量避免單個字符的變量名,除非是一次性的臨時變量。臨時變量通常被取名為i,j,k,m和n,它們一般用于整型;c,d,e,它們一般用于字符型。 char c;int i;float myWidth;

          實例變量(Instance Variables) 大小寫規(guī)則和變量名相似,除了前面需要一個下劃線 int _employeeId;String _name;Customer _customer;

          常量(Constants) 類常量和ANSI常量的聲明,應(yīng)該全部大寫,單詞間用下劃線隔開。(盡量避免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)

          若沒有足夠理由,不要把實例或類變量聲明為公有。通常,實例變量無需顯式的設(shè)置(set)和獲取(gotten),通常這作為方法調(diào)用的邊緣效應(yīng) (side effect)而產(chǎn)生。
          一個具有公有實例變量的恰當(dāng)例子,是類僅作為數(shù)據(jù)結(jié)構(gòu),沒有行為。亦即,若你要使用一個結(jié)構(gòu)(struct)而非一個類(如果java支持結(jié)構(gòu)的話),那么把類的實例變量聲明為公有是合適的。
           
          10.2 引用類變量和類方法(Referring to Class Variables and Methods)

          避免用一個對象訪問一個類的靜態(tài)變量和方法。應(yīng)該用類名替代。例如:

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

           

          10.3 常量(Constants)

          位于for循環(huán)中作為計數(shù)器值的數(shù)字常量,除了-1,0和1之外,不應(yīng)被直接寫入代碼。
           
          10.4 變量賦值(Variable Assignments)
          避免在一個語句中給多個變量賦相同的值。它很難讀懂。例如:

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

           

          不要將賦值運算符用在容易與相等關(guān)系運算符混淆的地方。例如:

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

           

          應(yīng)該寫成

          if ((c++ = d++!= 0
           
          }

           

          不要使用內(nèi)嵌(embedded)賦值運算符試圖提高運行時的效率,這是編譯器的工作。例如:

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

          應(yīng)該寫成 
          = b + c; 
          = a + r; 

           

          10.5 其它慣例(Miscellaneous Practices)

          10.5.1 圓括號(Parentheses)
          一般而言,在含有多種運算符的表達(dá)式中使用圓括號來避免運算符優(yōu)先級問題,是個好方法。即使運算符的優(yōu)先級對你而言可能很清楚,但對其他人未必如此。你不能假設(shè)別的程序員和你一樣清楚運算符的優(yōu)先級。

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

           

          10.5.2 返回值(Returning Values)
          設(shè)法讓你的程序結(jié)構(gòu)符合目的。例如:

          if (booleanExpression) 
          return true
          }
           else 
          return false
          }
           

          應(yīng)該代之以如下方法: 
          return booleanExpression; 

          類似地: 
          if (condition) 
          return x; 
          }
           
          return y; 

          應(yīng)該寫做: 
          return (condition ? x : y); 


          10.5.3 條件運算符"?"前的表達(dá)式(Expressions before ´?´ in the Conditional Operator)

          如果一個包含二元運算符的表達(dá)式出現(xiàn)在三元運算符" ? : "的"?"之前,那么應(yīng)該給表達(dá)式添上一對圓括號。例如:

          (x >= 0? x : -x;

           

          10.5.4 特殊注釋(Special Comments)

          在注釋中使用XXX來標(biāo)識某些未實現(xiàn)(bogus)的但可以工作(works)的內(nèi)容。用FIXME來標(biāo)識某些假的和錯誤的內(nèi)容。


          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 
          }
           
          }
           
          主站蜘蛛池模板: 肇源县| 康乐县| 商洛市| 皮山县| 城固县| 黄浦区| 江油市| 抚宁县| 阜阳市| 白河县| 千阳县| 梅河口市| 东阳市| 根河市| 金平| 亚东县| 衡东县| 明光市| 郯城县| 齐齐哈尔市| 连平县| 塘沽区| 陇南市| 东海县| 高州市| 泽州县| 师宗县| 务川| 桦南县| 精河县| 浮梁县| 遵义市| 志丹县| 应用必备| 建昌县| 交口县| 东海县| 康保县| 庄浪县| 定边县| 贵港市|