Answers:
名称不是和namespacing 前缀相同的东西,只是它以一种不太有用且更难于读取/解析的方式完成?问题不回答自己吗?
using SDL;
还是必须SDL_*
在各处键入?
具有命名空间的大多数(全部?)语言都倾向于面向对象。即使存在多种不兼容的实现,很多时候使用人类可读的类型名称也是合适的。(这提出了其他有关面向对象重用的问题,但这不是这个问题的目的)。例如,在Java中,您有一个用于后台UI任务的计时器和一个用于后台应用程序(与AWT / Swing无关)任务的计时器。命名空间使您可以将这些同名的对象置于不同的子API中。
命名空间存在的原因与预期其他开发人员将为其对象命名的不合理任务有关。C ++引入了这个概念(或者至少是我接触到该概念的第一门语言),即使没有关于最佳使用实践的指南,它也很有帮助。Java对该概念进行了修改,并添加了一些“最佳实践”,这些最佳实践将您的公司名称包含在名称空间中。这样,您只需要担心自己的公司。
前缀可能变得非常混乱。什么时候使用?什么时候不使用?结构/类/全局方法是否获得前缀?那方法呢?那么结构中的属性呢?我已经在代码中看到了所有这些内容,尽管值得庆幸的是不是一次全部。命名空间为所有这些问题提供了一定的可预测性,并使之成为语言功能,而不是个人的“最佳实践”。
我认为名称空间是个好主意。它们通过限制名称范围来帮助防止命名冲突。在Java软件包中,建议的软件包命名约定基于域名,域名应该唯一,这有助于防止自定义库上的命名冲突。总体而言,它们使命名在广义上更具独特性,同时仍使程序员在命名自己的作品时有更多的自由,而不必遵循一些晦涩的命名约定。
命名空间/模块/包对于避免名称冲突很有用。名称前缀也是如此,但是名称空间具有更多的便利,能够将符号导入当前的名称空间,因此您不必费心整个Namespace :: *。
某些语言(如Python)通过允许您仅将特定符号导入当前模块或以其他名称导入符号来扩展此功能。如果您仅对几个类/函数/常量感兴趣,或者某些符号与名称空间中的符号冲突,而其他符号与您的名称空间中的符号冲突,则这很有用。
某些语言(例如Ruby)允许您将模块的方法包括在类中。这对于多态和泛型很有用。例如,如果您有多个类的迭代器以相同的方式起作用,则可以从一个单独的模块将方法混合到所有这些类中,该模块提供了对对象中的数据进行排序和过滤的方法。这允许has a
关系以及is a
(继承)关系。
using
一个特定的名称空间,然后不必在该名称空间中将标识符放在标识符的开头。