好吧,我坐下来第一百万次告诉自己“我打算用SDL和C ++编写一个游戏”,除非这次我告诉自己我要用C语言编写。这是因为SDL本身就是用C语写的,似乎对我有意义。我正在编写的游戏将是一个简单的“SHMUP”(拍摄它们)并且代码可能非常短,所以我想知道几个全局变量是不是很糟糕? (比如“struct base basevar;”或“int SCREEN_W”或其他东西)?
答案 0 :(得分:4)
全局变量本身并不“坏”。但是,如果不小心使用,它们很容易导致非常糟糕的代码(在可读性,可测试性,可维护性方面)。如果你不小心使用它们,它们也会导致有害的多线程问题(如果你正在使用线程)。
有些人有一条全面的规则,你永远不应该使用它们。恕我直言,这太过于严苛,如果遵循宗教信仰,会导致人们绕过一个指向大everything_t
所有函数的指针,这并不是一件好事(尽管这种简单的方法使你的代码重新获得-entrant)。但是,请不要将此作为“只是疯狂全球化!”的提示。只有在少数情况下,它们才是正确的答案。
在您的示例中,听起来您有一堆设置/参数并没有真正改变。考虑至少将它们分组为settings
结构;这为您提供了以后的灵活性,例如一个const settings *getSettings()
函数。
答案 1 :(得分:1)
好吧,让我们考虑为什么全局变量被认为是坏的。这是他们不受约束的能见度。所有代码都可以访问全局变量,以进行读取和修改。基于全局变形的设计,失败结构。读写可以来自任何地方。虽然当你第一次实现某些东西(因为你知道土地)时这可能是好的,但由于它鼓励的代码类型,它可能是灾难性的。很快你就会得到关系和互动的意义。
话虽如此,对全球化的盲目仇恨也是不合理的。我的意思是,全球性可以是相对的。类名在命名空间内是全局的。类成员在类所建立的命名空间内是全局的。因此,如果类的代码库变得足够大,那么针对全局变量的相同参数可能会针对类成员。实际上,命名空间和类在某种程度上是包含这种全球性疾病的机制。它们(部分)是绘制可见性和访问边界的机制。
因此,在我看来,全球化不是问题。这真的是它如何影响结构。
答案 2 :(得分:0)
虽然在这种情况下可能并不致命,但您不知道将来要对代码做什么。如果游戏变大,全局变量将使调试变得困难。如果您决定将代码重新用于其他游戏,或者甚至是同时为2个屏幕绘制的内容,那么全局变量将会阻碍。
你应该练习好的编程风格,即使它无关紧要,这样你就能做到正确。
答案 3 :(得分:0)
这取决于您是否计划重新使用代码。如果您曾计划将代码更改为其他任何内容,那么请不要使用全局代码,因为它们难以分解。
答案 4 :(得分:0)
知道某些环境,特别是旧版本的Symbian不支持全局变量,甚至静态本地,也可能会很好。