繁体   English   中英

命名空间中的变量如何比全局变量好

[英]How are Variables in Namespaces Better than Global Variables

我们都知道应该避免使用全局变量,但是将它们放在命名空间中是解决方案还是同一问题的另一种形式? 拥有任何人都可以在名称空间中访问和更改的数组之类的东西还是很不好吗?
有变量时,是否还有其他选择:

  • 那不属于现有的类
  • 需要由一个以上的现有类使用
  • 不需要为每次使用创建一个实例(它们都应该都修改同一个实例)

命名空间使您更容易理解是否有必要像这样的变量(都与同一个想法相关)。 它们还使跟踪变得更容易。 这些是使他们比拥有全球公司更好的唯一原因吗? 我不是想淡化他们的重要性,只是好奇。
多考虑这一点,在C#中,全局静态类成员与此基本相同。

编辑:最终为它制作了一个新类(并像平常一样通过ref传递了它)。 它有可能会增长,所以我觉得这门课很好。 另外,在写出命名空间之后,对于这种情况,这似乎是一个可怕的解决方案。

与全局变量至少有三个不同的困难。 他们:

1)防止其他人使用相同的名字(或者,如果这样做的话,他们会掩盖您的名字,这可能会造成混淆)。 将事物放在名称空间中将对此有所帮助。

2)使得难以同时推理直接修改全局代码的所有代码。 命名空间除了匿名命名空间外无济于事,因为它们可以用于将对全局的访问限制为一个TU。 使用私有的静态类成员,也许可以通过使用一些friend ,可以有所帮助。 非可变全局变量也有帮助。

3)很难同时推理所有间接修改全局代码的代码,因此很难推理程序中任何指定点的全局当前状态。 非可变全局变量可以提供帮助。 您不关心帮助状态的全局变量(例如,如果正确处理了缓存的陈旧性,则无论是否已缓存给定结果,它都不会影响代码的正确性)。 命名空间无济于事。 在私有数据成员中“隐藏”全局状态,同时仍保留公共访问者,这无济于事。

那么,名称空间是否有助于解决全局变量的难题? 一点点,但不多。

如果您知道全局变量的其他困难,那么您可以自己评估名称空间是否有帮助。 如果您不了解与全球化者有关的困难,那么您就不会因为宗教信仰而回避他们,而只是因为有人告诉您每个人都知道自己是不好的, 所以没有为您做任何帮助 一种知道要问一个愿意教你一些东西的人的方法,而不仅仅是试图吓you你成为一个好的程序员。 另一种方法是使用它们,看看遇到什么麻烦(如果有)。

我相信这确实只是同一问题的一部分。 为什么不考虑这个问题,然后再考虑将变量放入命名空间,

问题)是否可以在一个类的整个生命周期中包含该变量/数组,并且需要该变量/数组的任何其他类都包含对该变量的指针/引用。

通常,通过允许类通过指针访问变量,您可以将其视为与全局变量几乎相同的方式,只需确保将其传递到构造函数中,或使用一个setter方法即可

通常,您的类希望封装对象状态,并使用函数对其进行操作。 另一方面,名称空间可以更多地看作是用于解决任务的相关功能的组合,例如带有类似...的std名称空间。

 std::cout << "msg here" << std::endl;

在此示例中,此名称空间中包含一些函数,以将缓冲区打印到屏幕并刷新输出

当我们以OOP风格设计程序时,我们将其定义为实体的交互。 实体将其状态隐藏在实现细节中,并提供接口(以使交互成为可能)。 事实证明,将所有实体定义为类是有效的。 如果我们有全球性公司,我们就会损害美感并打破覆没原则,使实体状态裸露在任何阶层之外。 在这种情况下,命名空间无法帮助我们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM