Programming languages 什么是名称空间?

Programming languages 什么是名称空间?,programming-languages,Programming Languages,我没有采用通常的CS方法来学习编程,我经常听说名称空间,但我并不真正理解这个概念。我在网上找到的描述通常是在我不熟悉的C语言环境中 我做Ruby已经两年了,我试图对Ruby语言和OOP有更深入的理解。把它看作是对象和功能的逻辑分组。有一篇关于名称空间的简短但有用的文章,以及一篇关于计算机科学中名称空间的更详细的文章,使用特定于语言的示例&c 关键的一点是,当您无法将名称“逻辑地分组”到名称空间中时,即您只有一个未区分的“空间”,所有名称都位于其中,为了避免意外冲突,您最终会笨拙地通过名称前缀和c

我没有采用通常的CS方法来学习编程,我经常听说名称空间,但我并不真正理解这个概念。我在网上找到的描述通常是在我不熟悉的C语言环境中


我做Ruby已经两年了,我试图对Ruby语言和OOP有更深入的理解。

把它看作是对象和功能的逻辑分组。

有一篇关于名称空间的简短但有用的文章,以及一篇关于计算机科学中名称空间的更详细的文章,使用特定于语言的示例&c

关键的一点是,当您无法将名称“逻辑地分组”到名称空间中时,即您只有一个未区分的“空间”,所有名称都位于其中,为了避免意外冲突,您最终会笨拙地通过名称前缀和c等技巧重新实现基本的名称空间功能。例如,“画画”对艺术家或枪手来说意味着非常不同的东西;如果你不能为艺术家和枪手使用单独的名称空间,那么你最终会得到诸如
artist_-draw
gunslinger_-draw
这样的标识符,并且如果一些库作者使用不同的约定等,仍然可能发生意外冲突。

来自:

什么是名称空间?大体上 定义名称空间是一种 封装项目。可见, 作为一个抽象的概念在很多地方。 例如,在任何操作系统中 目录服务于相关的组 文件,并充当 其中的文件。作为混凝土 例如,文件foo.txt可以存在于 目录/home/greg和 /主页/其他,但有两份foo.txt 不能在同一目录中共存。 此外,要访问foo.txt 文件位于/home/greg外部 目录,我们必须在 使用将目录名转换为文件名 要获取的目录分隔符 /home/greg/foo.txt。同样的 该原则扩展到 编程世界

因此,正如另一张海报所提到的,可以使用名称空间将项目分组在一起

为了了解这可能有用的原因,假设您想为Wordpress编写一个插件,并创建一个名为“MyClass”的类。但问题是,您不知道其他开发人员是否已经使用名为“MyClass”的类编写了另一个Wordpress插件。因此,为了避免命名冲突,您可以将类命名为“MyPluginMyClass”。这很烦人,但可能避免了命名冲突

然后是PHP5.3版本,它最终支持名称空间(我们也假设Wordpress和所有部署它的服务器都升级到PHP5.3)。现在您可以创建一个名称空间,比如“MyPlugin”,并在其中封装“MyClass”。完成此操作后,您可以发布插件,而不用担心您的“MyClass”版本会与其他人的“MyClass”版本冲突。

维基百科中的定义:

名称空间是一个抽象容器或环境,用于保存唯一标识符(即名称)的逻辑分组

例如,您可以发现名称空间可用的地方如下:

您可以定义一个常量或变量,甚至定义一个具有泛型名称的类。如果不希望重命名此常量/变量/类,但需要另一个具有相同名称的常量/变量/类,则可以在不同的命名空间中定义该新实例

在Ruby中,模块是基本相同的事物,在C++中命名空间是.< /P> 例如:

模块Foo
BAZ=1
结束
模块条
BAZ=2
结束
将Foo::BAZ#=>1
放置条::BAZ#=>2

因此,在这里,在两个模块(ruby中称为名称空间)中声明了常量
BAZ

名称空间提供了一个容器,用于保存函数、类和常量等内容,以将它们逻辑地组合在一起,并帮助避免与其他人编写的同名函数和类发生冲突


在Ruby中,这是使用模块实现的。

我将提供一个更普通的描述

假设我妻子有一个叫苏的妹妹,我也有。在谈话中,我如何区分他们?使用他们的姓氏(“苏·拉森”vs“苏·琼斯”)姓氏是名称空间

当然,这是一个有限的示例,在编程中,潜在的家庭成员可能比我的示例多得多,因此碰撞的可能性更高。在某些语言(如java)中,名称空间也是分层的,与姓氏不平行


但除此之外,这是一个类似的概念。

最短答案:名称空间创建范围。

不要贬低自己——CS学位并不能很好地预测一个好的开发人员,我怀疑全球大多数开发人员都没有那么痛苦!谢谢你精彩的解释。这样解释很简单。另一个例子:如果在同一个应用程序中有
Building::Key
Piano::Key
,名称空间将
Key
类分开。在这个上下文中,“scope”是什么意思?scope是对象关联的封闭上下文。参考-。你同意吗?名称空间不创建作用域-它们封装在本地作用域中。在计算机编程中,将名称与实体(如变量)的关联绑定在一起的名称的范围是程序中名称绑定有效的部分;也就是说,可以使用名称来引用实体。