通用源码格式规范
1.缩进
    每层缩进两个空格,但不要把tab字符存入源文件,tab的宽度是可变的。选择      Environment Options 对话框,把 "Use tab character" 和 "Optimal fill" 检查   框关掉。
2.页边距
     设为80字符,一般情况下代码不会有这么宽,如果一行代码过长,可以在逗号或者   其他操作符后面换行并缩进两个空格。 3、Begin..End 对
  begin 语句应单独占用一行,但作为else字句的一部分时例外。
  end 语句也应独占一行,这样只要不是在else中,end总是与begin对齐。 
三、Object Pascal语言
1.括号
在括号与其后续或前置字符之间不要留有空格,不要使用多余的括号,如: if     (I = 42) then 
2.保留字与关键字应该全部使用小写
3.过程与函数
  首字母及各个独立单词的首字母应大写以方便阅读。    ThisIsMuchMoreReadableRoutineName;名字与功能应相符,执行某项操作的程序段应    以相应的动词开始: FormatHardDrive;赋值的过程应以set开始:
     procedure  SetUserName;
    取值的过程以get开始: function GetUserName: string;
4.形式参数
类型相同的形参合并声明:procedure Foo(Param1, Param2, Param3: Integer;    Param4: string);
命名应有意义,与实参的标志符一致,建议加上前缀A,这样做的另一个好处是   可以与同名的类属性区分开。
   procedure SomeProc(AUserName: string; AUserAge: integer);
参数的顺序:使用频率高的参数放在前面,输入数据的参数放在输出数据的参数   前面,所指范围广的参数放在范围小的前面,与中文信封的格式类似。有一个例外,   事件处理程序的声明中Tobject类型的Sender参数总是第一个。 
5.常量:
如果过程中不改变记录类型、数组类型、短字符串类型或者接口类型的值,应将  其声明为const,这样可以提高程序的执行效率。尽管其他类型参数声明为const并不能  提高效率,但可以为调用的代码提供更多的参数信息。 
6.重名:
如果在两个单元声明了两个同名的函数,另外的单元调用时,其uses语句中位置  靠后的单元所包含的函数将被使用。避免这种分歧的方法是在函数的前面写上它的单元  名。如SysUtils.FindClose(SR); or Windows.FindClose(Handle); 
7.变量
  7.1变量的命名与格式
变量的命名应该与设置变量的目的相符,循环控制变量可以使用简单的单字符命    名,比如I,J,K等。布尔变量的命名应该清楚的表明值为true或者false时的含义。
  7.2局部变量在过程内部与临时变量一起声明。
如果有必要,局部变量的初始化在过程的开始立即执行。Ansistring类型局部变    量自动初始化为空串;接口或显示接口类型的局部变量自动初始化为nil,Variant和    OleVariant类型的局部变量自动初始化为Unassigned。
8.使用全局变量
不鼓励使用全局变量,如果确有必要,则把他们放在需要的地方,比如说一个变    量可能只是在某个单元的代码部分具有全局性。如果在几个单元内使用,就把它放在    一个单独的单元。
全局变量可以在var小节直接初始化。应该牢记全局化变量自动置空,一个原因   是空的全局变量在exe文件中不占用空间,而是保存在一个虚拟的数据段,只有在程序   执行时才分配内存,非空的全局变量将保存在磁盘上。
9.类型
  9.1概述
作为保留字的类型名全为小写,而Win32 API的类型全是大写,其他的类型名应     遵循连接库内的书写习惯。
  var
    MyString: string;   // reserved word
    WindowHandle: HWND; // Win32 API type
    I: Integer;         // type identifier introduced in System unit  9.2浮点类型
避免使用Real类型,它的存在只是为了兼容旧的Pascal版本;建议使用double     ,如果需要更大或更小的数字使用Extended,另外还可以使用single。
  9.3枚举类型
枚举类型的命名应该富有意义,以T开头说明这是定义的类型,枚举元素前加上     2-3个小写字符的前缀标明从属的类。
     TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal,            stRB);
      枚举变量一般与类型同名,只是没有T前缀。
10.Variant and OleVariant
    只有在运行时期不能确知数据类型的情况下才使用这两种变量。基于COM的程序中使用OleVariant,其他情况使用Variant变量,因为OleVariant把所有的字符串都进行转化(WideChar String)以适应COM的要求,而Variant直接使用原生的字符串。
11.结构类型
  11.1数组
声明数组类型同样需要T前缀,如果声明了指向数组类型的指针( P前缀),应  紧随其后声明相应的数组类型,如:
  type
  PCycleArray = ^TCycleArray;
  TCycleArray = array[1..100] of integer;
数组变量与其类型同名。
  11.2记录类型
与数组相似,如:
  type
    PEmployee = ^TEmployee;
    TEmployee = record
      EmployeeName: string
      EmployeeRate: Double;
    end;12.流程语句Statements
  12.1 if语句
最可能执行的程序段放在then分句中,其他的放入else分句
如果需要多次使用if语句,考虑case语句;
如果if嵌套超过5层,应考虑算法;
避免不需要的括号
多重判断条件,计算简单的放在前面。
  12.2 case语句
   各个分句应按字母或者数字排序;
   每个分句尽量简洁,不应超过5行语句,否则单独编制函数;
   else分句仅用于缺省情况或者检查错误;
  12.3 while语句
避免使用exit中断循环,而放入循环条件;
循环变量应在进入循环语句前初始化,而不要被无关的语句隔开;
循环的扫尾工作应在循环结束后立即执行。
  12.4 for语句 循环次数已知时替代while  12.5 repeat语句
  12.6 with语句
    避免滥用with语句,不可在一个with结构中使用多个对象with Record1, Record2 do
13.结构化例外处理
    例外处理用于修正错误、保护资源,只要程序中分配了资源,就应该使用   try...finally来保证资源的回收,除非在initialization/finalization中分配和释   放资源或者使用具有析构函数的对象。
  13.1 使用try..finally
     SomeClass1 := TSomeClass.Create
     SomeClass2 := TSomeClass.Create;
     try
  { do some code }
     finally
  SomeClass1.Free;
  SomeClass2.Free;
     end;
     更好的办法是:
     SomeClass1 := TSomeClass.Create
     try
  SomeClass2 := TSomeClass.Create;
  try
    { do some code }
  finally
    SomeClass2.Free;
  end;
     finally
  SomeClass1.Free;
     end;
   13.2 使用try..except
如果希望发生例外时指向某项任务,而不是简单显示错误信息,可以使用     try..except结构,当需要在任务完成后再调用缺省的例外处理时,应重新引发例外
   13.3 避免使用try..except..else
14.类Classes
   14.1字段Fields与普通变量定义相似,只是以F开始。 所有的字段都是私有的,如果    需要在类定义范围外使用,选择property
   14.2方法的定义与普通的过程类似,把方法定义为静态的可以防止在子类中被重载。    虚拟方法virtual只有被子类重载后才能执行;动态dynamic方法适用于拥有多个子类     并被重载的方法,以减少内存的占用。抽象abstract方法只能在永远不会创建实例的    基类base class内使用。
   14.3存取属性的方法Property Access Methods
      所有的存取方法都在类定义的private或者protected小节内声明,属性的存取   access方法遵循普通过程的规则。读方法(reader method)必须使用前缀“get”,   写方法(writer method)使用前缀“set”。写方法的形参只有一个,名为Value,类   型就是它所指称的属性的类型,例如:
   TSomeClass = class(TObject)
   private
  FSomeField: Integer;//声明字段以F为前缀
  protected
     function GetSomeField: Integer;//读方法不带参数的函数,其类型为相应字段的     类型
     procedure SetSomeField( Value: Integer);//写方法带有一个参数
  public
    property SomeField: Integer read GetSomeField write SetSomeField;//属性声    明
  end; //从读方法(函数)接受数据,通过写方法将值写入字段  14.4属性
      作为自由字段存取器(如上例)的属性与字段同名而没有F前缀。属性名应该用名   词,而不是动词。属性代表数据,方法代表操作。成组属性名应该用复数,普通属性   名用单数。尽量避免使用代表私有字段的属性的写方法。
四、文件Files
1. 工程文件
    使用描述性的名称,如The Delphi 4 Developer's Guide Bug Manager is given    the project name: DDGBugs.dpr. A system information program will be given a    name like SysInfo.dpr.
2. 窗体文件(Form Files)
    使用描述性的命名,并以Frm为后缀,如The About Form will have a filename of    AboutFrm.dpr. The Main Form will have the filename MainFrm.dpr. 
3. 数据模块文件(Data Module Files)
    以DM为后缀,如the Customers data module will have a form filename of    CustomersDM.dfm. 
4. 远程数据模块文件(Remote Data Module Files)使用后缀RDM 
5. 单元文件(Unit Files)的结构
  5.1 单元名,如MainFrm.pas
  5.2 引用字句,引用的单元列表
  5.3 界面小节,包括所有可以为其它单元引用的类型、变量、过程函数声明
  5.4 执行小节,声明私有的类型、变量、过程函数并定义所有的过程与函数
  5.5 初始化小节,不要把对事件敏感的代码放入此节,否则程序启动时非常迟缓
  5.6 结束小节,释放所有在初始化小节分配的资源
6. 通用单元
    命名应富有意义如: a utilities unit will be given a name of     BugUtilities.pas. A unit containing global variables will be given the name   of CustomerGlobals.pa

解决方案 »

  1.   

    2. 数据模块Data Modules
        2.1 类命名规范
          以T为前缀, DataModule为后缀TcustomerDataModule,TOrdersDataModule 
        2.2 实例命名规范
    与类同名,没有前缀T, CustomerDataModule, OrdersDataModule 
    六、包Packages
    1.使用运行时和设计期包
        运行时包应该只包含包内其它控件引用的单元和控件。单元所包含的属性控件和其它    设计期代码放入设计期包。注册单元应放入设计期包。
    2.命名规范
    "iiilibvv.pkg" - design package
    "iiistdvv.pkg" - runtime package
    其中"iii"前缀标明公司、作者等信息;"vv" 标明Delphi的版本信息。使用   "lib"和 "std" 标明运行期或者设计期包,如果同时具有运行期和设计期包,两者应   同名如:
    DdgLib40.pkg - design package
    DdgStd40.pkg - runtime package 
    七、构件Components
    1.自定义控件
         控件类型名应该与"Classes"小节内的名称相同,但使用3个字符的前缀标明公司、   作者等等,例如为Delphi 4 Developer's Guide开发的时钟控件命名为:
       TddgClock = class(TComponent)
       注意前缀应小写
    2.控件单元
    只包含一个主要的控件(从控件板上选取)。
    3.使用注册单元
    控件的注册过程应放入单独的单元,而不是放在控件单元内,用于注册所有的控   件、属性编辑器、控件编辑器等等。控件注册只能放在设计包内。命名规范如下:
         XxxReg.pas
       前缀"Xxx" 标明公司、作者等s
    4.控件实例命名规范
       不要使用缺省的名称,使用前缀标明其类型。
    5.控件前缀标准:
       5.1 通用控件
       mm TmainMenu pm TpopupMenu mmi TmainMenuItem  
       pmi TPopupMenuItem   lbl Tlabel edt Tedit 
       mem Tmemo btn TButton             cb TcheckBox
       rb TradioButton lb TlistBox cb TComboBox
      scb TscrollBar gb TgroupBox rg TradioGroup 
       pnl TPanel           cl TCommandList
    5.2 扩展控件
       bbtn TbitBtn sb TspeedButton me TmaskEdit 
       sg TStringGrid       dg TdrawGrid img Timage 
       shp Tshape bvl TBevel              sbx TscrollBox
       clb TcheckListbox spl Tsplitter stx TStaticText
       cht TChart 
    5.3 Win32 Tab 
       tbc TtabControl pgc TpageControl il TimageList 
       re TRichEdit         tbr TtrackBar   prb TprogressBar 
       ud TupDown hk THotKey              ani Tanimate 
       dtp TdateTimePicker tv TtreeView lv TListView
       hdr TheaderControl stb TstatusBar tlb TToolBar
       clb TCoolBar
    5.3 System Tab 
       tm Ttimer pb TpaintBox mp TmediaPlayer 
       olec TOleContainer   ddcc TDDEClientConv ddci TDDEClientItem 
       ddsc TDDEServerConv  ddsi TDDEServerItem 
    5.4 Internet Tab 
       csk TclientSocket ssk TserverSocket wbd TWebDispatcher
       pp TpageProducer tp TqueryTableProducer dstp TdataSetTableProducer
       nmdt TNMDayTime nec TNMEcho             nf TNMFinger
       nftp TNMFtp nhttp TNMHttp nMsg TNMMsg
       nmsg TNMMSGServ nntp TNMNNTP npop TNMPop3 
       nuup TNMUUProcessor  smtp TNMSMTP nst TNMStrm 
       nsts TNMStrmServ ntm TNMTime             nudp TNMUdp
       psk TpowerSock ngs TNMGeneralServer html THtml
       url TNMUrl sml TSimpleMail
    5.6 Data Access Tab 
       ds TdataSource tbl Ttable qry Tquery 
       sp TStoredProc       db TdataBase ssn Tsession 
       bm TbatchMove usql TUpdateSQL
    5.7 Data Controls Tab 
       dbg TDBGrid dbn TDBNavigator dbt TDBText 
       dbe TDBEdit          dbm TDBMemo dbi TDBImage 
       dblb TDBListBox dbcb TDBComboBox        dbch TDBCheckBox 
       dbrg TDBRadioGroup dbll TDBLookupListBox dblc TDBLookupComboBox
       dbre TDBRichEdit     dbcg TDBCtrlGrid dbch TDBChart
    5.8 Decision Cube Tab 
       dcb TdecisionCube dcq TdecisionQuery dcs TDecisionSource
       dcp TdecisionPivot dcg TdecisionGrid dcgr TDecisionGraph
    5.9 QReport Tab 
       qr TquickReport qrsd TQRSubDetail qrb TQRBand 
       qrcb TQRChildBand    qrg TQRGroup qrl TQRLabel 
       qrt TQRText qre TQRExpr             qrs TQRSysData
       qrm TQRMemo qrrt TQRRichText qrdr TQRDBRichText
       qrsh TQRShape qri TQRImage qrdi TQRDBMImage 
       qrcr TQRCompositeReport qrp TQRPreview   qrch TQRChart
    5.10 Dialogs Tab
        TOpenDialog OpenDialog TSaveDialog SaveDialog
        TOpenPictureDialog OpenPictureDialog
        TSavePictureDialog SavePictureDialog
        TFontDialog FontDialog TColorDialog ColorDialog
        TPrintDialog PrintDialog 
        TPrintSetupDialog PrinterSetupDialog
        TFindDialog FindDialog 
        TReplaceDialog ReplaceDialog
    5.11 Win31 Tab 
       dbll TDBLookupList dblc TDBLookupCombo ts TtabSet
       ol TOutline          tnb TtabbedNoteBook nb TnoteBook
       hdr Theader flb TFileListBox        dlb TdirectoryListBox 
       dcb TDriveComboBox   fcb TFilterComboBox
    5.12 Samples Tab 
        gg Tgauge cg TcolorGrid spb TspinButton
       spe TSpinEdit        dol TdirectoryOutline cal Tcalendar
       ibea TIBEventAlerter
    5.13 ActiveX Tab 
       cfx TchartFX vsp TVSSpell f1b TF1Book 
       vtc TVTChart         grp Tgraph Midas Tab 
       Prefix Component prv TProvider           cds TclientDataSet 
       qcds TQueryClientDataSet                     dcom TDCOMConnection 
       olee TOleEnterpriseConnection                sck TsocketConnection 
       rms TRemoteServer    mid TmidasConnection
      

  2.   

    其实所谓的微软倡导的匈牙利命名法就不错!
    delphi里一样可以用。
      

  3.   

    Delphi通用代码编写规范
    通用源代码格式规则缩格是指在每一级有两个空格。不要在源代码中保留tab字符,这是因为tab字符会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表不同的宽度。可以通过关闭Environment选项对话框中Editor页上的“Use tab character”和“Optimal fill”检查框(通过Tools|Environment)来禁止保存tab字符。2.2 页边空格页边空格会被设置成80字符宽。通常,源码不会超出这个边界,但这个方针会有一些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与前面的语句相连。
    当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。2.3 Begin…End 配对Begin 子句应写在独立的一行,比上一行缩进两个字符,end子句应当与begin子句对齐,尤其应当注意的是:begin和end子句中的代码行也应当与begin和end子句对齐。例如,
    for I := 0 to 10 do        
    begin
    DoSomething;
     end;
    三、Object Pascal3.1 括号永远不要在括号与括号之间的字符中间留下空格。下面的例子示范了错误的与正确地使用括号中的空格:
             CallProc( Aparameter );    //错误
             CallProc(Aparameter);      //正确永远不要在一个语句中使用不必要的括号。括号只应在源代码中需要的地方使用。以下的例子示范了错误和正确的使用:
    if (I = 42) then                    //错误 - 多余的括号
    if (I = 42) or (J = 42) then        //正确 - 需要括号3.2 保留字和关键字Object Pascal 保留字和关键字永远是全部小写。3.3 过程和函数(例程)3.3.1 命名/格式化例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。下面是一个不正确格式的过程名称:
             procedure thisisapoorlyformattedroutinename;下面是一个合适的大小写例程名称的例子:
             procedure ThisIsMuchMoreReadableRoutineName;例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例如:
             procedure FormatHardDrive;一个用于设置输入参数的例程应以单词set作为前缀,例如:
             procedure SetUserName;一个用来接收某个值的例程应以单词get作为前缀,例如:
             procedure GetUserName : string;3.3.2 形式参数3.3.2.1 格式化如果有的话,相同类型的形参应合并在一个语句中:
      procedure Foo(Param1, Param2, Param3 : Integer; Param4 : string);3.3.2.2 命名所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标志符的名称为基础。一个好的参数名称应以字符A为前缀 - 例如:
      procedure SomeProc(AuserName : string; AuserAge : integer);“A”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。3.3.2.3 参数的排序下面的形参的顺序重点说明了注册者调用约定调用的好处。- 最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。
    - 输入参数列表应放在输出参数列表的左边。
    - 将通用的参数放在特殊参数的左边,例如:
          procedure SomeProc(Aplanet, AContinent, Acountry, Astate, Acity)
    - 排序有可能有些例外,比如事件的处理。类型为TObject的Sender参数经常放在第一位。3.3.2.4 常量参数当一个参数为记录型、数组类型、ShortString、或接口类型并且在例程中不被改变时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的参数的代码。而例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高效率,这将会给调用例程的使用者提供更多的信息。3.3.2.5 名称的冲突当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在uses子句中排在后面的单元中的例程将会被调用。为了解决这种“在uses子句上的模糊”冲突,要在调用该例程时写上相关的单元的前缀,例如:
            sysUtile.FindClose(SR);

            windows.FindClose(Handle);3.4 变量3.4.1 变量的命名和格式变量的命名应以使用它们的目的相符循环控制变量应采用一个单独的字符作为名字,比如 I,J,或K,也可以采用更加有意义的名字,比如 UserIndex。逻辑变量的名字应能充分表达准确的真或假的意思。3.4.2 局部变量一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。如果必须的话,在一进入例程就应初始化局部变量。局部的AnsiString变量会自动初始化为一个空的字符串。
    局部接口和派分接口类型变量将会自动初始化为nil,并且局部变数和ole变数类型变量会自动初始化为Unassigned3.4.3 全局变量的使用使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例如,一个全局变量只应在一个单元的implemntation部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。全局变量可以在var子句中直接初始化为一个值。记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如 0、nil、’’、Unassigned、等等。这样做的一个理由是因为零-初始化的全局数据在exe文件中不会占据任何空间。零-初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。非零-初始化的全局数据在硬盘的exe文件占用空间。3.5 类型3.5.1 大写约定如果类型的名字是保留字,那么它应全部小写。Win32 API类型通常全部大写,并且你必须遵循在Windows.pas或其他API单元中的详细类型名称的约定。对于其他变量名字,地一个字母应为大写,而其他字母应错落有致。下面是一些例子:
          var
            MyString : string;          //保留字
            WindowHandle : HWND;        //Win32 API 类型
            I : Integer;                //在System单元中引进的类型标识符3.5.1.1 浮点指针类型不推荐使用Real类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通常情况下用Double来实现浮点指针的需要。并且,Double对处理器和总线而言是做了最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Double所定义的范围时才使用Extended。Extended是intel定义的类型且在Java中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用Single。(比如当使用另一种语言的DLLs时)。3.5.1.2 枚举类型枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚举类型的名字 - 例如:
            TsongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
    一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。3.5.1.3 变数和ole变数类型通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形多出现在COM和数据库开发中。Ole变数使用在以COM为基础的编程中例如自动化和ActiveX控制,而变数使用在非COM的编程中,这是因为变数可以十分有效地存储本地Delphi字符串(同一个字符串变量一样),但Ole变数会将所有的字符串转换为Ole字符串(WideChar 字符串)并且并不实例运算 - 它们永远拷贝。3.5.2 结构类型3.5.2.1 数组类型数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如:
            type
              PCycleArray = ^TCycleArray;
              TCycleArray = array[1…100] of integer;
    在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。3.5.2.2 记录类型记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀T。如果要声明该记录类型的指针,就应加以前缀P并且应紧靠在类型声明的前面声明。例如:
            type
              PEmployee = ^TEmployee;
              TEmployee = record
                EmployeeName : string;
                EmployeeRate : Double;
              end;3.6 语句3.6.1 if 语句在if/then/else语句中最常发生的行为应放在then子句中,而其它发生可能性较小的行为应放在else子句中。尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能。不要使用if嵌套超过五级深度。应使代码编写得更加清晰、明了。不要在if语句中使用不必要的圆括号。如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语句中的排列应是:
             if 条件1 and 条件2 and 条件3 then3.6.2 case 语句3.6.2.1 一般性话题在一个case语句中的各个独立的单元应以数字或字母顺序排列。每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。Case语句中的else子句只有当需要缺省行为或处理错误时才使用。3.6.2.2 格式case语句应遵循其它结构的缩格和命名约定。3.6.3 while 语句在一个while语句中不建议使用exit过程来跳出循环,尽量仅使用循环条件来跳出循环。在一个while循环中所