在严格的程序中是否可以避免全局变量? 作为一个在OO中诞生和成长的开发者,我很想知道如何避免程序过程中的全局状态。你也可以在C.写面向对象代码,你不能得到所有C++的好东西,而且很难看,你必须手动传递这个指针。(为了使其与C++兼容,我已经看到使用了self),但它是有效的。因此,从技术上讲,在纯过程语言中不需要全局状态,原因与在面向对象语言中不需要全局状态完全相同。只需显式地传递状态,而不是像在OO语言中那样隐式地传递状态。

在严格的程序中是否可以避免全局变量? 作为一个在OO中诞生和成长的开发者,我很想知道如何避免程序过程中的全局状态。你也可以在C.写面向对象代码,你不能得到所有C++的好东西,而且很难看,你必须手动传递这个指针。(为了使其与C++兼容,我已经看到使用了self),但它是有效的。因此,从技术上讲,在纯过程语言中不需要全局状态,原因与在面向对象语言中不需要全局状态完全相同。只需显式地传递状态,而不是像在OO语言中那样隐式地传递状态。,c,C,当然。只需在某个地方声明一个结构,为它分配一些内存,将指向已分配内存的指针传递给初始化函数,然后退出。只需将指针传递给所有需要使用该结构的函数即可 尽管出现了这样一个问题:您将指向不希望是全局的数据的指针存储在何处,然后您可能会得到一个全局指针;-)您可以在堆栈上或堆中有变量,这些变量将在整个程序生命周期中存在 将对象样式的结构指针传递给每个函数是拥有OOC编码样式的好方法 (我建议看一下linux源代码)所有OO都是一种思维方式和一整套编译器支持 在大多数语言中,通过规范、编码约定和传递结构,

当然。只需在某个地方声明一个
结构,为它分配一些内存,将指向已分配内存的指针传递给初始化函数,然后退出。只需将指针传递给所有需要使用该结构的函数即可


尽管出现了这样一个问题:您将指向不希望是全局的数据的指针存储在何处,然后您可能会得到一个全局指针;-)

您可以在堆栈上或堆中有变量,这些变量将在整个程序生命周期中存在

将对象样式的结构指针传递给每个函数是拥有OOC编码样式的好方法


(我建议看一下linux源代码)

所有OO都是一种思维方式和一整套编译器支持

在大多数语言中,通过规范、编码约定和传递结构,可以实现大致相同的效果

例如,我曾经用函数/过程的模块标识作为前缀,将第一个参数作为相关的模块结构

// System.h

typedef struct _System
{
    struct _System *owner;
    LinkedList *elements;
} System;

// System.c

int System_FindName ( System * system, char *name)
{
..
}
等等


我真的不想回到像这样的编码。我很高兴我至少18年没有编写和调试链表了。当时没有互联网,孤零零地坐在一个寒冷明亮的房间的角落里,绿色的磷光体燃烧在你的视网膜上,这是很困难的…

举个例子,看看C标准库中的文件I/O函数是如何使用指针指向(大部分)不透明的
文件
对象的。或者看看操作系统API如何处理句柄等来封装信息。程序创建对象,使用作用于这些对象的API并关闭/删除对象-所有这些都使用直接C。

例如,您可以尝试使用dia(图解工具)创建一个简单类(例如,正方形)。

然后,您可以使用dia2code在C代码中转换该类:

具体来说,假设您在square.dia图中创建了类square。然后,键入:

$ dia2code -t c square.dia
。。。您将看到,在没有全局变量的C程序中,可以转换任何面向对象的编程。浏览创建的文件square.c和square.h


注意:在Windows中,为了使dia2code正常工作,您需要一个变通方法。在使用dia2code之前,将square.dia更改为square.zip,解压缩它,并将结果重命名为square.dia

Simple。每当一个过程访问一个全局变量时,就将该变量作为过程的参数,可以通过值、引用、指针,也可以通过编程语言提供的任何方式。此后,变量不再需要是全局变量。

全局变量只不过是一个隐式过程参数。使其显式,全局变量就会消失


注意:不再使用全局变量并不意味着不再使用全局状态!我们上面所做的只是一个纯粹的语法转换,程序的语义根本没有改变。它和以前一样不可组合、非模块化、非线程安全、不可并行化。

如果你做得好,它就不难看了+1因为你在其他方面都很到位。我同意;面向对象仿真是避免全局状态问题的一种方法;但是,一个纯粹以程序风格编写的程序呢?它甚至是可取的吗?在最近的一次演讲中,艾伦·凯提到了1953年的一个项目,它使用了我们今天所认识的“物体”。显然,由于OO语言直到1962年才发明,所以这不是用OO语言写的。事实上,由于第一批编程语言直到1957年才被创建(忽略了Plankalkül),这根本不是用任何编程语言编写的,它是用汇编语言甚至机器代码编写的。你真的可以用任何语言编写OO。+1来自绿色荧光灯和癫痫诱导荧光灯的另一个幸存者。+1用于区分语法(全局变量)和语义(全局状态)。