在变量作用域(全局是全局的)之前,程序员做了什么?


40

因此,我不得不处理看似古老的语言(称为PowerOn),在这里我有一个主要方法,一些用变量定义变量的数据类型,并且具有不返回类型的子过程(本质上是无效方法)的能力也不接受任何争论。 这里的问题是,一切都是全球性的。 我已经读过这些类型的语言,但是大多数书都带有这样的方式:“好吧,我们过去常常用马和马来骑,但是现在,这是一辆汽车,所以让我们学习如何使用THAT!” 那些日子,我们将永远不会重生。”我必须承认,思想正在努力思考范围和范围之外的问题

好吧,我在这里。我试图弄清楚如何最好地管理几种开放方法中的全局变量。是的,即使是for循环的迭代器也必须全局定义,我发现自己在代码的不同部分进行了回收。

我的问题:对于那些有这种类型经验的人,程序员如何在全球竞争环境中处理大量变量? 我感觉这只是一个心理杂耍技巧,但是我想知道是否有任何已知的方法。


71
他们祈祷了很多。
罗伯特·哈维

15
我可以想象很多疯狂的变量名都近似于范围- bob_dog_fur_colour等等...试图减少命中相同名称的机会。
Latty 2012年

12
他们编写的程序范围较小,并且存在许多错误。
查尔斯·格兰特

12
@Lattyware,实际上早在早些时候,您对如何使用变量名进行描述就非常有限。有些语言只允许使用1或2个字符变量名,另一些语言则允许多达8个字符变量。它很烂,但是我们不知道那时它吸了多少。它确实让编译器挤入了有限的内存。
查尔斯·格兰特

17
他们发明了更好的编程语言……
wim 2012年

Answers:


44

您需要一些心理上的簿记技巧(命名约定等),以使其保持直线。另外,文档,文档,文档。由于所有变量都是全局变量,因此如果可以的话,请列出单个文档并列出所有变量。

尝试使用少量始终用于临时变量的变量,并记住它们是临时变量。通过不断重复使用相同的代码,您将养成跟踪它们在何处有效的习惯。

另外,您还需要查看文档并确保您知道变量名可以有多长,以及实际上有多少个字符是唯一的。我对PowerOn一无所知,但是如果它过时而仅具有全局作用域,则标识符的唯一性长度可能会很有限。

我以前看过带有长标识符的东西,但是其标识符仅在前8个字符中是唯一的。因此,您可以拥有RonnyRayGun和RonnyRayBlaster,它们实际上是SAME变量。在这种情况下,我建议将变量名保持在“唯一”限制内,以减少偶然碰撞的可能性。


4
+1:编写汇编程序时,我通常会遇到一些相同的问题,即如果我为寄存器命名,则名称是全局的(我面临的另一个问题是,即使创建更多名称,我也不会获得更多寄存器,但这就是此处不相关)。拥有一些专用于临时值的寄存器确实有助于减少创建的变量的数量,这使将所有内容保存在头脑中变得更加容易。记录每个函数将使用哪些变量(最重要的是它将修改的变量)有助于正确了解全局。
Leo 2012年

53

数据字典。

在中央存储库(通常是首席程序员的办公室)中,有一个活页夹,其中每个全局变量包含一页。该页面给出了名称,定义,用途以及设置或使用它的例程。

带有微观RAM的早期嵌入式系统存在类似的问题和类似的解决方案。首席程序员维护了主RAM映射,直至单个字节,显示了哪个模块出于什么目的使用了哪个RAM。需要专用RAM分配的程序员转到了首席程序员,在讨论此事后,他做了适当的笔记本输入并给了他自己的RAM。(您不希望成为程序员而又不与主要程序员一起清除RAM字节的情况下占用了RAM字节。请相信我。)

当程序员必须在早期版本的BASIC中构建大型系统时,也会出现此问题。当使用一个非常原始的“数据库”管理器Info(我是新泽西州Henco,Inc.的产品-HOPEFULLY早已消失!)时,它亲自为我显示。这两种语言的变量名词汇都非常有限。


我处于一种非常相似的情况,它更多地是一种“数据库”管理器,其中语言直接与数据库以及一些诸如功能性的编程相连接。这非常有帮助
Chad Harrison

1
这让我想起了我在学习BASIC时的经历,变量的名称不能超过两个字符,并在相当大的程序中跟踪它们……
Kevin Rubin

@KevinRubin,不要提醒我。比尔·克林顿(Bill Clinton)曾经说过……让人感到疼痛
John R. Strohm

8

具有块范围的编程语言的兴起与更快,更大的机器的出现相吻合,而这并非巧合。早期计算机的RAM以MB,kB或什至字节为单位;根本没有机会拥有这么多的变量,以至于程序变大时它们会被混淆,因为程序永远不会变大。编程语言的进步通常是在人们认识到竞技场变得越来越大时,他们的旧编程习惯没有扩大时才取得的。块作用域的发明是程序员针对自己有限的内存的一种防御机制。

当计算机的价格非常昂贵时,计算也是一种更加稀有和奇特的活动,很可能只有首先具有数学倾向和独创性的人才成为程序员(尽管这样的比较很难测试,而且在政治上也很煽动)。在早期,软件通常是随计算机免费提供的,以说服人们首先购买它。最初,关于机构用户甚至会尝试编写自己的程序的想法尚不清楚。


你在说多远。我亲眼目睹了80年代初期的几台微型计算机,它们的“数据池”(即全局变量列表)包含超过60K的标签。
Evan Plaice 2012年

-1:在早期,您不仅要每月支付使用计算机的租金,而且还要为CPU周期和程序使用的内存付费。该软件远非免费,而运行该软件的成本更低。
mattnz

1
@mattnz:前一段时间,软件经常捆绑在一起,这与免费有所不同。通常,需要计算机的企业会购买或租用一台计算机,而无需为运行计算机付费,尽管通常会向个人用户收费。我还对OP声称人们不希望自己编写软件的说法感到困惑,因为那当然不是我的经验。如果您买得起计算机,那么您可以买得起开发人员,实际上那里没有太多固定的软件。
David Thornley 2012年

单作用域编程的问题很早就被认识到了,早于计算机具有数兆字节的内存。ALGOL是第一种具有词汇范围的语言,于1958
问世。– kevin cline 2012年

4

我的天哪,那是很多年前的事(冒泡的回忆:))。

我不知道您所指的语言,但总的来说,我们适应了已有的语言。这并不是一个大问题。您需要更加注意var名称,该名称经常包含对sub或function的引用(简而言之,在当时字节数是宝贵的),例如mIORead1您是否具有从文件1读取数据的处理程序。计数器变量,例如i,j,k等,如果可以重复使用,则您可以通过自己的系统知道它们的用途。更加顽固(那时没有头盔或手套):-)


3

这与PLC编程非常相似,尽管现代的PLC现在允许您在程序中具有本地的“标签”(即变量)。仍然有很多人只是使用所有全局标签进行编程。

我发现,如果要执行此操作,则需要使用结构化的命名约定。例如:Motor1_DriveContactor_Run。如果您的语言碰巧支持结构(有时称为用户定义类型),那么您也可以使用它们来创建结构化的数据层次结构,例如:Motor[1].DriveContactor.Run

这样可以使一切保持井井有条,通常,智能感知还可以帮助您。


2

我实际上学会了使用一种称为Authorware的语言进行编程,那里的一切都是全球性的。幸运的是,它确实具有数组,并且在某个点之后有一个称为列表的列表,类似于通用对象。

Authorware程序实际上具有物理结构(Authorware基于流程图的隐喻),其脚本语言基于旧式Pascal。我们所做的是将物理结构与Array中的索引相关联,并且Array索引通常包含包含List的列表,这些List被视为我们所使用的物理块的本地对象。

Authorware专为电子学习而设计,因此我们拥有的一个图标是Page。页面将被附加到框架。因此,对于第1页,我们将在索引为1的某个数组中查找(Authorware被1索引),并提取该页的数据,该数据将存储为一个列表,该列表将充当伪对象。然后页面将具有逻辑,该逻辑将按名称提取对象的“属性”。如果没有像对象这样的东西,但是有数组,则可以简单地约定数据存放在何处。

与我们从数据库中检索数据并进行依赖注入时的操作并没有什么不同,只是所有内容都是全局的,您只是选择将所有内容放到小盒子中,而仅查看您所现在关心。

根据您要尝试做的事情以及您的语言支持的情况,这可能有助于您至少将事情分解为更易于管理的部分。


我还使用了Macromedia Authorware @ amy-blankenship。我不记得上次使用它时是什么版本,也许是3。它被Flash / Showckwave取代还是仍然存在?
图兰斯·科尔多瓦

他们是不同的东西。在打包到Web上时,Macromedia调用了Shockwave的所有内容(包括Director),在版本5(两个版本)中引起了很多混乱。收购之后,Adobe停止提供Authorware,但Flash仍在继续。
艾米·布兰肯希

1

当我上大学时,我们就“全局变量问题”进行了详尽的讲授,该问题是由许多全局变量引起的错误和代码维护问题的集合。

一些变量比其他变量更危险。

安全:不会影响控制流程的变量,例如LastName

危险:影响程序控制流的任何变量,例如DeliveryStatus

最危险的第一:

  • 复合状态(模式和子模式)
  • 复合值(总计,小计)
  • 单一状态(模式)
  • 单个值(计数)

为了避免“全局变量问题”,您需要

  • 记录每个变量和函数。
  • 在源代码的同一部分中,使相关变量保持在一起(以及使用它们的代码)。
  • 隐藏“危险”变量,因此其他程序员不知道它们的存在。避免直接使用它们,尤其是在代码的其他部分。
  • 提供读取/写入危险变量的函数(因此其他程序员不需要)。

构建代码,当语言中没有可用的结构时,请使用注释和命名约定:

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

不知道他们是怎么做的。

但是我认为现代OOP语言在命名冲突方面也有非常相似的问题。

解决方案是采用命名空间。它是一个抽象概念,但已被多个实现(Java包,.NET命名空间,Python模块)广泛采用。

如果您使用的语言对命名长度的限制不是太狭窄,则可以将命名空间应用于良好的变量命名。

因此,变量名也代表变量范围。

尝试定义这样的命名模式:order_detail_product_codeorder_detail_product_unit_price。或用于临时柜台或掉期交易:tmp_itmp_swap


0

在语言中,所有变量都是全局变量(我曾经使用过几次),我们曾经使用变量命名约定。例如:如果我实际上想使用全局变量,则可以使用“ m_”或“ _”前缀。当然,这仍然依赖于开发人员遵守这一纪律

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.