我遇到的每个Web开发框架,包括设计最好的Web开发框架(Web2Py,Kohana)都使用某种形式的全局变量来表示应用程序域中的全局变量 - 例如,表示“请求”的对象和'回应'。
另一方面,全局变量不好的观点是编程的基本公理之一。事实上,现在对单身人士模式的普遍贬低通常指向这样一个事实,即它只不过是伪装的全局变量,就好像这是足够的解释。
我试图一劳永逸地理解全局变量如何受到如此谴责,同时又是我们所有网络框架中看似不可或缺的一部分?
答案 0 :(得分:6)
什么是全球性的?拿你的文字我假设你的意思是在全球范围内声明的变量。任何赋值都可以覆盖这样的变量,并破坏现有的功能。
但是,在OO语言中,所有内容都在一个类中,并且赋值可以包含在gettors和settors中以用于属性,或者完全隐藏在方法之后。这提供了一种处理全局变量的安全方法。请注意,在适当的OO语言(Java,C#,VB.NET等)中,不可能有全局变量(有时语言结构会另有说明,但C#中的静态字段或VB中的模块,mixins)在Ruby中都包含在类中,因此不是真正的全局。)
你提到的单身人士是一种特殊的全球性。作为设计人员,您可以控制运行的实例数。一辆汽车只需要一个发动机,一个国家只有一个政府(或战争中断),一个程序只需要一个主线程。 全球化是编程的必需品,真正的讨论不应该是,我们是否需要它们,而是如何坚定地创建和使用它们。
您说请求和响应对象是Web开发中的全局变量。他们不是。它们(通常取决于您的工具集)在代码运行之前在范围内设置的便捷变量。由于Web应用程序在任何给定时间都可以有多个请求对象,我认为这些是全局变量的一个不好的例子。它们不是(但它们通常是本地的,并且是当前线程的单例)。
传统的过程语言(如Basic,Pascal,C)无法涵盖的一个重要特性是访问控制,因此全局变量的并发性和线程安全性。例如,在.NET中,BCL中的任何静态方法或属性(根据定义可以说任何静态变量都是全局的)都是设计上的线程安全的。用户定义的静态方法或属性的指南建议您也这样做。
编辑:危险在于语言允许全局变量但同时将自己宣传为真正的OO。虽然这些都是很棒的语言,但是脱离OO的保护并在例如Perl,Python,Ruby,PHP中创建全局变量确实很危险。答案 1 :(得分:2)
我不确切知道在web框架中使用这些全局变量的上下文,但是只要你需要具有可靠的访问控制,任何全局都会立即产生问题。如果你开始在同时执行的程序中使用这样的全局,那么很难说是谁以及何时访问和更改它。它创造了所谓的共享状态。这使调试变得更加困难。
无论如何,我并不是真的赞成这样的陈述。这只会导致过度简化。你必须权衡你的要求,然后决定这种或那种模式是否带来更多的积极或消极影响......
答案 2 :(得分:1)
全局变量一点也不差。特别是如果它仅在对象范围内是全局的。有时没有其他方法可以在没有它们的情况下创建清晰的代码。但是,出于安全原因,它们应该是私有的,并且能够与setter / getter方法一起使用。 “糟糕的全局变量”思想的主要含义是安全性和错误保护。