闹鬼 發表於 2021-4-2 11:50:00

Delphi代码规范

<h4 id="1-前言">1. 前言</h4>
<p>https://www.cnblogs.com/coder163/p/9100133.html</p>
<p>本文档主要是为Delphi开发人员提供一个源代码书写标准,以及程序和文件的命名标准,使他们在编程时有一致格式可遵循。这样,每个编程人员编写的代码能够被其他人理解。</p>
<hr>
<h4 id="2-源程序书写规范">2. 源程序书写规范</h4>
<h3 id="21-21通用源代码格式规则"><span style="color: rgba(0, 0, 0, 1)">2.1. 2.1.通用源代码格式规则</span></h3>
<h5 id="22-缩进">2.2. 缩进</h5>
<p>缩进就是每级间有<strong><span style="color: rgba(0, 0, 255, 1)">两个空格</span></strong>。不要在源代码中放置制表符。这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版本控制等)而不同。</p>
<p>通过使用Tools|Environment 菜单,在Environment Options 对话框的General页上,不要选中<strong><span style="color: rgba(0, 0, 255, 1)">Use Tab Character 和Optional Fill 复选框</span></strong>,这样,<span style="color: rgba(255, 0, 0, 1)">制表符就不会被保存</span>。</p>
<h5 id="23-边距">2.3. 边距</h5>
<p>边距设置为80个字符。源代码一般不会因写一个单词而超过边距,但本规则比较灵活。只要可能,长度超过一行的语句应当用逗号或运算符换行。换行后,应缩进两个字符。</p>
<p>begin...end 语句</p>
<p><strong><span style="color: rgba(0, 0, 255, 1)">begin 语句必须单独占一行</span></strong>。例如,下面第一行是错误的,而第二行正确:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> i:=<span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">do</span> <span style="color: rgba(0, 0, 255, 1)">begin</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 错, begin 与f o r 在同一行</span>

<span style="color: rgba(0, 0, 255, 1)">for</span> i:=<span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">do</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 对, begin 在另外一行中</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span></pre>
</div>
<p>&nbsp;</p>
<p>本规则的一个特殊情况是,当begin 为else 语句的一部分时,例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> some statement = <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
. . .
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Some Other Statement;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<ul>
<li>
<h4><span style="color: rgba(128, 128, 128, 1)">注意:end 语句总单独一行。当begin 不为else 语句的一部分时,相应的end 语句与begin 语句的缩进量相同。</span></h4>
</li>
</ul>
<h5 id="24-注释">2.4. 注释</h5>
<p>我们通常使用“{...}”类型的块注释,以前的“(<em>...</em>)”类型的块注释用于临时注释掉暂不使用的代码,从Delphi 2开始支持“//”行注释,如果决定不在支持Delphi 2.0以下的版本,<span style="color: rgba(0, 0, 255, 1)">可以使用“//”注释</span>。</p>
<hr>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><span style="color: rgba(0, 0, 0, 1)">Object Pascal语句格式语句书写规范与用法</span></h2>
<p>&nbsp;</p>
<h5 id="25-括号">2.5. 括号</h5>
<p><strong><span style="color: rgba(0, 0, 255, 1)">在左括号</span></strong>与下一字符之间<strong><span style="color: rgba(0, 0, 255, 1)">没有空格</span></strong>。同样,右括号与前一字符也没有空格。下面的例子演示了正确与不正确的空格。</p>
<div class="cnblogs_code">
<pre>CallProc( Aparameter ); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 错!</span>
CallProc(Aparameter); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 正确!</span></pre>
</div>
<p>&nbsp;</p>
<p>不要在语句中包含多余的括号。在源代码中,括号只有在确实需要时才使用。下面的例子演示了正确与不正确用法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> (I=<span style="color: rgba(128, 0, 128, 1)">42</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 错,括号是多余的</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (I=<span style="color: rgba(128, 0, 128, 1)">42</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (J=<span style="color: rgba(128, 0, 128, 1)">42</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 正确,必须使用括号</span></pre>
</div>
<h5 id="26-保留字和关键字">2.6. 保留字和关键字</h5>
<p><span style="color: rgba(0, 0, 0, 1)">Object Pascal 语言的<strong><span style="color: rgba(0, 0, 255, 1)">保留字</span></strong>和<span style="color: rgba(0, 0, 255, 1)"><strong>关键字</strong></span>总是<span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)">完全的</span></span><strong><span style="color: rgba(0, 0, 255, 1)">小写</span></strong>。</span></p>
<h5 id="27-类型">2.7. 类型</h5>
<h6 id="271-大小写规则">2.7.1. 大小写规则</h6>
<p>类型标识符是保留字,应当全部小写。<strong><span style="color: rgba(0, 0, 255, 1)">Win32 API</span></strong> 类型常常<strong><span style="color: rgba(0, 0, 255, 1)">全部大写</span></strong>,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。对于<strong><span style="color: rgba(0, 0, 255, 1)">其他变量名</span></strong>,<span style="color: rgba(0, 0, 255, 1)">第一个字母应大写,其他字母则大小写交错</span>。下面是一些例子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
MyString: </span><span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保留字</span>
WindowsHandle: HWND; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Win32 API 类型</span>
I: Integer; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在System单元中引入的类型标识</span></pre>
</div>
<h6 id="272-浮点型">2.7.2. 浮点型</h6>
<p><strong><span style="color: rgba(255, 0, 0, 1)">不鼓励使用Real类型</span></strong>,因为它只是为了与老的Pascal代码兼容而保留的。通常情况下,<span style="color: rgba(0, 0, 255, 1)">对于浮点数应当使用Double</span>。<strong><span style="color: rgba(0, 0, 255, 1)">Double可被处理器优化</span></strong>,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。Extend是intel专用的类型,Java不支持。当浮点变量的物理字节数很重要时(可能使用其他语言编写DLL),则应当使用Single。</p>
<p>Variant和OleVariant</p>
<p>一般不建议使用Variant和OleVariant。但是,当数据类型只有在运行期才知道时(常常是在COM和数据库应用的程序中),这两个类型对编程就有必要。当进行诸如自动化<strong><span style="color: rgba(0, 0, 255, 1)">ActiveX控件的COM编程时,应当使用OleVariant</span></strong>;<span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)">而对于</span></span><strong><span style="color: rgba(0, 0, 255, 1)">非COM编程,则应当使用Variant</span></strong>。这是因为,Variant能够有效地保存Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。</p>
<h5 id="28-语句">2.8. 语句</h5>
<h6 id="281-if-语句">2.8.1. If 语句</h6>
<p>在if/then/else语句中,最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。为了避免出现许多if语句,可以使用case语句代替。如果多于5级,不要使用if语句。请改用更清楚的方法。不要在if语句中使用多余的括号。</p>
<p>如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。例如,</p>
<ul>
<li>如果Condition1比Condition2快,Condition2比Condition3快,则if语句一般应这样构造:</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> Condition1 <span style="color: rgba(0, 0, 255, 1)">and</span> Condition2 <span style="color: rgba(0, 0, 255, 1)">and</span> Condition3 <span style="color: rgba(0, 0, 255, 1)">then</span></pre>
</div>
<ul>
<li>&nbsp;如果Condition3为False的机会很大,利用短路估算逻辑,我们也可以将Condition3放在最前面:</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> Condition3 <span style="color: rgba(0, 0, 255, 1)">and</span> Condition1 <span style="color: rgba(0, 0, 255, 1)">and</span> Condition2 <span style="color: rgba(0, 0, 255, 1)">then</span></pre>
</div>
<p>&nbsp;</p>
<h6 id="282-case-语句">2.8.2. case 语句</h6>
<p>概述</p>
<p>case语句中每种情况的常量应当按数字或字母的顺序排列。每种情况的动作语句应当简短且通常不超过4 - 5 行代码。如果动作太复杂,应将代码单独放在一个过程或函数中。Case语句的else子句只用于默认情况或错误检测。</p>
<p>格式</p>
<p>case语句遵循一般的缩进和命名规则。</p>
<h6 id="283-while-语句">2.8.3. while 语句</h6>
<p>建议不要使用Exit过程来退出while循环。如果需要的话,应当使用循环条件退出循环。所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。任何业务的辅助工作都应在循环后立即进行。</p>
<h6 id="284-for-语句">2.8.4. for 语句</h6>
<p>如果循环次数是确定的,应当用for语句代替while语句。</p>
<h6 id="285-repeat-语句">2.8.5. repeat 语句</h6>
<p>repeat语句类似于while循环,且遵循同样的规则。</p>
<h6 id="286-with-语句">2.8.6. with 语句</h6>
<p>概述</p>
<p>with语句应小心使用。要避免过度使用with语句,尤其是在with语句中使用多个对象或记录。例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">with</span> Record1,Record2 <span style="color: rgba(0, 0, 255, 1)">do</span></pre>
</div>
<p>这些情况很容易迷惑编程人员,且导致调试困难。</p>
<p>格式</p>
<p>with语句也遵循本章关于命名和缩进的规则。</p>
<p>结构化异常处理</p>
<p>概述</p>
<p>异常处理主要用于纠正错误和保护资源。这意味着,凡是分配资源的地方,都必须使用try...finally来保证资源得到释放。不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。</p>
<h6 id="287-tryfinally的用法">2.8.7. try...finally的用法</h6>
<p>在可能的情况下,每个资源分配应当与try...finally结构匹配,例如,下面代码可能导致错误:</p>
<div class="cnblogs_code">
<pre>SomeClass1 := TSomeClass.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
SomeClass2 :</span>= TSomeClass.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> do some code </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
SomeClass1.Free;
SomeClass2.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>上述资源分配的一个安全方案是:</p>
<div class="cnblogs_code">
<pre>SomeClass1 := TSomeClass.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
SomeClass2 :</span>= TSomeClass.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
   <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> do some code </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
   SomeClass2.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
SomeClass1.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>&nbsp;</p>
<p><strong>try...except的用法</strong></p>
<p>&nbsp;&nbsp; 如果你希望在发生异常时执行一些任务,可以使用try...except。通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。</p>
<p>try...except...else的用法</p>
<p>&nbsp;&nbsp; 不鼓励使用带else子句的try...except,因为这将阻塞所有的异常,包括你没有准备处理的异常。</p>
<h4 id="3-命名规范">3. 命名规范</h4>
<h5 id="31-过程procedure与函数function">3.1. 过程(Procedure)与函数(Function)</h5>
<p>命名</p>
<p>过程与函数名应当有意义。进行一个动作的过程最好在名称前加上表示动作的动词为前缀。例如:<code>procedure FormatHardDrive;</code></p>
<p>设置输入参数值的过程名应当以Set 为其前缀,例如:<code>procedure SetUserName;</code></p>
<p>获取数值的过程名应当以Get 为其前缀,例如:<code>function GetUserName:string;</code></p>
<h5 id="32-形参">3.2. 形参</h5>
<p>所有形参的名称都应当表达出它的用途。如果合适的话,形参的名称最好以字母a 为前缀,例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span> SomeProc(aUserName:<span style="color: rgba(0, 0, 255, 1)">string</span>; aUserAge:integer);</pre>
</div>
<p>当参数名与类的特性或字段同名时,前缀a 就有必要了。</p>
<h5 id="33-命名冲突">3.3. 命名冲突</h5>
<p>当两个单元中含有相同名称的过程时,如果调用该过程,实际被调用的是Uses 子句中较后出现的那个单元中的过程。为避免这种情况,可在方法名前加想要的单元名,例如:</p>
<p style="margin-left: 30px"><code>SysUtils.FindClose(SR);</code></p>
<p style="margin-left: 30px"><code>或Windows.FindClose(Handle);</code></p>
<h5 id="34-变量variable"><span style="color: rgba(0, 0, 0, 1)">3.4. 变量(Variable)</span></h5>
<p>变量的名称应当能够表达出它的用途。循环控制变量常常为单个字母,诸如I 、J 或K 。也可以使用更有意义的名称,例如UserIndex。布尔变量名必须能清楚表示出True 和False 值的意义。</p>
<h6 id="341-局部变量">3.4.1. 局部变量</h6>
<p>局部变量遵循其他变量的命名规则。</p>
<h6 id="342-全局变量">3.4.2. 全局变量</h6>
<p><span style="color: rgba(0, 0, 255, 1)"><strong>全局变量</strong></span>以<span style="color: rgba(0, 0, 255, 1)">大写字母“G”打头</span>,并遵循其他变量的命名规则。</p>
<h5 id="35-类型type">3.5. 类型(Type)</h5>
<h6 id="351-枚举型">3.5.1. 枚举型</h6>
<p><strong><span style="color: rgba(0, 0, 255, 1)">枚举类型名</span></strong>必须代表枚举的用途。<span style="color: rgba(0, 0, 255, 1)">名称前要加T字符作为前缀</span>,表示这是个数据类型。枚举类型的标识符列表的前缀应包含2 - 3 个小写字符,来彼此关联。例如:</p>
<div class="cnblogs_code">
<pre>TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);</pre>
</div>
<p><strong><span style="color: rgba(0, 0, 255, 1)">枚举类型</span></strong>的变量<strong><span style="color: rgba(0, 0, 255, 1)">实例</span></strong>的名称与类型相同,<span style="color: rgba(255, 0, 0, 1)"><strong>但没有前缀T</strong></span> ,也可以给变量一个更加特殊名称,诸如:FavoriteSongTypel、FavoriteSongType2等等。</p>
<h6 id="352-数组类型">3.5.2. 数组类型</h6>
<p>数组类型名应表达出该数组的用途。类型名必须加字母“T”为前缀。如果要声明一个指向数组类型的指针,则必须加字母P 为前缀,且声明在类型声明之前。例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
PCycleArray </span>=<span style="color: rgba(0, 0, 0, 1)"> ^TCycleArray;
TCycleArray</span>=<span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">1</span>..<span style="color: rgba(128, 0, 128, 1)">100</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> integer;</pre>
</div>
<p>实际上,<strong><span style="color: rgba(0, 0, 255, 1)">数组类型</span></strong>的变量实例与类型名称相同,<span style="color: rgba(0, 0, 255, 1)">但没有“T”前缀</span>。</p>
<h6 id="353-记录类型">3.5.3. 记录类型</h6>
<p>记录类型名应表达出记录的用途。类型名必须加字母T为前缀。如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
PEmployee </span>=<span style="color: rgba(0, 0, 0, 1)"> ^TEmployee;
TEmployee </span>= <span style="color: rgba(0, 0, 255, 1)">record</span><span style="color: rgba(0, 0, 0, 1)">
   EmployeeName: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
   EmployeeRate: Double;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/karkash/p/14609975.html
頁: [1]
查看完整版本: Delphi代码规范