程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi代碼的標准風格

Delphi代碼的標准風格

編輯:Delphi
      我們承認許多好的已經確定的工作室或個人,擁有他們自己的和本文裡所說的不同的編程習慣, 但是,我們強烈建議你使用一個工具將你的代碼轉換為Borland風格的代碼,然後再提交給Borland,Project JEDI或其他任何公開的源代碼知識庫。我們不想強迫你改變你的習慣,但我們堅持所有同Borland產品一起工作的的代碼遵循本文描述的習慣。
      對象Pascal是一種優美的設計語言。較強的可讀性就是它的一個優點。本文設計的標准將增強對象Pascal代碼的可讀性。當開發人員遵從本文展現的這些簡單的習慣,他們也將成為標准,這將有益於所有的Delphi開發人員使用統一的易讀的代碼風格。執行這些標准的努力將增加開發人員的源代碼的價值,特別是在維護和調試循環階段。
      盡管我們相信並且贊美本文所宣揚的風格,但我們沒有必要支持它,因為它本身是正確的而其它的則是錯誤的。然而我們相信絕大多數開發人員遵從的標准是有它的功效的,所以我們仍然支持並維護該風格。人類的大腦總在適應標准,並且找尋方法去快速組織所熟悉的模式,從而快速而有效地理解其含義。正是因這種要求而建立的標准將使大量的人盡可能容易的閱讀代碼。如果在初次使用我們的指導方針是感到陌生,那麼我們請你堅持一會兒,你會發現你也變得習慣了。或者,如果你願意,你也可以保持你自己的風格,並通過一個遵從我們標准的程序來轉換,然後你可以將你的代碼提交給Borland或其他知識庫了。
      一些文本編輯器,象Visual SlickEdit可以幫助你按照一定的風格來格式化你的代碼。
  
  一個免費的由Egbert van Nes開發的格式化程序可以在以下的連接獲得:
  http://www.slm.wau.nl/wkao/delforexp.Html
  
  另一個針對Delphi的商業化程序是CrackerJax:
  http://www.kineticsoftware.com/html/products.Html
  
  ----------------------------------------
  
  
  1.0 介紹
      本文不是為Object Pascal語言定義語法規則的一種嘗試。例如:在else前面放置封號";"是違法的;編譯器不允許這種用法。所以我不會在本文中展示語法規則。本文旨在在語言提供選擇的地方定義適當的行為習慣。我通常在只有一種控制方法的地方保持沉默。
  
  1.1 背景
      在本文出現的指導方針基於Delphi源代碼的一部分。Delphi源代碼恰好遵循這些指導方針。如果你發現了違反這些原則的情況,那麼應該是這些原則而不是那些不確定的源代碼成為你的指導方針。然而,你可以使用這些原代碼作為這些原則的補充,至少它可以幫助你得到關於你自己的代碼的形式的一般看法。
  
  1.2 感謝
      本文這些格式是基於已完成的為Java語言定義的風格標准的工作的。Java在規則上對格式化Object Pascal源代碼是沒有任何影響的,但在Sun網站上的文檔是本文的基礎。 在某些特殊的地方本文的風格和格式受到"A Coding Style Guide for Java WorkShop and Java Studio Programming"(Achut Reddy, 《Java車間和Java工作室的編碼向導》)的很大啟發。該文章可在該URL找到:http://www.sun.com/workshop/Java/wp-coding
      Delphi小組為本文的完成做出了重大貢獻,事實上,如果沒有它們的幫助,本文是無法完成的。
  
  2.0 源文件
      Object Pascal源代碼主要被分成單源文件和項目文件,他們都遵從相同的習慣。Delphi項目文件有一個.DPR的擴展名。它是項目的主文件。任何在項目中使用的單元文件都有一個.PAS的擴展名。其它的文件,象批處理文件、Html文件或者DLLs也可以在項目中扮演一個角色,但本文只涉及項目文件和單元文件。
  
  2.1 源文件命名
      Object Pascal支持長文件名。如果你使用幾個單詞來形成一個單一的名稱,那麼最好是為每個單詞使用大寫的開頭字母:MyFile.pas。這被認為是插入式大寫或駝峰式大寫。擴展名應當使用小寫形式。由於歷史原因,Delphi源代碼經常使用8:3式命名模式,但開發人員不必為上述規則所限制而轉向Delphi小組的用法。
      如果你正在翻譯一個C/C++頭文件,那麼你翻譯的Pascal文件要與C/C++頭文件保持相同的主文件名,擴展名用.PAS。例如:Windows.h -> Windows.pas。如果Pascal語法強迫你將幾個頭文件組合到一個單一的單元文件中,那麼包含其他頭文件的那個頭文件的文件名將作為新單元文件的名稱。例如:Windows.h包含了WinBase.h文件,則新的單元文件名為Windows.pas.
  
  2.2 源文件組織
      所有的Object Pascal單元文件應當按照以下的順序包含下列元素:
  版權/標識塊注釋
  單元名
  接口段
  實現部分
  一個結束符"end."
  
  每個部分之間至少空一行。
  
  其它的元素應當被結構化成你認為最適當的順序。但版權應當出現在文件的最開始,然後是單元名,然後是任何條件定義、編譯器指示符或包含語句,然後是uses字句:
  

  
  {*******************************************************}
  { }
  { Borland Delphi Visual Component Library }
  { }
  { Copyright (c) 1995,98 Inprise Corporation }
  { }
  {*******************************************************}
  
  unit Buttons;
  
  {$S-,W-,R-}
  {$C PRELOAD}
  
  interface
  
  uses
    Windows, Messages, Classes,
    Controls, Forms, Graphics,
    StdCtrls, ExtCtrls, CommCtrl;
  

  

  
  
  如果你將type段放到const段之前,或者將它們兩者混合,那是沒有什麼影響的。
  
  實現部分需要首先將implementation寫出來,然後是uses字句,然後是其它的包含聲明或別的指示符:
  

  
  implementation
  
  uses
    Consts, SysUtils, ActnList,
    ImgList;
  

  

  
  
  {$R BUTTONS.RES}
  
  2.2.1 版權/標識塊注釋
      每一個源文件都應當以一個包含版本信息和標准版權布告塊注釋開始。版本信息可以象下面這樣:
  

  
  {*******************************************************}
  { }
  { Widgets Galore }
  { }
  { Copyright (c) 1995,98 Your Company }
  { }
  {*******************************************************}
  

  

  
  
  版權布告至少需要包含以下行:
      版權所有(C) 年份 版權所有者
  
  如果你是為Borland開發軟件的第三方,你可以在版權的最後加入你自己的名字:
  

  
  {*******************************************************}
  { }
  { Borland Delphi Visual Component Library }
  { Copyright (c) 1995,99 Borland International }
  { Created by Project JEDI }
  { }
  {*******************************************************}
  

  

  
  
  2.2.2 unit聲明
      每一個單元文件要有一個unit聲明。unit是一個保留字,因此它需要小寫。單元的名稱可以是大小寫混合的,但必須和單元文件的文件名相同。例如:
  unit MyUnit;
  
  則單元文件的名稱應當為MyUnit.pas。在文件系統中,它作為這個文件的入口。
  
  2.2.3 uses聲明
      在單元內部,uses聲明應當使用小些的uses引導。被引用的單元名要遵循在他自己的單元中被定義時使用的大寫習慣:
  uses MyUnit;
      每一個單元名被一個逗號同其相鄰的單元名分開,最後一個單元名後面跟一個分號:
  

  
  uses
    Windows, SysUtils, Classes, Graphics, Controls, Forms,
    TypInfo;
      在uses的下一行開始加入單元名和在uses後面直接加入單元名同樣都是正確的。
  uses Windows, SysUtils, Classes, Graphics, Controls, Forms,
    TypInfo;
  

  

      你可以格式化你的單元名列表,可以在80個字符限制下換行,或者每個單元名一行。
  
  2.2.4 類和接口定義
      類的定義以兩個空格開始,然後是一個前綴"T"。 前綴要大寫,每個內嵌的單詞要大寫開頭。不要在Object Pascal源代碼中使用制表符"Tab"。例:
  TMyClass
      在標識符之後接一個空格,然後是等號,然後是class單詞,class要小寫:
    TMyClass = class
      如果你的類是從祖先繼承來的,則需要加入包含著祖先類的左右括號:
    TMyClass = class(TObject)
      范圍指示符離頁邊兩個空格,並以下面的順序出現:
    TMyClass = clss(TObject)
    private
    protect
    public
    published
    end;
      數據通常只在private段聲明,並且它們的標識符以"F"開始。所有此類的聲明離頁邊4個空格:
  

  
    TMyClass = class(TObject)
    private
      FMyDate: Integer;
      function GetDate: Integer;
      procedure SetData(Value: Integer);
    public
    published
      property MyData: Integer read GetData write SetData;
    end;
  

  

      接口遵從同類相同的規則,除了你應當忽略范圍指示符和私有數據,並且使用interface單詞代替class單詞。
      命名習慣
      除了保留字和指示符是小寫外,所有的Pascal標識符應當使用駝峰式格式,即每個標識符開頭字母要大寫,內嵌單詞的首字母也要大寫,只取首字母的縮寫詞也一樣。
  MyIdentifIEr
  MyFTPClass
      對此規則主要的例外是頭文件翻譯的情況,應當遵循在原頭文件中的命名習慣。例如:
      WM_LBUTTONDOWN,不要寫成wm_LButtonDown.
      除了頭文件翻譯外,不要使用下劃線分割單詞。類名應當是名詞或名詞短語。接口或類的名稱依賴於接口的顯而易見的目的、用途。
  
  好的名字:
      AddressForm, ArrayIndexOutOfBoundsException
  低劣的名字:
      ManageLayout //使用動詞短語
      Delphi_is_new_to_me //使用下劃線
  
  3.1 單元命名
      參見單元聲明
  
  3.2 類/接口命名
      參見類/接口聲明
  
  3.3 域/字段命名
      使用駝峰式格式。以大寫的"F"開始,並且在private中聲明所有的數據,使用屬性或獲取者(getter)和安裝者(setter)來提供公共的存取操作。例如:使用名字GetSomething來命名一個返回內部域/字段值的函數,使用SetSomething來命名一個設置域/字段值的過程。
      不要在const段全部使用大寫,除非是頭文件翻譯的需要。
      Delphi是在加利福尼亞開發的,所有我們阻止記號的使用,除非是頭文件翻譯的需要。
  正確:
    FMyString: string;
  不正確:
    lpstrMyString: string;
      當然在枚舉類型定義中保留了匈牙利命名法:
      TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp,
        bkYes, bkNo, bkClose, bkAbort, bkRetry,
        bkignore, bkAll);
      在這種情況下字符bk被插入到這個枚舉類型的每一個元素前。bk意味著ButtonKind。
      在考慮命名習慣時,要避免使用單個字符的名稱,但零時變量和循環變量除外。
      避免使用"l"(L)變量,因為它和"1"(one)無論在打印機還是在顯示器上都難以分辨。
  
  3.4 方法命名
      方法命名也使用駝峰格式。方法命名習慣同非常量域的命名方法是相同的,但可以從上下文區分它們。方法命名應當強制使用動詞或動詞短語。例如:
  //好的方法命名:
  ShowStatus, DrawCircle, AddLayoutComponent
  //差的方法命名:
  MouseButton //名詞短語,沒有描述功能
  drawCircle //以小寫字母開頭
  add_layout_component //使用了下劃線
  
  //以下方法的功能不夠明確。它是開始運行一個服務呢(更好:StartServer)還是判斷一個服務是否在運行(更好:IsServerRunning)?
  ServerRunning //動詞短語,但不是命令
      一個獲取或者設置一些類屬性的方法應當分別被稱為GetProperty或者SetProperty,Property代表該屬性的名稱。例如:
  GetHeight, SetHeight
      一個測試類的布爾屬性的方法應當被命名為IsVisible,Visible代表屬性的名稱。例如:
      IsResizable, IsVisible
  
  3.5 局部變量命名
      除了不使用"F"外,局部變量的命名規則同域/字段的命名規則一樣。參見3.3節。
  
  3.6 保留字
      保留字和指示符要全部小寫。這有時有些混亂。例如:Integer是一個標識符,並且以首字母大寫出現。而string保留字則全部小寫。
  
  3.7 類型聲明
      所有類型名稱聲明以字母T開始,接下來和類的命名相同。
  
  4.0 空白用法
      4.1 空白行
          空白行可以通過將邏輯相關的代碼段分組來提高可讀性。一個空白行也可以在下列地方使用:
          在版權注釋塊之後,包聲明(package),導入段(import)。
          類聲明之間。
          方法聲明之間。
      4.2 空格
          Object Pascal是一種非常清晰易讀的語言。通常,你不需要在代碼裡加入很多空格來分隔行。以下幾條提供了一些原則該如何使用空格:
              4.2.2 不應當使用空格:
                  在方法名和左括號之間;
                  在.(dot)操作符之前或之後;
                  在一元操作符和它的操作數之間;
                  在一個類型和被它強制轉換的表達式之間;
                  在左括號之後和右括號之前;
                  在左方括號之後和右方括號之前;
                  在一個封號前;
                  例如:
                  //正確用法:
                  function TMyClass.MyFunc(var Value: Integer);
                  MyPointer := @MyRecord;
                  MyClass := TMyClass(MyPointer);
                  MyInteger := MyIntegerArray[5];
                  //錯誤用法:
                  function TMyClass.MyFunc( var Value: Integer ) ;
                  MyPointer := @ MyRecord;
                  MyClass := TMyClass ( MyPointer ) ;
                  MyInteger := MyIntegerArray [ 5 ] ;
  
  4.3 縮進
      你應當總是為所有的縮進層次縮進兩個空格。換句話說就是,第一層縮進兩個空格,第二層縮進四個空格,第三層縮進六個空格……。不要使用制表符Tab。
      當然,仍然有少量的例外。保留字象unit, uses, type, interface, implementation, initialization 和finalization總是頂格的。單元的最後一個end標識符也是頂格的。在項目文件中,program和主begin、end也是頂格的。在主begin..end塊內則需要縮進至少兩個空格。
  
  4.4 續行
      行應當限制在80列以內。超過80列的行應當被分成多個連續的行。所有的後續行應當排列在該聲明的第一行之後,並且縮進兩個字符的空格。
      例如:
  //正確:
  

  
  function CreateWindowEx(dwExStyle: DWord;
    lpClassName: PChar; lpWindowName: PChar;
    dwStyle: DWord; X, Y, nWidth, nHeight: Integer;
    hWndParent: HWND; hMenu: HMENU; hInstance: HINST;
    lpParam: Pointer): HWND; stdcall;
  
  if ((X = Y) or (Y = X) or
    (Z = P) or (F = J) then
  begin
    S := J;
  end;
  

  

      不要在參數和它的類型之間換行,除非列表是由逗號分隔,那樣的話要在最後一個參數前換行,這樣類型名就在下一行開頭了。冒號和它的變量之間不應該有空格,而冒號和類型名之間要有一個空格。
  //正確:
  procedure Foo(Param1: Integer; Param2: Integer);
  
  //錯誤:
  procedure Foo( Param :Integer; Param2:Integer);
      一個後續行不應以一個二進制操作符開始。避免在通常不出現空白的地方割斷一行,比如在方法名和它的左括號之間,或者在一個數組名和它的左方括號之間。如果你必須在上述情況下割斷行,那麼應當在左括號或左方括號之後換行。不要把begin放在其它代碼的同一行。
  例如:
  //錯誤:
  

  
  while (LongExpression1 or LongExpression2) do begin
    //DOSomething
    //DOSomethingElse;
  end;
  

  

  
  
  //正確
  

  
  while (LongExpression1 or longExpression2) do
  begin
    //DOSomething
    //DOSomethingElse;
  end;
  
  if (LongExpressiong1) or
    (LongExpression2) or
    (LongExpression3) then
  

  

  
  
  
  5.0 注釋
      Object Pascal語言支持兩種注釋:塊和單行注釋。以下是一些注釋用法原則:
      ·在單元頂部放置注釋用以解釋單元的用途是有益的
      ·在類聲明前放置注釋是有益的
      ·在方法聲明前設置注釋是有益的
      ·避免語句含義明顯的注釋
          i := i + 1; //Add one to i
      ·記住,容易誤解的注釋比沒有注釋更加有害。
      ·避免在注釋裡放入看上去要失效的信息
      ·避免在注釋的邊框裡嵌入星號或其他的排版符號
      ·零時的注釋,即需要被改變或刪除的注釋,要在他們之前加上"???:"標記,這樣易於查找。從觀念上來說,所有的零時注釋都應當在程序發布前刪除。
      // ???: Change this to call Sort when it is fixed
      List.MySort;
  
  
  5.1 塊注釋
      Object Pascal支持兩種類型的塊注釋。最常用的是一對花括號{}括起來的注釋。Delphi小組盡可能的保持該注釋少而簡單。例如:你應當避免在你的注釋裡使用星號來創建圖案或行。相反,使用空格來分隔你的注釋,就象你在字處理文檔裡做的一樣。你的注釋裡的單詞應當在第一個花括號的同一行開始,就象下面從DsgnIntf.pas中摘錄的一樣:
  
  { TPropertyEditor
    Edits a property of a component, or list of components,
    selected into the Object Inspector. The property
    editor is created based on the type of the
    property being edited as determined by the types
    registered by...
    etc...
      GetXxxValue
        Gets the value of the first property in the
        PropertIEs property. Calls the appropriate
        TProperty GetXxxValue method to retrIEve the
        value.
      SetXxxValue Sets the value of all the propertIEs
        in the PropertIEs property. Calls the appropriate
        TProperty SetXxxxValue methods to set the value. }
      塊注釋通常被用在版權注釋中。也被用來注釋掉一些代碼行。
      用於解釋方法的用途的塊注釋應當被訪在方法的聲明前面。
      例如:
  // CORRECT
  
  { TMyObject.MyMethod
    This routine allows you to execute code. }
  
  procedure TMyObject.MyMethod;
  begin
  end;
  
  // INCORRECT
  
  procedure TMyObject.MyMethod;
  {******************************************************
    TMyObject.MyMethod
    This routine allows you to execute code.
  *******************************************************}
  begin
  end;
      第二種塊注釋包含了兩個字符,括號和星號:(* *)。這有時被稱為星括號注釋。這些注釋一般只在代碼開發時有用,它的主要好處是允許嵌套注釋,注釋嵌套少於兩層。Object Pascal不支持同類型的注釋嵌套,因此事實上只有一層嵌套:花括號在星括號裡面,或者星括號在花括號裡面。 只要在你不嵌套它們時,在該類型的注釋中的其它類型的標准Pascal注釋將被忽略。因此,你可以使用該語法注釋一大塊既有代碼又有注釋的代碼:
  
  (* procedure TForm1.Button1Click(Sender: TObject);
  

  
  begin
    DoThis; // Start the process
    DoThat; // Continue iteration
    { We need a way to report errors here, perhaps using
      a try finally block ??? }

    CallMoreCode; // Finalize the process
  end; *)
  

  

      在本例中,整個Button1Click方法被注釋掉了,包括其中的任何子注釋。
  
  5.2 單行注釋
      單行注釋由注釋符//及其引導的文本組成,在文本和注釋符之間有一個空格。單行注釋同代碼在不同行的,要同代碼有相同的縮進層次。你可以使用多個單行注釋形成大的注釋。
      在單行注釋或注釋組之前要有一個空行,除非它是一個塊的第一行。如果注釋用於幾條語句,那麼注釋和注釋組之後要跟一個空行。如果注釋僅解釋它後面的一行聲明,則不必跟一個空行。
  例如:
  // Open the database
  Table1.Open;
      單行注釋也可以跟在他們解釋的代碼聲明後面。這類注釋有時被引用為跟蹤注釋。在他們和代碼之間至少要有一個空格。如果有多個跟蹤注釋在一個代碼塊中同時出現,那麼這些注釋需要被對齊。
  例如:
  

  
  if (not IsVisible) then
      Exit; // nothing to do
  Inc(StrLength); // reserve space for null terminator
  

  

      要避免對每行可執行代碼進行跟蹤注釋。在一個方法或函數的begin..end塊之間限制使用注釋、甚至讓其為空,則在通常情況下是最好的。長的注釋可以出現在方法、函數的定義之前的塊注釋當中。
  
  類
  6.1 類體的組織
      類體的組織應當遵循下列順序:
      ·域/字段聲明
      ·方法聲明
      ·屬性定義
      域/字段、屬性、方法應當按它們的名稱進行字母索引排列。
      6.1.1 存取級別
          除了由IDE生成的代碼,類的范圍指示符應當按以下順序:
          ·private 聲明
          ·protect聲明
          ·public聲明
          ·published聲明
          在Object Pascal中,類成員有四種存取級別:發布的、公開的、受保護的和私有的--按存取能力遞減的順序排列。默認的存取級別是published。一般,一個成員應當被賦予最合適它的最低的存取級別。例如:只能在同一單元中被其他類存取的成員就應當被聲明為私有的。同時,聲明低存取級別的成員也給了編譯器提高優化的機會。當然,另一方面,使用低存取級別對子類的擴展造成了困難。如果有理由認為某個類在將來某個時候會被子類化,那麼應當將那些需要被子類繼承擴展的成員聲明為受保護的,用於存取私有數據的屬性也可以提供這方面的保護。
          你應當禁止對數據的公開存取。數據通常在private段聲明,任何對他的公開存取應當通過GetXXX、SetXXX方法或屬性來操作。
      6.1.8 構造函數聲明
          方法需要按字母索引排列。將構造函數和析構函數放在public段的開始或按照字母索引排列都是正確的。
          如果有多個構造函數或你使用了多個相同的名字,那麼應當根據形參列表來排列,參數少的在參數多的前面。這意味著如果存在沒有參數的構造函數的話,那麼它必定出現在第一個。為了和C++Builder保持最好的兼容,應當保證構造函數的參數列表的唯一性。C++不是根據構造函數的名稱來調用它的,所以區別多個構造函數的唯一方法是通過它的參數列表。
  
  6.2 方法聲明
      如果可能,方法聲明要出現在單獨一行上。
  例如:
  Examples:
  
  

  
  procedure ImageUpdate(Image img, infoflags: Integer,
    x: Integer, y: Integer, w: Integer, h: Integer)
  
  

  

  
  7.0 接口
      接口的聲明與類的聲明有相同的形式:
  

  
    InterfaceName = interface([inherited Interface])
      InterfaceBody
    end;
  

  

    接口聲明應當被縮進兩格,接口體縮進四格,end結束符縮進兩格。
    在接口聲明中沒有域/字段。但屬性可以出現。
    所有的接口方法天生就是公開的和抽象的,用不著在接口聲明中包含此類關鍵字。
    除非有其他的注意事項,否則接口的聲明同類的聲明具有相同的風格。
  
  7.1 接口體組織
      接口體的組織可以按以下的順序:
      ·接口方法聲明
      ·接口屬性聲明
      接口方法和屬性的聲明和類具有相同的風格。
  
  8.0 聲明
      聲明是由封號結尾的一行或幾行代碼。單一聲明只有一個封號,復合聲明中有多個封號。
  //這是單一聲明:
  A := B;
  
  //這是復合聲明:
  

  
  begin
    B := C;
    A := B;
  end;
  

  

      8.0.1 單一聲明
          如果需要將一個單一聲明換行,則需要參照上一行縮進兩格。
  //例如:
  

  
  MyValue :=
    MyValue + (SomeVeryLongStatement / OtherLongStatement);
  

  

  
  
  8.1.1 賦值和表達式聲明
  每一行最多有一條聲明。
  例如:
  

  
  a := b + c; Inc(Count); //錯誤
  a := b + c; //正確
  Inc(Count); //正確
  

  

  
  
  8.1.2 局部變量聲明
      局部變量也使用駝峰格式,不要使用引導符"F",這是為類聲明中域/字段保留的。
  例如:
  

  
  var
    MyData: Integer;
    MyString: string;
  

  

      你可以在同一行聲明多個類型相同的變量:
  

  
  var
    ArraySize, ArrayCount: Integer;
  

  

      這種聲明習慣在類聲明中是不提倡。
  
  8.1.3 數組聲明
      通常總是在左方括號之前和右方括號之後放置一個空格:
  

  
  type
    TMyArray = array [0..100] of Char;
  

  

  
  
  8.2.3 if語句
      if語句至少要以兩行的形式出現:
  例如:
  //錯誤:
  

  
  if A = B then DOSomething;
  

  

  
  //正確
  

  
  if A = B then
    DOSomething;
  

  

      如果是復合的if語句,則應當每個分隔符一個新行:
  //錯誤:
  

  
  if A = B then begin
    DOSomething;
    DOSomethingElse;
  end else begin
    DoThis;
    DoThat;
  end;
  

  

  
  //正確
  

  
  if A = B then
  begin
    DOSomething;
    DOSomethingElse;
  end
  else
  begin
    DoThis;
    DoThat;
  end;
  

  

      以下的少數變化可以被采用:
  //正確
  

  
  if Condition then
  begin
    DoThis;
  end else
  begin
    DoThat;
  end;
  

  

  
  
  //正確
  

  
  if Condition then
  begin
    DoThis;
  end
  else
    DOSomething;
  

  

  
  
  //正確
  

  
  if Condition then
  begin
    DoThis;
  end else
    DOSoemthing;
  

  

  
  
  //下面的方式可能不被關心,但卻是值得贊揚的:
  

  
  if Condition then
    DoThis
  else DoThat;
  

  

  
  
  8.2.4 for語句
  Example:
  // INCORRECT
  

  
    for i := 0 to 10 do begin
      DOSomething;
      DOSomethingElse;
    end;
  

  

  
  
  // CORRECT
  

  
    for i := 0 to 10 do
    begin
      DOSomething;
      DOSomethingElse;
    end;
  

  

  
  
  8.2.5 while 語句
  Example:
  // INCORRECT
  

  
    while x < j do begin
      DOSomething;
      DOSomethingElse;
    end;
  

  

  
  
  // CORRECT
  

  
    while x < j do
    begin
      DOSomething;
      DOSomethingElse;
    end;
  

  

  
  
  8.2.6 repeat until 語句
  Example:
    // CORRECT
  

  
    repeat
      x := j;
      j := UpdateValue;
    until j = 25;
  

  

  
  
  8.2.7 case 語句
  Example:
  // CORRECT
  

  
    case Control.Align of
      alLeft, alNone: NewRange := Max(NewRange, Position);
      alRight: Inc(AlignMargin, Control.Width);
    end;
  
  

  

    // CORRECT
  

  
    case x of
      CSStart:
        begin
          j := UpdateValue;
        end;
      csBegin: x := j;
      csTimeOut:
        begin
          j := x;
          x := UpdateValue;
        end;
    end;
  

  

    // CORRECT
  

  
    case ScrollCode of
      SB_LINEUP, SB_LINEDOWN:
        begin
          Incr := FIncrement div FLineDiv;
          FinalIncr := FIncrement mod FLineDiv;
          Count := FLineDiv;
        end;
      SB_PAGEUP, SB_PAGEDOWN:
        begin
          Incr := FPageIncrement;
          FinalIncr := Incr mod FPageDiv;
          Incr := Incr div FPageDiv;
          Count := FPageDiv;
        end;
    else
      Count := 0;
      Incr := 0;
      FinalIncr := 0;
    end;
  

  

  
  
  
  8.2.8 try 語句
  
  // Correct
  

  
    try
      try
        EnumThreadWindows(CurrentThreadID, @Disable, 0);
        Result := TaskWindowList;
      except
        EnableTaskWindows(TaskWindowList);
        raise;
      end;
    finally
      TaskWindowList := SaveWindowList;
      TaskActiveWindow := SaveActiveWindow;
    end;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved