名称空间/包装的优点


14

某些编程语言(例如Java和C ++)具有称为“包”或“命名空间”的语言功能。拥有名称空间真的有多有用?可以像SDL一样(例如SDL_BlitSurface())将功能和类标记为属于某个特定库,而无需使用这种语言功能。命名空间是否不足以值得拥有?它们在库中有用但在应用程序中没有用吗?除了在小型项目中,它们是否在其他地方有用?有什么想法吗?

Answers:


16

名称不是和namespacing 前缀相同的东西,只是它以一种不太有用且更难于读取/解析的方式完成?问题不回答自己吗?


仅在标识符名称的开头添加前缀与使用名称空间之类的语言功能不同。例如,在C ++中,您可以说您是using一个特定的名称空间,然后不必在该名称空间中将标识符放在标识符的开头。
compman 2010年

2
@ user9521-这是我的意思...
Nicole 2010年

+1命名空间的一个大好处是,你可以跳过/缩短在不需要的时候前缀-在特定的事情所指向的命名空间来定义,通过usingimport xxxxxxxxx as yyy

1
由于大多数程序员都很懒惰,您是宁愿声明using SDL;还是必须SDL_*在各处键入?
Berin Loritsch 2010年

2
+1,但我认为您的意思确实是“没什么用,更难阅读,而且未经编译器验证”。
拉里·科尔曼

5

具有命名空间的大多数(全部?)语言都倾向于面向对象。即使存在多种不兼容的实现,很多时候使用人类可读的类型名称也是合适的。(这提出了其他有关面向对象重用的问题,但这不是这个问题的目的)。例如,在Java中,您有一个用于后台UI任务的计时器和一个用于后台应用程序(与AWT / Swing无关)任务的计时器。命名空间使您可以将这些同名的对象置于不同的子API中。

命名空间存在的原因与预期其他开发人员将为其对象命名的不合理任务有关。C ++引入了这个概念(或者至少是我接触到该概念的第一门语言),即使没有关于最佳使用实践的指南,它也很有帮助。Java对该概念进行了修改,并添加了一些“最佳实践”,这些最佳实践将您的公司名称包含在名称空间中。这样,您只需要担心自己的公司。

前缀可能变得非常混乱。什么时候使用?什么时候使用?结构/类/全局方法是否获得前缀?那方法呢?那么结构中的属性呢?我已经在代码中看到了所有这些内容,尽管值得庆幸的是不是一次全部。命名空间为所有这些问题提供了一定的可预测性,并使之成为语言功能,而不是个人的“最佳实践”。


Haskell具有名称空间(模块),并且不是面向对象的。
Jeremy Heiler 2010年

3

我认为名称空间是个好主意。它们通过限制名称范围来帮助防止命名冲突。在Java软件包中,建议的软件包命名约定基于域名,域名应该唯一,这有助于防止自定义库上的命名冲突。总体而言,它们使命名在广义上更具独特性,同时仍使程序员在命名自己的作品时有更多的自由,而不必遵循一些晦涩的命名约定。


1
但是,就Java的特定约定而言,并非每个人都有一个网站。另外,如果您曾经将程序从一个网站移至另一个网站(例如,从Sourceforge移至Github),这是很有意义的,但是如果其他事情取决于您的代码,则不方便更改软件包。
compman 2010年

1
Java的约定适用于您的组织,而不适用于托管它的地方。您只需声明一个组织即可完成工作。URL还存在允许包名称中不能使用的字符的问题。但是我们不会去那里。因此,对于您来说,只需使用“ me.user9521”作为程序包名称即可。
Berin Loritsch 2010年

1
约定与网站名称无关,而与域名有关。您可以拥有一个没有网站的域名。
David Thornley,2010年

1

命名空间/模块/包对于避免名称冲突很有用。名称前缀也是如此,但是名称空间具有更多的便利,能够将符号导入当前的名称空间,因此您不必费心整个Namespace :: *。

某些语言(如Python)通过允许您仅将特定符号导入当前模块或以其他名称导入符号来扩展此功能。如果您仅对几个类/函数/常量感兴趣,或者某些符号与名称空间中的符号冲突,而其他符号与您的名称空间中的符号冲突,则这很有用。

某些语言(例如Ruby)允许您将模块的方法包括在类中。这对于多态和泛型很有用。例如,如果您有多个类的迭代器以相同的方式起作用,则可以从一个单独的模块将方法混合到所有这些类中,该模块提供了对对象中的数据进行排序和过滤的方法。这允许has a关系以及is a(继承)关系。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.