Java交流空間

          共同夢(mèng)想,一起飛翔,明天更美好!

           

          java編程規(guī)范(學(xué)java的第一步)

           

          1         Java編程規(guī)范

          1.1     命名約定

          1.1.1    包的命名

          JDK 的標(biāo)準(zhǔn)是——包名稱(chēng)的所有字母均小寫(xiě),如:

          package myownpackage;

          1.1.2    類(lèi)的命名

          JDK 的標(biāo)準(zhǔn)是——大寫(xiě)一個(gè)類(lèi)名的首字母,若類(lèi)名由幾個(gè)單詞構(gòu)成,那么把它們緊靠到一起(也就是說(shuō),不要用下劃線(xiàn)來(lái)分隔名字)。此外,每個(gè)嵌入單詞的首字母都要采用大寫(xiě)形式。類(lèi)名稱(chēng)應(yīng)該是一個(gè)名詞短語(yǔ)。如:

          class ZipFileAccesser

          1.1.3    變量的命名

          1.        ?變量命名一般原則(參照匈牙利命名法)(必須)
          2.        能清楚表示變量的類(lèi)型
          3.        能簡(jiǎn)明表達(dá)變量的涵義
          4.        ?常量的命名(必須)
          5.        常量名稱(chēng)全部大寫(xiě),如:

          public final int PORT = 2000;

          6.        主要基本類(lèi)型變量的命名

          主要類(lèi)型名稱(chēng)縮寫(xiě)格式及規(guī)則:由類(lèi)型全稱(chēng)取一個(gè)字母組成 + 實(shí)際名稱(chēng),如:

          String strTemp;

          對(duì)幾種主要的基本類(lèi)型變量命名前綴的規(guī)定(參見(jiàn)附錄A:基本命名參考

          7.        靜態(tài)變量的命名

          靜態(tài)變量名稱(chēng)以字符串“STATIC”開(kāi)頭,如:

          static int STATICintNumber;

          8.        臨時(shí)變量的命名(推薦)

          臨時(shí)性變量格式為(類(lèi)型名稱(chēng)縮寫(xiě) + Temp),如:

          String strTemp=”asdf”;

          9.        對(duì)象命名規(guī)則:

          第一原則:當(dāng)類(lèi)名是由多單詞組成,取每個(gè)單詞的首字母,將其小寫(xiě)形式組合而成變量名稱(chēng)的前綴,當(dāng)對(duì)象是由單個(gè)單詞組成時(shí),取整個(gè)單詞的小寫(xiě)形成作為變量名的前綴,如:

          PrintWriter pwTemp;

          Socket socketTemp;

          第二原則:如果這樣命名時(shí)產(chǎn)生了重復(fù)現(xiàn)象,則和類(lèi)型名稱(chēng)縮寫(xiě)提取原則類(lèi)似,取三個(gè)小寫(xiě)輔音字母或習(xí)慣性的用法,總之以能明顯區(qū)別類(lèi)名稱(chēng)為原則。如:ServletResponse ServletRequest 如果按照第一原則,兩個(gè)對(duì)象都可命名為srTemp,產(chǎn)生了重復(fù),此時(shí)就應(yīng)按照第二原則,命名為srpTemp srqTemp

          10.     成員變量的命名

          成員變量的命名原則與臨時(shí)變量相同,但在可能與臨時(shí)變量名稱(chēng)重復(fù)的調(diào)用場(chǎng)合,應(yīng)加上this.以示區(qū)別。推薦:對(duì)大多數(shù)成員變量調(diào)用的場(chǎng)合加上this.以利區(qū)別,如:

          public String strUserName;

          this.strUserName = strUserName;

          1.1.4    方法的命名

          方法名的第一個(gè)字母采用小寫(xiě),其他嵌入單詞首字母大寫(xiě)。方法名應(yīng)該是一個(gè)動(dòng)賓結(jié)構(gòu)的短語(yǔ),能夠簡(jiǎn)明恰當(dāng)?shù)谋磉_(dá)出方法完成的操作。如:

          public String getStudentName(…);

          1.1.5    其它說(shuō)明:(推薦)

          一般不允許使用數(shù)字和下劃線(xiàn)。如:

          socket1,socket_num;

          1.2     注釋

          注釋采用javadoc的注釋方法,所有注釋放置于所注釋目標(biāo)的上方。

          1.2.1    類(lèi)/接口的頭注釋

          /**********************************************************

          * 類(lèi)描述信息

          * @author 作者信息

          * @version 版本信息,時(shí)間

          * @since 創(chuàng)自信息

          **********************************************************/

          1.2.2    屬性的注釋

          /**

          * 注釋內(nèi)容

          */

          1.2.3    方法的頭注釋

          /**

          * @param

          * @return

          * @throws

          */

          注:每個(gè)參數(shù)名后必須有相應(yīng)的說(shuō)明,格式如下

          [參數(shù)名 參數(shù)說(shuō)明]

          如:

          * @param intCounter 計(jì)數(shù)器

          * @param strName 變量名稱(chēng)

          * @param blnFlag 標(biāo)志位

          返回值不必寫(xiě)類(lèi)型,如果沒(méi)有返回值或者返回值是void 就不寫(xiě)@return,如:

          * @return 當(dāng)前的計(jì)數(shù)值

          異常要逐個(gè)分行寫(xiě)出,如:

          * @throws IOException 如果發(fā)生I/O 錯(cuò)誤

          * @throws ZIPException 如果發(fā)生ZIP 文件錯(cuò)誤

          1.2.4    代碼內(nèi)的注釋

          直接在代碼內(nèi)出現(xiàn)的注釋通常使得代碼易于理解。通過(guò)在前面加上一個(gè)空行和一個(gè)注釋行(或更多行)來(lái)概括大的操作。在需要時(shí)用每行后面的注釋或者更多的注釋來(lái)解釋較奇特的代碼。不止一行的注釋通常用/*…*/,而不是//,但//在行尾注釋中更好用。單行的注釋用兩種方法都可以,但推薦使用//

          1.2.5    未完成代碼的提醒注釋

          /**

          * @todo   注釋內(nèi)容

          */

          1.3     代碼分隔

          import …

          空一行

          package …

          空一行

          class …

          1.        屬性與屬性間空一行,方法與方法之間空一行,類(lèi)與類(lèi)之間空一行。先寫(xiě)公有屬性,后寫(xiě)保護(hù)屬性,最后寫(xiě)私有屬性。
          2.        在方法內(nèi)部,幾行關(guān)系緊密的代碼之間應(yīng)該不空行,但兩個(gè)相對(duì)獨(dú)立的代碼塊之間應(yīng)空一行。一般,在方法內(nèi)部每隔35 行就應(yīng)有一個(gè)空行。兩個(gè)相鄰空行之間的一段代碼為一個(gè)代碼塊,
          3.        每隔代碼塊前面應(yīng)有行注釋。
          4.        構(gòu)造子必須放在其他所有方法前
          5.        運(yùn)算符兩邊要加一個(gè)空格,如:

          intTotal = intAvg * intNum;

          6.        括號(hào)兩邊內(nèi)側(cè)要各加一個(gè)空格,如:

          void main ( String[ ] args );

          7.        一行代碼只允許有一條語(yǔ)句,但這樣簡(jiǎn)單的形式除外:

          int ix, iy;

          8.        減少public 域的定義,盡量通過(guò)方法而不是通過(guò)對(duì)象的實(shí)例直接訪(fǎng)問(wèn)對(duì)象的域,并且所有的成員域必須加以說(shuō)明。如:

          String strUserName; //用戶(hù)名稱(chēng)

          1.4     代碼縮進(jìn)原則

          1.        類(lèi)名、類(lèi)體、方法體依次縮進(jìn)一個(gè)單位長(zhǎng)
          2.        一個(gè)單位長(zhǎng)是四個(gè)空格(可設(shè)為一個(gè)TAB 長(zhǎng))

          1.5     雜項(xiàng)格式化約定

          1.        在代碼塊之間使用空行,通過(guò)概括注釋來(lái)分隔。
          2.        使行的長(zhǎng)度限制在80個(gè)字符內(nèi)。
          3.        tab來(lái)縮進(jìn)、每個(gè)tab長(zhǎng)度為4個(gè)空格。
          4.        左花括號(hào)與方法名處同一行,間隔一個(gè)空格。
          5.        跳轉(zhuǎn)語(yǔ)句的標(biāo)號(hào)與switch關(guān)鍵字對(duì)齊。
          6.        像在英文中那樣使用空格(關(guān)鍵字和逗號(hào)后面加,括號(hào)后面不加,許多操作符之間加)。

          2         附錄A:基本命名參考

          2.1     構(gòu)造名稱(chēng)

          w           一般的匈牙利名稱(chēng)是由三部分組成:一個(gè)或多個(gè)前綴,一個(gè)基本標(biāo)簽和一個(gè)qualifier

          w           基本標(biāo)簽表示了變量的類(lèi)型(例如,“co”表示一種顏色)。

          w           前綴修飾這個(gè)類(lèi)型(例如,“rg”表示體格數(shù)組,所以“rgco”表示一個(gè)顏色數(shù)組)。

          w           qualifier描述了這種特定類(lèi)型的具體用途(例如,“rgcoGray”表示一個(gè)作為灰色使用的顏色數(shù)組)。

          2.2     標(biāo)準(zhǔn)基本標(biāo)簽

          i

          int

          f

          float

          d

          double

          b

          boolean

          ch

          char

          str

          字符串String

          bt

          byte類(lèi)型。

          l

          long類(lèi)型 (有符號(hào)32位的值)

          date

          日期型

          enum

          枚舉型

          2.3     標(biāo)準(zhǔn)前綴

          rg/a

          數(shù)組(來(lái)自于“range”)。例如,“rgch”表示一個(gè)字符數(shù)組。

          c

          某個(gè)基類(lèi)條目的計(jì)數(shù)。例如,“cch”表示字符的計(jì)數(shù)。

          d

          某種基類(lèi)的值之間的差值或delta。例如,“dx”表示兩個(gè)x類(lèi)型的值之間的差值。

          此外,以下是我們?cè)诤线m的時(shí)候可以在任何匈牙利前綴之前加入的特殊前綴:

          m_

          C++類(lèi)的數(shù)據(jù)成員。

          s_

          C++類(lèi)的靜態(tài)數(shù)據(jù)成員。

          2.4     標(biāo)準(zhǔn)qualifier

          First

          某集合中的第一個(gè)條目,或所關(guān)心的第一個(gè)條目(例如pchFirst)。

          Last

          某集合的最后一個(gè)條目,或所關(guān)心的最后一個(gè)條目(例如,pchLast)。當(dāng)作為下標(biāo)使用時(shí),Last表示最后一個(gè)有效的/希望的值,所以一個(gè)循環(huán)可能是:
          for (ich = ichFirst; ich <= ichLast; ich++)

          Lim

          某集合的元素個(gè)數(shù)上限。與Last不同,Lim不代表一個(gè)有效的值,Lim代表最后一個(gè)有效值后面的一個(gè),所以一個(gè)循環(huán)可能是:

          for (ich = ichFirst; ich < ichLim; ich++)

          Min

          某集合的最小元素。與First相似,但通常表示第一個(gè)有效的值,而不是要處理的第一個(gè)值。

          Max

          某集合的元素個(gè)數(shù)上限(Lim相同)。不幸的是,標(biāo)準(zhǔn)的英文中的“Max”通常表示最后一個(gè)有效的值,但Max qualifier不是一個(gè)有效的值,它是最后一個(gè)有效值后面的一個(gè)。和Lim一樣,典型的用法應(yīng)該是:

          for (ich = ichMin; ich < ichMax; ich++)
          對(duì)此要特別小心。

          Mac

          Max相似,但有時(shí)可用在“當(dāng)前”最大值可能隨時(shí)間變化的情況下。注意Mac也是代表“最后的”有效值之后的一個(gè)。

          Mic

          Min相似,但有時(shí)可用在“當(dāng)前”最大值可能隨時(shí)間變化的情況下。

          T

          臨時(shí)的值。這個(gè)qualifier可能會(huì)被過(guò)度使用,而不能為某些量起一個(gè)好名字,但有時(shí)少數(shù)的臨時(shí)值是可以的,比如在一個(gè)典型的交換操作中。

          TT, T3, etc.

          這是在需要更確切的名字的時(shí)候?qū)?/span>T的進(jìn)一步濫用。這些用法應(yīng)當(dāng)被避免。

          Sav

          用于保存一個(gè)值的臨時(shí)量,使該值可以在以后被恢復(fù)。例如:hwndSav = hwnd; ...; hwnd = hwndSav;

          Null

          特殊的0值,總是等價(jià)于0,但用于特定的目的(例如 hwndNull)

          Nil

          特殊的無(wú)效值,不一定與0等價(jià)(可能是-1,或任何其它值)。為避免混淆,最好對(duì)同一類(lèi)型避免既使用Null又使用Nil

          Src

          某項(xiàng)操作的源,典型的用法是與表示目標(biāo)的Dest匹配使用,如下:

          *pchDest = *pchSrc

          Dest

          目標(biāo)。參見(jiàn)Src

          Sum

          總和。

          3         附錄B:標(biāo)準(zhǔn)代碼樣本

          import com.sun.tools.doclets.*;

          import com.sun.javadoc.*;

          import java.io.*;

          import java.lang.*;

          import java.util.*;

          /***********************************************************************

           * Generate the package index page "overview-summary.html" for the right-hand

           * frame. A click on the package name on this page will update the same frame

           * with the "pacakge-summary.html" file for the clicked package.

           *

           * @author Atul M Dambalkar

           * @version 1.0

           * @since JDK 1.4

           ***********************************************************************/

          public class PackageIndexWriter

              extends AbstractPackageIndexWriter {

              /**

               * Root of the program structure. Used for "overview" documentation.

               */

              private RootDoc root;

              /**

               * Map representing the group of packages as specified on the command line.

               *

               * @see Group

               */

              private Map groupPackageMap;

              /**

               * List to store the order groups as specified on the command line.

               */

              private List groupList;

              /**

               * Construct the PackageIndexWriter. Also constructs the grouping

               * information as provided on the command line by "-group" option. Stores

               * the order of groups specified by the user.

               *

               * @see Group

               */

              public PackageIndexWriter(String filename, RootDoc root) throws IOException {

                  super(filename);

                  this.root = root;

                  groupPackageMap = Group.groupPackages(packages);

                  groupList = Group.getGroupList();

              }

              /**

               * Generate the package index page for the right-hand frame.

               *

               * @param root the root of the doc tree.

               */

              public static void generate(RootDoc root) throws DocletAbortException {

                  PackageIndexWriter packgen;

                  String filename = "overview-summary.html";

                  try {

                      packgen = new PackageIndexWriter(filename, root);

                      packgen.generatePackageIndexFile();

                      packgen.close();

                  }

                  catch (IOException exc) {

                      Standard.configuration().standardmessage.error(

                          "doclet.exception_encountered",

                          exc.toString(), filename);

                      throw new DocletAbortException();

                  }

              }

              /**

               * Print each package in separate rows in the index table. Generate link

               * to each package.

               *

               * @param packagedoc Package to which link is to be generated.

               */

              protected void printIndexRow(PackageDoc packagedoc) {

                  trBgcolorStyle("white", "TableRowColor");

                  summaryRow(20);

                  bold();

                  printPackageLink(packagedoc);

                  boldEnd();

                  summaryRowEnd();

                  summaryRow(0);

                  printSummaryComment(packagedoc);

                  summaryRowEnd();

                  trEnd();

              }

              /**

               * Depending upon the grouping information and their titles, generate

               * separate table indices for each package group.

               */

              protected void generateIndex() {

                  for (int i = 0; i < groupList.size(); i++) {

                      String groupname = (String) groupList.get(i);

                      List list = (List) groupPackageMap.get(groupname);

                      if (list != null && list.size() > 0) {

                          printIndexContents( (PackageDoc[]) list.

                                             toArray(new PackageDoc[list.size()]),

                                             groupname);

                      }

                  }

              }

              /**

               * Print the overview summary comment for this documentation. Print one line

               * summary at the top of the page and generate a link to the description,

               * which is generated at the end of this page.

               */

              protected void printOverviewHeader() {

                  if (root.inlineTags().length > 0) {

                      printSummaryComment(root);

                      p();

                      bold(getText("doclet.See"));

                      br();

                      printNbsps();

                      printHyperLink("", "overview_description",

                                     getText("doclet.Description"), true);

                      p();

                  }

              }

              /**

               * Print Html tags for the table for this package index.

               */

              protected void printIndexHeader(String text) {

                  tableIndexSummary();

                  tableHeaderStart("#CCCCFF");

                  bold(text);

                  tableHeaderEnd();

              }

              /**

               * Print Html closing tags for the table for this package index.

               */

              protected void printIndexFooter() {

                  tableEnd();

                  p();

                  space();

              }

              /**

               * Print the overview comment as provided in the file specified by the

               * "-overview" option on the command line.

               */

              protected void printOverviewComment() {

                  if (root.inlineTags().length > 0) {

                      anchor("overview_description");

                      p();

                      printInlineComment(root);

                      p();

                  }

              }

              /**

               * Call {@link #printOverviewComment()} and then genrate the tag information

               * as provided in the file specified by the "-overview" option on the

               * command line.

               */

              protected void printOverview() throws IOException {

                  printOverviewComment();

                  generateTagInfo(root, null); //new

              }

              /**

               * Print the header for navigation bar. Also print the "-title" specified

               * on command line, at the top of page.

               */

              protected void printNavigationBarHeader() {

                  navLinks(true);

                  hr();

                  printConfigurationTitle();

              }

              /**

               * Print the footer fornavigation bar. Also print the "-bottom" specified

               * on command line, at the top of page.

               */

              protected void printNavigationBarFooter() {

                  hr();

                  navLinks(false);

                  printBottom();

              }

          }

          4         附錄C:更多Java編程規(guī)則

          選自《Think in java》,包含了大量有用的建議,幫助大家進(jìn)行低級(jí)程序設(shè)計(jì),并提供了代碼編寫(xiě)的一般性指導(dǎo):

          1.        類(lèi)名首字母應(yīng)該大寫(xiě)。字段、方法以及對(duì)象的首字母應(yīng)小寫(xiě)。對(duì)于所有標(biāo)識(shí)符,其中包含的所有單詞都應(yīng)緊靠在一起,而且大寫(xiě)中間單詞的首字母。例如:

          ThisIsAClassName

          thisIsMethodOrFieldName

          若在定義中出現(xiàn)了常數(shù)初始化字符,則大寫(xiě)static final基本類(lèi)型標(biāo)識(shí)符中的所有字母。這樣便可標(biāo)志出它們屬于編譯期的常數(shù)。

          Java包(Package)屬于一種特殊情況:它們?nèi)际切?xiě)字母,即便中間的單詞亦是如此。對(duì)于域名擴(kuò)展名稱(chēng),如comorgnet或者edu等,全部都應(yīng)小寫(xiě)(這也是Java 1.1Java 1.2的區(qū)別之一)。

          2.        為了常規(guī)用途而創(chuàng)建一個(gè)類(lèi)時(shí),請(qǐng)采取“經(jīng)典形式”,并包含對(duì)下述元素的定義:

          equals()

          hashCode()

          toString()

          clone()implement Cloneable

          implement Serializable

          3.        對(duì)于自己創(chuàng)建的每一個(gè)類(lèi),都考慮置入一個(gè)main(),其中包含了用于測(cè)試那個(gè)類(lèi)的代碼。為使用一個(gè)項(xiàng)目中的類(lèi),我們沒(méi)必要?jiǎng)h除測(cè)試代碼。若進(jìn)行了任何形式的改動(dòng),可方便地返回測(cè)試。這些代碼也可作為如何使用類(lèi)的一個(gè)示例使用。
          4.        應(yīng)將方法設(shè)計(jì)成簡(jiǎn)要的、功能性單元,用它描述和實(shí)現(xiàn)一個(gè)不連續(xù)的類(lèi)接口部分。理想情況下,方法應(yīng)簡(jiǎn)明扼要。若長(zhǎng)度很大,可考慮通過(guò)某種方式將其分割成較短的幾個(gè)方法。這樣做也便于類(lèi)內(nèi)代碼的重復(fù)使用(有些時(shí)候,方法必須非常大,但它們?nèi)詰?yīng)只做同樣的一件事情)。
          5.        設(shè)計(jì)一個(gè)類(lèi)時(shí),請(qǐng)?jiān)O(shè)身處地為客戶(hù)程序員考慮一下(類(lèi)的使用方法應(yīng)該是非常明確的)。然后,再設(shè)身處地為管理代碼的人考慮一下(預(yù)計(jì)有可能進(jìn)行哪些形式的修改,想想用什么方法可把它們變得更簡(jiǎn)單)。
          6.        使類(lèi)盡可能短小精悍,而且只解決一個(gè)特定的問(wèn)題。下面是對(duì)類(lèi)設(shè)計(jì)的一些建議:
          (1)     數(shù)量眾多的方法涉及到類(lèi)型差別極大的操作:考慮用幾個(gè)類(lèi)來(lái)分別實(shí)現(xiàn)
          (2)     許多成員變量在特征上有很大的差別:考慮使用幾個(gè)類(lèi)
          7.        讓一切東西都盡可能地“私有”——private。在多線(xiàn)程環(huán)境中,隱私是特別重要的一個(gè)因素——只有private字段才能在非同步使用的情況下受到保護(hù)。
          8.        謹(jǐn)惕“巨大對(duì)象綜合癥”。對(duì)一些習(xí)慣于順序編程思維、且初涉OOP領(lǐng)域的新手,往往喜歡先寫(xiě)一個(gè)順序執(zhí)行的程序,再把它嵌入一個(gè)或兩個(gè)巨大的對(duì)象里。根據(jù)編程原理,對(duì)象表達(dá)的應(yīng)該是應(yīng)用程序的概念,而非應(yīng)用程序本身。
          9.        若不得已進(jìn)行一些不太雅觀(guān)的編程,至少應(yīng)該把那些代碼置于一個(gè)類(lèi)的內(nèi)部。
          10.     任何時(shí)候只要發(fā)現(xiàn)類(lèi)與類(lèi)之間結(jié)合得非常緊密,就需要考慮是否采用內(nèi)部類(lèi),從而改善編碼及維護(hù)工作。
          11.     盡可能細(xì)致地加上注釋?zhuān)⒂?/span>javadoc注釋文檔語(yǔ)法生成自己的程序文檔。
          12.     避免使用“魔術(shù)數(shù)字”,這些數(shù)字很難與代碼很好地配合。如以后需要修改它,無(wú)疑會(huì)成為一場(chǎng)噩夢(mèng),因?yàn)楦静恢?#8220;100”到底是指“數(shù)組大小”還是“其他全然不同的東西”。所以,我們應(yīng)創(chuàng)建一個(gè)常數(shù),并為其使用具有說(shuō)服力的描述性名稱(chēng),并在整個(gè)程序中都采用常數(shù)標(biāo)識(shí)符。這樣可使程序更易理解以及更易維護(hù)。
          13.     當(dāng)客戶(hù)程序員用完對(duì)象以后,若你的類(lèi)要求進(jìn)行任何清除工作,可考慮將清除代碼置于一個(gè)良好定義的方法里,采用類(lèi)似于cleanup()這樣的名字,明確表明自己的用途。除此以外,可在類(lèi)內(nèi)放置一個(gè)boolean(布爾)標(biāo)記,指出對(duì)象是否已被清除。在類(lèi)的finalize()方法里,請(qǐng)確定對(duì)象已被清除。在采取象這樣的方案之前,請(qǐng)確定finalize()能夠在自己的系統(tǒng)中工作(可能需要調(diào)用System.runFinalizersOnExit(true),從而確保這一行為)。
          14.     在一個(gè)特定的作用域內(nèi),若一個(gè)對(duì)象必須清除(非由垃圾收集機(jī)制處理),請(qǐng)采用下述方法:初始化對(duì)象;若成功,則立即進(jìn)入一個(gè)含有finally從句的try塊,開(kāi)始清除工作。
          15.     若在初始化過(guò)程中需要覆蓋(取消)finalize(),請(qǐng)記住調(diào)用super.finalize()(若Object屬于我們的直接超類(lèi),則無(wú)此必要)。在對(duì)finalize()進(jìn)行覆蓋的過(guò)程中,對(duì)super.finalize()的調(diào)用應(yīng)屬于最后一個(gè)行動(dòng),而不應(yīng)是第一個(gè)行動(dòng),這樣可確保在需要基礎(chǔ)類(lèi)組件的時(shí)候它們依然有效。
          16.     創(chuàng)建大小固定的對(duì)象集合時(shí),請(qǐng)將它們傳輸至一個(gè)數(shù)組(若準(zhǔn)備從一個(gè)方法里返回這個(gè)集合,更應(yīng)如此操作)。這樣一來(lái),我們就可享受到數(shù)組在編譯期進(jìn)行類(lèi)型檢查的好處。
          17.     盡量使用interfaces,不要使用abstract類(lèi)。若已知某樣?xùn)|西準(zhǔn)備成為一個(gè)基礎(chǔ)類(lèi),那么第一個(gè)選擇應(yīng)是將其變成一個(gè)interface(接口)。只有在不得不使用方法定義或者成員變量的時(shí)候,才需要將其變成一個(gè)abstract(抽象)類(lèi)。接口主要描述了客戶(hù)希望做什么事情,而一個(gè)類(lèi)則致力于(或允許)具體的實(shí)施細(xì)節(jié)。
          18.     在構(gòu)建函數(shù)內(nèi)部,只進(jìn)行那些將對(duì)象設(shè)為正確狀態(tài)所需的工作。盡可能地避免調(diào)用其他方法,因?yàn)槟切┓椒赡鼙黄渌烁采w或取消,從而在構(gòu)建過(guò)程中產(chǎn)生不可預(yù)知的結(jié)果。
          19.     對(duì)象不應(yīng)只是簡(jiǎn)單地容納一些數(shù)據(jù);它們的行為也應(yīng)得到良好的定義。
          20.     警惕“過(guò)早優(yōu)化”。首先讓它運(yùn)行起來(lái),再考慮變得更快——但只有在自己必須這樣做、而且經(jīng)證實(shí)在某部分代碼中的確存在一個(gè)性能瓶頸的時(shí)候,才應(yīng)進(jìn)行優(yōu)化。除非用專(zhuān)門(mén)的工具分析瓶頸,否則很有可能是在浪費(fèi)自己的時(shí)間。性能提升的隱含代價(jià)是自己的代碼變得難于理解,而且難于維護(hù)。
          21.     請(qǐng)記住,閱讀代碼的時(shí)間比寫(xiě)代碼的時(shí)間多得多。思路清晰的設(shè)計(jì)可獲得易于理解的程序,但注釋、細(xì)致的解釋以及一些示例往往具有不可估量的價(jià)值。無(wú)論對(duì)你自己,還是對(duì)后來(lái)的人,它們都是相當(dāng)重要的。如對(duì)此仍有懷疑,那么請(qǐng)?jiān)囅胱约涸噲D從聯(lián)機(jī)Java文檔里找出有用信息時(shí)碰到的挫折,這樣或許能將你說(shuō)服。
          22.     如認(rèn)為自己已進(jìn)行了良好的分析、設(shè)計(jì)或者實(shí)施,那么請(qǐng)稍微更換一下思維角度。試試邀請(qǐng)一些外來(lái)人士——并不一定是專(zhuān)家,但可以是來(lái)自本公司其他部門(mén)的人。請(qǐng)他們用完全新鮮的眼光考察你的工作,看看是否能找出你一度熟視無(wú)睹的問(wèn)題。采取這種方式,往往能在最適合修改的階段找出一些關(guān)鍵性的問(wèn)題,避免產(chǎn)品發(fā)行后再解決問(wèn)題而造成的金錢(qián)及精力方面的損失。
          23.     良好的設(shè)計(jì)能帶來(lái)最大的回報(bào)。簡(jiǎn)言之,對(duì)于一個(gè)特定的問(wèn)題,通常會(huì)花較長(zhǎng)的時(shí)間才能找到一種最恰當(dāng)?shù)慕鉀Q方案。但一旦找到了正確的方法,以后的工作就輕松多了,再也不用經(jīng)歷數(shù)小時(shí)、數(shù)天或者數(shù)月的痛苦掙扎。我們的努力工作會(huì)帶來(lái)最大的回報(bào)(甚至無(wú)可估量)。而且由于自己傾注了大量心血,最終獲得一個(gè)出色的設(shè)計(jì)方案,成功的快感也是令人心動(dòng)的。堅(jiān)持抵制草草完工的誘惑——那樣做往往得不償失。

          posted on 2007-11-29 14:57 郭旺平 閱讀(718) 評(píng)論(2)  編輯  收藏

          評(píng)論

          # re: java編程規(guī)范(學(xué)java的第一步) 2007-12-07 02:31 cmpleo

          好詳細(xì)啊,謝一個(gè)  回復(fù)  更多評(píng)論   

          # re: java編程規(guī)范(學(xué)java的第一步)[未登錄](méi) 2008-05-07 16:22 william

          很不錯(cuò),很詳細(xì)!  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆檔案(2)

          文章檔案(2)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 永顺县| 十堰市| 临潭县| 肃北| 宁武县| 余干县| 晋中市| 阿拉善左旗| 灵丘县| 永泰县| 武宁县| 岳阳县| 南雄市| 钦州市| 苍山县| 阿合奇县| 娄烦县| 吴川市| 泾阳县| 沁源县| 绥滨县| 绥德县| 穆棱市| 渑池县| 綦江县| 报价| 罗源县| 洪湖市| 临桂县| 富民县| 江山市| 平舆县| 沾化县| 靖西县| 城固县| 建宁县| 柘荣县| 明溪县| 多伦县| 平安县| 柘城县|