Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-是否在类中声明?_Delphi_Scope - Fatal编程技术网

Delphi-是否在类中声明?

Delphi-是否在类中声明?,delphi,scope,Delphi,Scope,就在最近,可能是因为我一直在维护一些旧代码,我开始研究我是如何/为什么这样做的。和你一样 我的大多数Delphi编程都是在内部学习的,或者是从分散在web或手册中的示例中学习的。有些事情是因为“我就是这样做的” 我现在想知道的是变量、过程、函数等的声明 使用表单时,我会将所有程序和功能置于公共或私人下。虽然我会尽量避免全局变量和常量,但它们通常会在接口或实现中位于var或const下,具体取决于需要调用它们的位置(偶尔会在公共/私有模式下) 否则,如果它只是一个单元,我将在接口中声明该过程并在实

就在最近,可能是因为我一直在维护一些旧代码,我开始研究我是如何/为什么这样做的。和你一样

我的大多数Delphi编程都是在内部学习的,或者是从分散在web或手册中的示例中学习的。有些事情是因为“我就是这样做的”

我现在想知道的是变量、过程、函数等的声明

使用表单时,我会将所有程序和功能置于公共私人下。虽然我会尽量避免全局变量和常量,但它们通常会在接口或实现中位于varconst下,具体取决于需要调用它们的位置(偶尔会在公共/私有模式下)

否则,如果它只是一个单元,我将在接口中声明该过程并在实现中使用。我最近维护的一些代码没有接口声明,而是在过程之后通过调用将所有内容正确排序

有没有正确的方法可以做到这一点?课堂上有什么应该/不应该去的规则吗?或者这是一种风格/当你开始的时候

编辑以添加

我的问题不是一个过程的声明是否以私有/公共的方式进行,而是一个TForm单元中的所有声明是否都应该以其中一种方式进行。同样,var/const应该在其中一个中吗

进一步澄清

我理解,不在接口中声明,或在公共/私人/etc中声明会影响程序/功能对我的应用程序中其他单元的可见性。
我问题的核心是我为什么不想申报特别是当在一个表单/单元中工作时,在私有空间中放置声明的内容对其他单元不可用要明确得多

干杯
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
    (仅在此类中可见)
  • 如果需要从其他类访问字段,请创建
    public
    属性。这使您可以自由地更改对更复杂的getter/setter方法的简单字段访问,而无需更改类的接口
  • 一切都应该尽可能地本地化。如果
    private
    足够了,就不需要将其设置为
    protected
    (在子类中也可见)。只把那些你真正需要的东西公开
  • 表单:只有那些您希望存储在DFM文件中的内容才应该发布
  • 尽可能多地放在实现部分,尽可能少地放在接口部分。对于
    uses
    子句也是如此

您可能会混淆术语“全局变量”。如果它是在类中声明的,则它不是全局变量(即使已声明
public
)。全局变量(您正确地认为好避免)<强>始终< /强>在<代码> var >代码>节中,无论是在接口还是实现部分(可遵循上面的一般规则)

问题似乎涉及范围。换句话说,事物可以或应该是多么容易接近

一般来说,您希望尽可能地缩小事物的范围,但仍然保持它们的可访问性,以便重用。原因是:

  • 随着系统的增长和变得更加复杂,范围更大的东西更容易访问
  • 因此,它们更有可能以不受控制的方式重复使用
  • (听起来不错)但是当你想要改变的时候,问题就来了,很多东西都使用了你想要改变的东西
  • 在不破坏其他东西的情况下进行更改变得更加困难
话虽如此,数据(变量、常量、类字段、记录属性)和例程(函数、过程、类上的方法)之间也有区别。您可能希望将这些指导原则更严格地应用于数据,因为数据的“奇怪使用”可能会以非常意外和难以调试的方式干扰某些例程

另一件需要记住的事情是全局变量和类字段或记录属性之间的特殊区别:

  • 使用全局变量时,整个应用程序只有一个值
  • 使用类字段或记录属性,类或记录的每个新实例都有自己的值,独立于其他实例
  • 这似乎意味着只要应用程序只需要一件事,就可以使用某种形式的全局变量。然而,正如前面提到的:这不是避免全球化的唯一原因。
    • 就我个人而言,我甚至倾向于避免全球惯例
    • 我经常发现,那些看似正常的事情并不像最初想象的那么普遍。(例如,Delphi VCL声明了一个全局
      屏幕
      对象,我在两个屏幕上工作;我们的许多客户使用4到6个。)
    • 我还发现,将可能是全局的例程与作为类方法的特定类相关联也很有用。它通常使代码更容易理解
因此,从最大范围到最小范围列出这些“位置”,您通常会努力选择列表中较低的位置(尤其是数据位置)

  • 接口全局
  • 全球实施
  • 接口线程变量
  • threadvar的实现
  • 出版(