我遇到的每个Web开发框架,包括设计最好的Web开发框架(Web2Py,Kohana)都使用某种形式的全局变量来表示应用程序域中的全局变量 - 例如,表示"请求"和"响应"的对象".
另一方面,全局变量不好的观点是编程的基本公理之一.事实上,现在对单身人士模式的普遍贬低通常指向这样一个事实,即它只不过是伪装的全局变量,就好像这是足够的解释.
我试图一劳永逸地理解全局变量如何能够如此受到谴责,同时又成为我们所有Web框架中看似不可或缺的一部分?
什么是全球性的?拿你的文字我假设你的意思是一个在全球范围内声明的变量.任何赋值都可以覆盖此类变量并破坏现有功能.
但是,在OO语言中,所有内容都在一个类中,并且赋值可以包含在gettors和settors中以用于属性,或者完全隐藏在方法之后.这提供了一种处理全局变量的安全方法.请注意,在适当的OO语言(Java,C#,VB.NET等)中,不可能有全局变量(有时语言结构会另有说明,但C#中的静态字段或VB中的模块,Ruby中的mixins都包含在类中因此不是真正的全球性).
你提到的单身人士是一种特殊的全球性.作为设计人员,您可以控制运行的实例数.一辆汽车只需要一个发动机,一个国家只有一个政府(或战争中断),一个程序只需要一个主线程.全局编程是必不可少的,真正的讨论不应该是,我们是否需要它们,而是如何坚定地创建和使用它们.
您说请求和响应对象是Web开发中的全局变量.他们不是.它们(通常取决于您的工具集)在代码运行之前在范围内设置的便捷变量.由于Web应用程序在任何给定时间都可以有多个请求对象,我认为这些是全局变量的一个不好的例子.它们不是(但它们通常是本地的,并且是当前线程的单例).
传统过程语言(如Basic,Pascal,C)无法涵盖的一个重要特性是访问控制,因此全局变量的并发性和线程安全性.例如,在.NET中,BCL中的任何静态方法或属性(根据定义可以说任何静态变量都是全局的)都是设计上的线程安全的.用户定义的静态方法或属性的指南建议您也这样做.
编辑:危险在于语言允许全局变量,但同时将自己宣传为真正的OO.虽然这些是很棒的语言,但是脱离OO的保护并在例如Perl,Python,Ruby,PHP中创建全局变量确实很危险.