德尔福 - 在课堂上宣布与否?

时间:2010-01-22 14:17:15

标签: delphi scope

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

我的大多数Delphi编程都是内部选择,或者是分散在Web或手册中的示例。在某些事情上,只是因为“我就是这样做”

我目前想知道的是变量,程序,功能等声明

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

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

有没有正确的方法呢?课程中应该/不应该有什么规则?或者它是一种风格/什么时候开始的东西?

编辑以添加

我的问题不是关于程序声明是私有/公开的,而是TForm单元中的所有声明是否应该进入其中一个。同样,var / const应该是一个还是另一个?

进一步澄清

据我所知,不在界面中声明,或在public / private / etc中声明会影响我的应用程序中其他单位的程序/功能的可见性。
我的问题的核心是为什么我想宣布? - 尤其是当在私人场所进行表格/单位工作时,更明确的是宣布的东西不可供其他单位使用......

干杯 丹

2 个答案:

答案 0 :(得分:6)

根据具体实例可能具有不同值的所有内容属于类,即

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(在子类中也可见)。并且只从外面制作你真正需要的那些东西{.1}。
  • 表单:只有那些您希望存储在DFM文件中的内容应为public
  • 尽可能多地在实现部分中尽可能多地在接口部分中尽可能多地添加。对于published条款也是如此。

您可能会混淆术语全局变量。如果它在类中声明它不是全局变量(即使声明为uses)。全局变量(你正确认为可以避免)总是进入接口或实现部分的public部分(按照上述一般规则优先选择)

答案 1 :(得分:4)

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

作为一般准则,您希望尽可能减少事物的范围,但仍然可以保持足够的可访问性以便重复使用。原因是:

  • 随着系统的发展和变得越来越复杂,范围更大的内容更容易访问。
  • 因此,他们更有可能以不受控制的方式重复使用。
  • (听起来很棒)但问题出现在你想要做出改变的时候,很多东西都用你要改变的东西......
  • 在不破坏其他内容的情况下进行更改变得更加困难。

话虽如此,数据(变量,常量,类字段,记录属性)和例程(函数,过程,类上的方法)之间也存在区别。您需要更严格地将指南应用于数据,因为“奇怪使用”数据可能会以极其意外且难以调试的方式干扰您的某些例程。

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

  • 使用全局变量,整个应用程序只有一个'值'(松散使用的术语)。
  • 使用类字段或记录属性,类或记录的每个新实例都有自己独立于其他实例的值。
  • 这似乎意味着,只要您的应用程序只需要一件事,您就可以使用某种形式的全局形式。但是,如前所述:这不是避免全局变量的唯一原因。
    • 我个人甚至倾向于避免全球惯例。
    • 我经常发现那些似乎没有被宣布为全球化的东西并不像最初想象的那样普遍。 (例如Delphi VCL宣布一个全局Screen对象,我在2个屏幕上工作;我们的许多客户使用4到6个。)
    • 我还发现将可能已全局的例程与特定类关联为类方法非常有用。它通常使得理解代码变得更容易。

因此,将这些“位置”从最大范围列为最小范围,您通常会努力选择列表中较低的位置(尤其是数据)。

  • interface global
  • 实施全球
  • interface threadvar
  • 实施threadvar
  • 已发布(注意我并不认为这是一个范围标识符;它确实是公共范围;“并包含RTTI信息” - 理论上,将某些私有属性标记为“包含RTTI”也很有用。)
  • 公共
  • 保护
  • 私有
  • 严格私人
  • 本地变量

我必须承认:我在这里提出的内容肯定是过度简化。了解目标是一回事,实际实现目标则是另一回事。在封装(隐藏东西)和暴露受控接口之间存在平衡行为,以实现高水平的可重用性。

成功平衡这些需求的技术属于一类关于系统设计的更复杂(有时甚至是有争议的)问题。糟糕的设计很可能会导致人们“过多”地暴露“太大”的范围,并且(可能矛盾地)也会降低可重用性。