COBOL 段落编号背后的逻辑是什么?

What is the logic behind COBOL paragraph numbering?

下面的段落命名结构我已经看过很多次了:

nnnn-PARAGRAPH-NAME.

其中 nnnn 代表一个 4 位数字。

这是一个完整的例子:

0000-MAINLINE. 
    PERFORM 1000-INITIALIZE-THE-PROGRAM. 
    PERFORM 2000-PROCESS-1-BILLING-RECORD 
        UNTIL 88-100-ALL-RECORDS-PROCESSED. 
    PERFORM 3000-TERMINATE-THE-PROGRAM. 
    GOBACK. 
1000-INITIALIZE-THE-PROGRAM. 
    PERFORM 1100-VALIDATE-CONTROL-CARD. 
    PERFORM 1200-OPEN-THE-FILES. 
    PERFORM 8000-GET-NEXT-BILLING-RECORD. 
1100-VALIDATE-CONTROL-CARD. 
    PERFORM 1110-READ-CONTROL-CARD. 
    PERFORM 1120-EDIT-CONTROL-CARD. 
1110-READ-CONTROL-CARD. 
    PERFORM 9000-ABEND-THE-PROGRAM.  *> IF A READ ERROR OCCURRED 
1120-EDIT-CONTROL-CARD. 
    PERFORM 9000-ABEND-THE-PROGRAM   *> IF AN EDIT ERROR OCCURRED 
1200-OPEN-THE-FILES. 
    PERFORM 9000-ABEND-THE-PROGRAM   *> IF AN OPEN ERROR OCCURRED 
2000-PROCESS-1-BILLING-RECORD. 
    PERFORM 2100-CALCULATE-BILLABLE-AMT. 
    PERFORM 2200-PRINT-BILLING-REPORT. 
    PERFORM 8000-GET-NEXT-BILLING-RECORD. 
2200-PRINT-BILLING-REPORT. 
    PERFORM 2210-PRINT-REPORT-HEADER.  *> WHEN IT'S NEEDED 
3000-TERMINATE-THE-PROGRAM. 
    PERFORM 3100-CLOSE-THE-FILES. 
    PERFORM 3200-DISPLAY-FINAL-MESSAGES. 
8000-GET-NEXT-BILLING-RECORD. 
    PERFORM 9000-ABEND-THE-PROGRAM.    *> IF A READ ERROR OCCURRED 
9000-ABEND-THE-PROGRAM. 

因此,我的问题如下:

  1. 现在这个已经弃用了吗?
  2. 为什么这是(或曾经是)一个好习惯?
  3. 段落编号遵循什么标准?

段落名称只是标签。您可以使用任何您喜欢的格式。但是,要有用,您应该使用一些标准 - 您可能会被您的商店标准强制使用。编号可以反映您编写它们的顺序、执行的顺序、调用的深度(para1 执行 para2 执行 para3 等)或者您可以使用 alpha 表示。由你(和你的老板)决定。

说明

数字告诉你程序结构。在这个程序中:

  • 1*都是初始化程序和1000-...调用1100-...和1200-。而 1100-... 调用 1110-... 和 1120-... 等等
  • 2*是程序的主要处理逻辑
  • 3*是程序的定型处理逻辑
  • 8000 从任何地方呼叫
  • 9000 错误程序

所以程序调用结构为

                                     0000-
           +---------------------------+------------------------------+                             
         1000-                       2000-                          3000-
  +--------+------+             +------+------+               +-------+-------+ 
1100-           1200-         2100-         2200-           3100-           3200-

 etc...

具体问题

  1. 现在这个已经弃用了吗? 绝对不会,其他过程化语言应该都会用到。学习编号系统
  2. 为什么(或曾经)这是一个好习惯?这是很好的做法,因为它告诉你
    • 过程如何相互关联 - 这可能非常方便。
    • 获取过程的调用结构
    • 增进理解
    • 节省了很多时间。例如,如果您 找到 2000- 您将转到主处理逻辑
  3. 段落编号遵循什么标准?

其他点

一旦你习惯了编号系统,它就会让你更容易理解程序。不同网站的做法不同,有些网站可能使用字母作为数字的 well/instead,例如

      Perform A000-Initialise
      Perform B000-Main
      Perform C000-Finalise

 A000-Initialise.
     Perform A100-...
     etc

在任何一个站点,他们将在所有(或大多数程序)中使用相同的编号标准。

网站可能会保留第一个 number/letter 用于特定目的。这在使用 A000-、B000- 格式时更为常见。您可以使用 R... 文件 reads W... 文件 S... SQL 调用等

编号系统让有经验的程序员的生活更轻松。用过其他语言,应该会用到Cobol以外的其他过程语言。

4 位数字并没有真正用于任何用途,但如果程序结构正确,它可以帮助有经验的程序员了解他们的程序。让我们看看这个例子:

PROCEDURE DIVSION.
0000-MAINLINE.
   PERFORM OPEN-FILES
   PERFORM VALIDATE-CONTENTS
   PERFORM PROCESS-DATA
   PERFORM WRITE-REPORTS
   PERFORM CLOSE-FILES
.
CLOSE-FILE.
   PERFORM CLOSE-FILE1
   PERFORM CLOSE-FILE2
   PERFORM CLOSE-FILE3
.
PROCESS-DATA.
   PERFORM VARYING X 
              FROM 1 BY 1
             UNTIL X > NUMBER-OF-RECS
      PERFORM DO-THE-THINGS
   END-PERFORM
.
WRITE-REPORTS.
   DISPLAY 'THIS IS MY REPOR'.
.
VALIDATE-CONTENTS.
   IF REC NOT EQUAL SPACES
       SET GOOD-REC TO TRUE
   END-IF
.
OPEN-FILES.
   PERFORM OPEN-FILE1
   PERFORM OPEN-FILE2
   PERFORM OPEN-FILE3
.
DO-THE-THINGS.
   CONTINUE
.

我知道这个程序很愚蠢而且没有任何意义,但是对于这个例子来说没关系。尝试遵循此程序的流程。如果我们为每个段落开头分配一个数字并递增(因此 CLOSE-FILE 为 1,PROCESS-DATA 为 2 ...)那么主线将像这样跳来跳去:

5

4

2, 6

3

1

那"ok"对于像这样的小程序,因为我们仍然可以找到自己的出路。现在想象你的程序有数千行长,而且一切都乱七八糟。是的,你可以想出来,但如果它看起来像这样不是更容易吗:

PROCEDURE DIVSION.
0000-MAINLINE.
   PERFORM A0000-OPEN-FILES
   PERFORM B0000-VALIDATE-CONTENTS
   PERFORM C0000-PROCESS-DATA
   PERFORM D0000-WRITE-REPORTS
   PERFORM E0000-CLOSE-FILES
.
A0000-OPEN-FILES.
   PERFORM OPEN-FILE1
   PERFORM OPEN-FILE2
   PERFORM OPEN-FILE3
.
B0000-VALIDATE-CONTENTS.
   IF REC NOT EQUAL SPACES
       SET GOOD-REC TO TRUE
   END-IF
.
C0000-PROCESS-DATA.
   PERFORM VARYING X 
              FROM 1 BY 1
             UNTIL X > C1000-NUMBER-OF-RECS
      PERFORM DO-THE-THINGS
   END-PERFORM
.
C1000-DO-THE-THINGS.
   CONTINUE
.
D0000-WRITE-REPORTS.
   DISPLAY 'THIS IS MY REPOR'.
.
E0000-CLOSE-FILE.
   PERFORM CLOSE-FILE1
   PERFORM CLOSE-FILE2
   PERFORM CLOSE-FILE3
.

在我的店里,我们的做法是主线中的所有内容都以字母开头(因此是 A0000)。如果 A0000 调用某内容,则该段落将称为 A1000。如果 A1000 呼叫某物,它将是 A1100。所以我们用字符来表示嵌套。所以我可能有这样的东西:

PROCEDURE DIVSION.
0000-MAINLINE.
   PERFORM A0000-DO-SOMETHING
   PERFORM B0000-SHUTDOWN
.
A0000-DO-SOMETHING.
   PERFORM A1000-DO-MORE
   PERFORM A2000-VALIDATE-STUFF
.
A1000-DO-MORE.
   PERFORM A1100-DO-THING1
   PERFORM A1200-DO-THING2
   PERFORM A1300-DO-THING3
.

简而言之,它只是有助于导航和跟随程序。没有什么可以阻止您省略数字,但是一旦程序变得更大并且其他人需要维护它,数字将是一个很大的帮助。我讨厌处理结构不正确的程序,因为这会使调试和学习程序变得更加困难。特别是当我使用终端模拟器并且一次只能看到 20 行时。