Progress-gl - 将变量声明放在过程之上有什么好处

Progress-gl - What's benefit of placing variable declaration on top of the procedure

虽然这不是我的主要职责,但我已经做了 8 年的 Progress 4GL。我做 C++ 和 Java 很多。当用其他语言编程时,建议声明接近用法。然而,对于 4GL,我看到人们将声明放在文件的顶部。它甚至在编码标准中。

我认为将它们放在文件之上会导致 'vertical separation' 问题。在大多数其他语言中,甚至建议在声明的同一行进行赋值。

问题是为什么建议在 4GL 中这样做?有什么好处?我知道可以将声明放在文件中的任何位置,因为它是在使用之前声明的。

我认为答案与 Progress 4GL 中的范围界定或缺乏范围界定有关。

如果你习惯了Java,比如说,阅读 Progress 4GL 程序,那看起来像

DO:
    DEFINE VARIABLE x AS INTEGER INITIAL 4.
    DISPLAY x.
END.

那么您就不会期望能够在程序的其他任何地方使用 x 的这个值,并且在块中所做的任何更改都不会影响块外的任何内容。

据我了解,在程序主体内声明的所有进度变量都适用于整个程序,除非它们声明在内部过程或函数内,在这种情况下它们适用于过程或函数.

(顺便说一下,您在内部 procedure/function 中使用的任何默认缓冲区 [即未声明的] 都适用于整个程序,而不仅仅是过程或函数,因此您需要非常小心地明确声明缓冲区您打算递归使用的函数)。

因此,我认为在程序开头声明变量的约定是为了反映 Progress 将处理已经这样做的事实,无论您将声明放在何处。

当程序的范围可以缩小时,将任何内容作为一个整体来确定范围绝对没有任何好处。

范围越小越容易测试,命名空间冲突的可能性越小,出错的机会也越少。

范围紧密的命名缓冲区在写入数据库时​​特别有用,因为它们消除了代码的其他部分使用相同缓冲区并导致共享锁的可能性,即编译失败:

do for b-customer transaction:
    find b-customer where .... exclusive...
    ...
end.
...
find b-customer...

另一方面,与代码主体共享范围的过程和函数(以及包含文件...)是错误的主要来源,因为当您选择变量或其他任何东西时,您永远无法完全确定它在哪里...

当然,所有这些只是基本的结构化编程。这对每一种语言都是正确的,并且自 70 年代以来就被接受了。

你通常看到的变量定义在最上面的"reason"很简单。习惯。在过去的糟糕日子里,事情就是这样。

很多老代码,或者老化石写的代码,都是这么写的。不限语言。

有些语言(想到 COBOL)甚至将其形式化。

这种方法有什么优势吗?

不是特别喜欢。我想你可能会争论 "they are all in one place and easy to find" 但这不是很有说服力。

"Habit" 实际上更引人注目 ;) 如果您正在与一个期望某种风格的团队一起工作,或者在一个特定风格盛行的应用程序中工作,那么您应该在单方面抛出一种新方法之前三思而后行做事 - 混乱可能是比获得的优势更大的问题。