Delphi 程序员代码编写标准指南 (三)

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所定义的范围时才使用ExtendedExtendedintel定义的类型且在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 then

 

3.6.2 case 语句

 

3.6.2.1 一般性话题

 

在一个case语句中的各个独立的单元应以数字或字母顺序排列。

 

每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。

 

Case语句中的else子句只有当需要缺省行为或处理错误时才使用。

 

3.6.2.2 格式

 

case语句应遵循其它结构的缩格和命名约定。

 

3.6.3 while 语句

 

在一个while语句中不建议使用exit过程来跳出循环,尽量仅使用循环条件来跳出循环。

 

在一个while循环中所用的初始化代码应紧靠在进入while循环前面出现而不要被其它不相关的语句隔开。

 

任何结束后的处理应在循环之后立即进行。

 

3.6.4 for 语句

 

for语句只有当循环次数已知的情况下才能取代while语句使用。

 

3.6.5 repeat 语句

 

repeat语句的使用同while语句一样,并且遵循同样的通用方针。

 

3.6.6 with  语句

 

3.6.6.1 一般话题

 

with语句应节省使用,并且带有大量的警告。避免过度使用with语句并且在with语句中小心使用多个对象、记录等等。例如:

         with Record1, Record2 do

这些事情会使程序员感到困惑并难以发现问题所在。

 

3.6.6.2 格式

 

with 语句遵循本文档所说明的命名约定和缩格的格式规则。

 

3.7 结构异常处理

 

3.7.1 一般话题

 

异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个try…finally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的initializition/finalization或一个对象的constructor/destructor中进行资源的分配和释放。

 

3.7.2 try…finally的使用

 

任何情形下,每一次的分配都应跟随一个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;

 

3.7.3 try…except的使用

 

只有当在异常被触发而你想执行一些任务时才使用try…except。通常,你没有必要为了只是简单地在屏幕上显示一个错误信息而使用try…except语句,因为这会被Application对象自动执行。如果你想在except子句中执行完一些任务之后调用缺省的异常处理,使用raise来重新触发异常到下一个句柄。

 

3.7.4 try…except…else的使用

 

try…except中的else子句不建议使用,因为它会打断所有的异常包括那些你没有准备的异常。

 

3.8 类类型

 

3.8.1 命名和格式

 

类类型的名称应符合使用它们的目的。类型名字应加以前缀T以表明这是一个类型的定义 - 例如:

type

  Tcustomer = class(TObject)

类型的实例通常是没有前缀T的类型的名字 - 例如:

var

  Customer :Tcustomer;

注意:查阅“构件类型的命名标准”来获得更多有关构件命名的信息。

 

3.8.2 域

 

3.8.2.1 命名/格式

 

类的域名遵循与变量标识符同样的约定除了它们应以F为前缀,来表明这是一个域的名称。

 

3.8.2.2 可视化

 

所有的域都必需是私有的。想在类的范围之外存取域得通过属性来使用。

 

3.8.3 方法

 

3.8.3.1 命名/格式

 

方法的命名应遵循本文档中有关过程和函数的约定叙述。

 

3.8.3.2 使用静态的方法

 

如果使用一个静态的方法,那么该方法就不能被该类的后代类所继承。

 

3.8.3.3 使用虚拟/动态的方法

 

如果你打算该类的方法能被后代的类所继承就得使用虚拟的方法。只有在该方法有多个继承时(直接的或间接的)才使用动态的方法。例如,一个类类型包含一个可继承的方法,而100个后代类要继承这种方法,那么这个方法就会动态地产生为100个后代类使用的内存。

 

3.8.3.4 使用抽象的方法

 

如果在一个类中使用抽象的方法,该类就不能被创建。只有在那些永远不会被创建的类中使用抽象的方法。

 

3.8.3.5 属性存取方法

 

所有存取类的方法都只能出现在类的privateprotected部分。属性存取方法的命名应遵循过程和函数的约定规则。读取存取方法(方法读取器)必需以单词Get为前缀。写入存取方法(方法写入器)必需以单词Set为前缀。方法写入器的参数的名字应为Value,并且它的类型应是它所操作的属性的类型。例如:

 TSomeClass = class(TObject)

 private

   FsomeField : Integer;

 protected

   function GetSomeField : Integer;

   procedure SetSomeField(Value : Integer);

 public

   property SomeField : Integer read GetSomeField write SetSomeField;

 end;

 

3.8.4 属性

 

3.8.4.1 命名/格式

 

属性如果是表示为一个私有域的存取器的话,那么它的名字应是它们所操作的域的名字除去解释符F。

 

属性的名字应是名词,不是动词。属性表示的是数据,而方法表示的是行为。

 

数组类型的名称应为复数。一般情况下属性的名称应为单数。

 

3.8.4.2 使用存取的方法

 

尽管没有要求,但还是建议尽量少地为一个表示私有域的属性而使用写入存取方法。

 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值