如果全局变量不好,为什么每个web框架都使用它们



我遇到的每个web开发框架,包括设计最好的框架(Web2Py、Kohana),都使用某种形式的全局变量来表示应用程序域中的全局对象,例如,表示"请求"one_answers"响应"的对象。

另一方面,全局变量不好的想法是编程的基本公理之一。事实上,现在常见的对singleton模式的贬低通常指向这样一个事实,即它只不过是伪装的全局变量,似乎这已经足够解释了。

我试图一劳永逸地理解,全球化是如何受到如此谴责的,同时又是我们所有网络框架中看似不可或缺的一部分?

什么是全局?假设您的文本是指在全局范围内声明的变量。这样的变量可以被任何赋值覆盖,并破坏现有的功能。

然而,在OO语言中,所有内容都在类中,赋值可以封装在属性的gettor和settor中,也可以完全隐藏在方法后面。这为处理全球性问题提供了一种安全的方式。请注意,在适当的OO语言(Java、C#、VB.NET等)中,不可能有全局变量(有时语言结构会建议不要这样做,但C#中的静态字段或VB中的模块、Ruby中的mixin都封装在类中,因此不是真正的全局变量)。

你提到的单身汉是一种特殊的全球性。作为一名设计师,你可以控制它的运行次数。一辆汽车只需要一个发动机,一个国家只需要一届政府(或者战争爆发),一个程序只需要一条主线全局参数是编程的必需品,真正的讨论不应该是我们是否需要它们,而是如何扎实地创建和使用它们

您说请求和响应对象是web开发中的全局对象。事实并非如此。它们(通常取决于您的工具集)是在代码运行之前在范围中设置的方便变量。由于web应用程序在任何给定时间都可以有多个请求对象,我认为这是全局变量的一个糟糕例子。它们不是(但它们通常是本地的,并且是当前线程的单例)。

传统过程语言(如Basic、Pascal、C)中无法涵盖的一个重要特性是访问控制,以及全局变量的并发性和线程安全性。例如,在.NET中,BCL中的任何静态方法或属性(可以说任何静态变量根据定义都是全局的)在设计上都是线程安全的。用户定义的静态方法或属性的指导原则建议您也这样做。

EDIT:危险在于那些允许全局变量但同时又将自己传播为真正OO的语言。虽然这些都是很棒的语言,但脱离OO的保护并在例如Perl、Python、Ruby、PHP中创建全局语言确实很危险。

我不知道这些全局变量在web框架中使用的确切上下文,但只要你需要有可靠的访问控制,任何全局变量都会产生问题。如果你开始在并发执行程序中使用这样一个全局,很难说是谁、何时访问和更改了它。它会创建所谓的共享状态。这使得调试更加困难。

无论如何,我其实并不赞成这种说法。这只会导致过于简单化。你必须权衡你的要求,然后决定这种或那种模式是带来更多的积极影响还是消极影响。。。

最新更新