我认为使用全局变量的大多数反对意见都是有道理的,因为它们涉及多线程、线程安全等问题。

但在小型、单线程、非操作系统的情况下,您有什么反对意见?就我而言,如果重要的话,我正在用“C”编写我的嵌入式系统。我也是该产品的唯一开发人员。

为什么消除全局变量会让我的代码更好?

(在阅读了几个回复后,我意识到我还应该指出该系统没有动态内存分配(例如分配)。所有内存都是在编译时静态分配的。)

有帮助吗?

解决方案

它不会。

全局变量的两个基本问题简直是混乱的命名空间,并说:“没有人”拥有“控制”他们的事实(因此,潜在的冲突和多线程冲突)。

在“全局是坏”,就像几乎所有其他的计算机编程成语是一个指针,而不是一个硬性的规定。当这些形形色色的“规则”是由,其最好的,而不是简单地死记硬背采用规则,了解创建规则背后的情况和动机。不要只相信他们盲目。

在你的情况,你似乎明白你的系统的性质和周围的规则的论据,并决定它不适用于这种情况。你说得对,没有。

所以,不要担心。

其他提示

下面是一篇好文章,让为什么全局变量是坏

为什么全局变量应尽可能避免不必要的?

  

非局部性 - 源代码是最容易理解的时,其各个元素的范围是有限的。全局变量可以读取或程序的任何部分修改,使其难以记住或推理每一个可能的用途。   没有访问控制或约束检查 - 全局变量可以得到或程序的任何部分设置,以及有关其用途的规则可以容易断裂或遗忘。

     

隐式耦合 - 与许多全局变量的程序通常具有耦合的变量和函数之间的一些那些变量之间的紧密耦合,和。分组加上项目为单位凝聚力通常会导致更好的节目。

     

内存分配的问题 - 有些环境具有内存分配方案,使全局棘手的分配。这里的“构造”比其他的分配(因为,在这种情况下,你可以表达在两个相互全局依赖于彼此不安全的情况)的副作用这是语言更是如此。此外,当动态链接模块,也可以是不同的不清楚是否库有自己的全局的实例或全局是否是共享的。

     

测试和禁闭 - 源,其利用全局是较为困难的测试,因为一个人不能容易地设置运行之间的“干净”的环境。更一般地,利用未明确提供给源任何形式的全球服务源是很难测试出于同样的原因。

添加全局是很容易的。这很容易在宣布他们的习惯来获得。它不仅仅是一个好的设计思维快得多。

全局变量并不像你想象中的那样糟糕,他们只是应避免不必要的时候。全局变量可以有将thoughout程序中使用的变量用好,确保你记住,你总是有跟踪,其中变量发生变化;但是趋向于该程序的有限部分内的前提下使用的变量是很好的理由,以避免它的全球。

全局变量不一定是坏事,就像宏不一定是坏事,浓缩铀也不一定是坏事一样。只要您对给定设计选择的利弊做出有意识的决定,就应该没问题。

一些论点 反对 全局变量是:

  1. 它们违反了良好的面向对象设计
  2. 它们使您的代码难以进行单元测试,因为如果不设置代码期望看到的所有全局变量,则无法测试各个代码块
  3. 它们增加了代码中的耦合:一个代码块中的操作可能会通过共享全局变量以不可预测的方式影响另一代码块中的内容

部分争论者 为了 全局变量:

  1. 它们使在多个功能之间共享单一资源变得容易
  2. 它们可以使代码更易于阅读

如果在您的设计中,全局变量有意义,并且可以用来使您的代码更易于阅读或更易于维护,而不会导致随机错误和测试麻烦,那么请务必使用它们。

我为嵌入式微控制器编写了大量 C 代码,并且一直使用全局变量。在这样一个严格的系统中,全局变量是有意义的。我知道潜在的缺点,但我分析了优点和缺点,并编写了代码以防止主要的陷阱。

底线:没有硬性规定。只需根据您拥有的最佳信息,为您的特定项目或平台做出最佳决策。

由于其最小化耦合。您的系统现在可能很小,但如果你继续工作,它可能会变成不可能的。

全局变量在用 C 编写的小型嵌入式应用程序中是必需的。例如,您需要使用全局变量以便在中断服务例程和另一个模块之间传递信息。这些技巧将帮助您在嵌入式应用程序中有效地使用全局变量:

  • 区分静态变量和全局变量。静态变量可以在同一 C 文件中的所有函数中使用。它们相当于 C++ 类中的私有成员。在 C 语言中,你必须自己完成编译器的工作。使用 static 关键字可以避免在模块外部意外使用变量并明确其范围。您可能需要在变量前加上模块名称的前缀。

  • 遵循全局变量的命名约定(许多 C 文件使用)。明确表明它们是全球性的。

  • 如果您需要大量全局变量,请考虑将它们捆绑在一个结构中。

  • 必要时使用 volatile 关键字。如果 ISR 修改了全局变量,则需要这样做。

,它使用的全局变量的代码是难以维护。由于维护者必须找到系统中的每一个使用thevariable之前,她可以准确地知道变量做什么。由于这减慢maintainence应该避免尽可能。这就是它`

有的范围的问题。我们有爱,使全局变量做本地概念的开发者。它使这些变量更难跟踪的使用,所以很容易犯错误的使用它们。

您可以保持你的钱包在你的前廊还,但你必须对谁访问它远不如控制。

这正说,目前有全局变量了一些有效的用途,但像任何其他规则值得以下。这是例外而不是正常情况。他们非常现有指出,他们有使用。

如果你决定使用全局变量试评得好,给他们好名字。这真的困扰我,当人们做出这样的全局变量“布尔bIsFound;”

我们使它成为一个点,以评估代码审查每一个新的全局变量,看看是否有更好的办法。

在简短的回答是全局变量在历史上一直微妙的错误的来源。但后来(我的功能程序员帽子把)的所有的变量已微妙的错误的来源。

基本上,一个全局变量意味着你可以不看一块使用变量的值代码,并了解它是怎么回事不知道什么每隔一段代码设置该变量的值在过去所做的事情。

也许全局变量的的坏,你的情况。在另一方面,你需要他们?你怎么使用他们获得?

甚至在你的情况下,全局变量使其难以找出应用程序的状态。可能妨碍调试,并有可能导致微妙的错误。

全局变量也使测试更难。他们补充说,你可能希望在测试过程中,以避免对外部代码的依赖关系。

但最后,全局是难以避免的在C编程时在更高级的语言,全局仅仅是无意义的大部分时间。使用它们只是没有让你的代码更清楚。

在C,有很多情况下,其中全局只是最好的,最简单的和最干净的溶液。

所以你的情况,把它在一个按个别情况。你可能会从现在结束有一些全局变量,但除非你确定它实际上是最好的解决方案,而不仅仅是现在不作变量全球性的,又是一年时,你必须调试代码或使应用程序多线程。

使用全局变量,它往往很难知道在何时何地,他们被更新,什么一段代码更新变量。没有监管,因此,谁可以更新或以何种方式变量被更新。

这并不是说很难保持的,如果你的应用是小的轨道 - 但更大的应用程序变得和你有更多的全局变量,更多的应用程序代码看起来像意大利面条

在短 - 它成为一个维护和调试恶梦

问题是追查其中的最后一个码位修改全局的状态。一般情况下,你要保持尽可能小的范围内的变量,这样就可以更轻松地对其做推理。

大部分保持局部变量,并降低其范围有助于促进更好的编程实践。这也减少了误改变一个变量,其通过寻找无意或无明显影响功能,跟踪风险。我相信,这也使得代码更易于阅读和维护,因为最相关的特定代码段的变量定义和附近的初始化。否则,我似乎不断地回头参考的代码定义所有golbals部分。我使用一些全局变量,但主要用于向下配置信息传递到子模块。

想到的一个原因是未来校对。你可能会在你的产品的唯一开发商现在,但它是可以想象的人以后会保持它。当然你的具体情况,这可能不是真实的。

虽然你的产品可能是小而整洁的现在 - 在使用全局变量的整体设计或妥协可读性并不复杂 - 他说的产品不会变得更大或并入其他产品?上帝保佑另一个维护者/开发者一起去要弄清楚你的全局变量的使用。

当然,你可以决定现在使用全局变量,并在项目似乎越来越复杂回去重写它的部分,但为什么强迫自己额外的工作?你更可能(如果你还记得的全局变量的话)来决定这样做的工作太多精力,并让设计去:在这一点上,你就有麻烦了。

所以的,可以救自己的头痛和设计,对未来你的眼睛。现在所需要的工作,将可能使生活更轻松的未来。

如果说没有说服你,想象谁在参与这个项目,并获得他们的代码中发现的故障,犯在最高法院门前糟糕的编程习惯开发商:的巴吉酒精代码反映污染源审查的重要性

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top