Delphi-是否在类中声明?
就在最近,可能是因为我一直在维护一些旧代码,我开始研究我是如何/为什么这样做的。和你一样 我的大多数Delphi编程都是在内部学习的,或者是从分散在web或手册中的示例中学习的。有些事情是因为“我就是这样做的” 我现在想知道的是变量、过程、函数等的声明 使用表单时,我会将所有程序和功能置于公共或私人下。虽然我会尽量避免全局变量和常量,但它们通常会在接口或实现中位于var或const下,具体取决于需要调用它们的位置(偶尔会在公共/私有模式下) 否则,如果它只是一个单元,我将在接口中声明该过程并在实现中使用。我最近维护的一些代码没有接口声明,而是在过程之后通过调用将所有内容正确排序 有没有正确的方法可以做到这一点?课堂上有什么应该/不应该去的规则吗?或者这是一种风格/当你开始的时候 编辑以添加 我的问题不是一个过程的声明是否以私有/公共的方式进行,而是一个TForm单元中的所有声明是否都应该以其中一种方式进行。同样,var/const应该在其中一个中吗 进一步澄清 我理解,不在接口中声明,或在公共/私人/etc中声明会影响程序/功能对我的应用程序中其他单元的可见性。Delphi-是否在类中声明?,delphi,scope,Delphi,Scope,就在最近,可能是因为我一直在维护一些旧代码,我开始研究我是如何/为什么这样做的。和你一样 我的大多数Delphi编程都是在内部学习的,或者是从分散在web或手册中的示例中学习的。有些事情是因为“我就是这样做的” 我现在想知道的是变量、过程、函数等的声明 使用表单时,我会将所有程序和功能置于公共或私人下。虽然我会尽量避免全局变量和常量,但它们通常会在接口或实现中位于var或const下,具体取决于需要调用它们的位置(偶尔会在公共/私有模式下) 否则,如果它只是一个单元,我将在接口中声明该过程并在实
我问题的核心是我为什么不想申报特别是当在一个表单/单元中工作时,在私有空间中放置声明的内容对其他单元不可用要明确得多 干杯
Dan根据具体实例,所有可能具有不同值的对象都属于类,即
TDog = class
strict private
FColor : TColor;
FName : String;
public
property Color : TColor read FColor write FColor;
property Name : String read FName write FName;
end;
颜色和名称显然是每只狗的属性(这里每只狗都有其他值)
一般规则:
- 字段属于
(在此类和本单元中可见)或private
(仅在此类中可见)strict private
- 如果需要从其他类访问字段,请创建
属性。这使您可以自由地更改对更复杂的getter/setter方法的简单字段访问,而无需更改类的接口public
- 一切都应该尽可能地本地化。如果
足够了,就不需要将其设置为private
(在子类中也可见)。只把那些你真正需要的东西公开protected
- 表单:只有那些您希望存储在DFM文件中的内容才应该发布
- 尽可能多地放在实现部分,尽可能少地放在接口部分。对于
子句也是如此uses
您可能会混淆术语“全局变量”。如果它是在类中声明的,则它不是全局变量(即使已声明
public
)。全局变量(您正确地认为好避免)<强>始终< /强>在<代码> var >代码>节中,无论是在接口还是实现部分(可遵循上面的一般规则) 问题似乎涉及范围。换句话说,事物可以或应该是多么容易接近
一般来说,您希望尽可能地缩小事物的范围,但仍然保持它们的可访问性,以便重用。原因是:
- 随着系统的增长和变得更加复杂,范围更大的东西更容易访问
- 因此,它们更有可能以不受控制的方式重复使用
- (听起来不错)但是当你想要改变的时候,问题就来了,很多东西都使用了你想要改变的东西
- 在不破坏其他东西的情况下进行更改变得更加困难
- 使用全局变量时,整个应用程序只有一个值
- 使用类字段或记录属性,类或记录的每个新实例都有自己的值,独立于其他实例
- 这似乎意味着只要应用程序只需要一件事,就可以使用某种形式的全局变量。然而,正如前面提到的:这不是避免全球化的唯一原因。
- 就我个人而言,我甚至倾向于避免全球惯例李>
- 我经常发现,那些看似正常的事情并不像最初想象的那么普遍。(例如,Delphi VCL声明了一个全局
屏幕
对象,我在两个屏幕上工作;我们的许多客户使用4到6个。)
- 我还发现,将可能是全局的例程与作为类方法的特定类相关联也很有用。它通常使代码更容易理解
- 接口全局
- 全球实施
- 接口线程变量
- threadvar的实现
- 出版(