Delphi中的命名空间

9

使用长单位文件名称,例如MyLib.MyUtils.pas,是否有实际效益,还是只是一种单位名称前缀?

3个回答

14

命名空间就像所有标识符一样,旨在组织代码。

因此,只有当使用它们可以更好地组织您的项目时才会获得好处。这是一个高度主观的问题(甚至对于最简单的命名约定也可能发生争论!),因此无法真正回答。

这里有一些文档介绍Delphi中命名空间的工作方式。

请注意,在Delphi中不可能存在“真正”的命名空间(其中多个通用DLL可以为同一命名空间做出贡献;这就是命名空间在.NET世界中的功能方式)。您可以使用BPL方式,但这与“通用DLL”不同。这不是Delphi本身的限制,而是Windows中本地DLL的“工作”方式所致。

——jeroen


+1 有趣的链接。我甚至不知道 Delphi 中还有“官方命名空间”。 - jpfollenius
1
看起来这篇文档是为 Delphi.NET(dcuil 文件等)编写的。Embarcadero 必须编辑它以记录 Delphi for Win32 命名空间。 - kludg
+1 感谢提供链接... 现在我正在寻找任何关于支持这些命名空间前缀的版本的参考资料... - Jerry Dodge
据我所记,Delphi 7之后的任何版本都支持。Delphi随附了Delphi .NET命令行编译器的预览版,从那时起,每个Delphi .NET编译器都支持它,并且我认为任何本地Delphi编译器也支持它。 - Jeroen Wiert Pluimers

3

请参见:

Delphi(dcc32.exe)为什么有设置“命名空间搜索路径”的选项?

在Delphi中,编译器支持命名空间,因此单元名称中的点具有特殊含义。如果dcc32.exe选项设置正确,您可以使用文件的完全限定名称,也可以使用文件名的“快捷”样式。

因此,您也可以编写:

uses
  MyBestTools;

为避免使用完全限定名称
uses
  MyCompany.MyProject.MyLibrary.MyBestTools;

免责声明:目前这些都只是理论,但不久的将来我会在一些项目中使用命名空间

为了获得更好的IDE支持,请随意在QualityCentral中投票支持此功能建议:

可视化IDE中的单元命名空间层次结构


1
我在IDE(Delphi 2009)中找到了相同的选项: 项目/选项/Delphi编译器/默认命名空间,命名空间前缀 - kludg
在 Delphi XE7 IDE 中,它被称为“单元作用域名称”。 - SoftDeveloper
@SoftDeveloper,XE7版本的dcc32命令行工具中是否仍然存在“-NS<namespaces> = Namespace search path”参数? - mjn
@mjn 是的,只是IDE选项名称发生了变化。 - SoftDeveloper

1

我根据评论和对问题的明显误解修改了这个答案。

我唯一看到使用您建议的单元名称的实际好处是,IDE将以比没有“命名空间”前缀更好的方式对单元进行排序。我更喜欢使用不同的文件夹。

在某些情况下,由于名称冲突,这可能是有意义的。例如,您可以有一个单元MyLib.Utils和一个单元MyOtherLib.Utils。这确实可以避免一些混淆(对于IDE和您自己而言)。

您也可以使用具有静态类方法的抽象类模拟命名空间:

type
  Utils = class abstract
    class procedure Beep; static;
  end;
...
Utils.Beep;   

1
如果我正确理解Serg的意思,他询问的是单位名称中内部(而不是之后)的点。 - Uli Gerhardt
你可能是对的,因为问题不是很详细。我编辑了我的答案以反映这种可能性。 - jpfollenius
当然,这个问题是关于“点分”单位名称的。据我所知,点只是单位名称前缀中的另一个符号,没有其他意义。例如,您不能编写“uses MyLib”来使用MyLib.MyUtils或以任何其他方式使用“MyLib”标识符。 - kludg
好的,我明白了。我编辑了答案。希望现在更有帮助。 - jpfollenius
@Serg:DCC32.exe有一个特殊选项可以设置默认命名空间。因此,如果将默认命名空间设置为MyLib,则可以使用MyUtils。 - mjn
一个命名空间不能发出哔哔声。它用于组织类。例如,比较beeptools.Buzzer.makeNoise()Buzzer.makeNoise() - mjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接