为什么有些语言(如 C 和 Python)要求指定对象的命名空间,即使不存在歧义?我知道这有后门,比如using namespace x在 C 或from x import *Python 中。但是,当只有一个可访问的命名空间包含给定的标识符并且不存在歧义时,我不明白不希望语言“做正确的事情”背后的理由。对我来说,这只是不必要的冗长和违反 DRY,因为你被迫指定编译器已经知道的东西。
using namespace x
from x import *
例如:
import foo # Contains someFunction(). someFunction() # imported from foo. No ambiguity. Works.
对比
import foo # Contains someFunction() import bar # Contains someFunction() also. # foo.someFunction or bar.someFunction? Should be an error only because # ambiguity exists. someFunction()
其中一个原因是防止以后更改代码(或当其他人更改外部模块/库时)时意外引入冲突。例如,在 Python 中,您可以编写
from foo import * from bar import *
如果您知道模块foo和bar没有任何同名变量,则不会发生冲突。但如果在以后的版本中foo,和都bar包含名为的变量,该怎么办rofl?那么将在您不知情的情况下bar.rofl掩盖。foo.rofl
foo
bar
rofl
bar.rofl
foo.rofl
我还喜欢能够查看文件的顶部并准确地看到正在导入的名称以及它们来自哪里(当然,我说的是 Python,但同样的道理也适用于 C++)。