Какова логика нумерации абзацев COBOL?

Я много раз видел следующую структуру именования абзацев:

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. Каким критериям соответствует нумерация абзацев?

person harrison4    schedule 18.05.2018    source источник


Ответы (3)


Объяснение

Цифры сообщают вам структуру программы. В этой программе:

  • 1 * - это все процедуры инициализации и 1000 -... вызовы 1100 -... и 1200-. Пока 1100 -... звонит 1110 -... и 1120 -... и т. Д.
  • 2 * - это основная логическая процедура обработки.
  • 3 * - логические процедуры обработки завершения
  • 8000 звонят откуда угодно
  • 9000 процедуры обработки ошибок

Итак, структура вызова программы

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

 etc...

Конкретные вопросы

  1. Сейчас это устарело? Абсолютно нет. Его следует использовать на других процедурных языках. Изучите систему нумерации
  2. Why is (or was) it a good practice? It is good practice because it tells you
    • How procedure relate to one another - that can be very handy.
    • Структура вызова для перехода к процедуре
    • Улучшает понимание
    • экономит много времени. Например, если вы найдете 2000-, вы перейдете к основной логике обработки.
  3. Каким критериям соответствует нумерация абзацев?

Прочие моменты

Как только вы привыкнете к системе нумерации, понимание программы станет намного проще. На разных сайтах это делается по-разному, некоторые могут использовать буквы / вместо цифр, например.

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

 A000-Initialise.
     Perform A100-...
     etc

На любом сайте они будут использовать один и тот же стандарт нумерации для всех (или большинства программ).

Сайты могут зарезервировать первую цифру / букву для определенных целей. Это чаще встречается при использовании формата A000-, B000-. Вы можете использовать R ... для чтения W ... для файла записи S ... для SQL вызовы и т. д.

Система нумерации упрощает жизнь опытного программиста. Поскольку он работал с другими языками, следует использовать другие процедурные языки, кроме Cobol.

person Bruce Martin    schedule 18.05.2018
comment
@MarkSchultheiss Значит, абзац FETCH CURSOR, который вызывается с номерами 1000 и 2000, должен быть помещен в 8000? Ваше здоровье! - person harrison4; 18.05.2018
comment
FETCH CURSOR, вероятно, должен идти на 8000 - проверьте, как это делают другие программы на вашем сайте. - person Bruce Martin; 18.05.2018
comment
Возможно, замену всех программ инициализации представляют собой процедуры инициализации программ. - person Mark Schultheiss; 18.05.2018
comment
Мы обрабатываем информацию о типах утилит: запускаем Z9000 и просто увеличиваем число, когда есть другая утилита. Так что все, что повсюду называют, всегда начинается с Z9. - person SaggingRufus; 18.05.2018

Четырехзначное число на самом деле ни для чего не используется, НО, если программа правильно структурирована, это может помочь опытному программисту разобраться в программе. Давайте посмотрим на этот пример:

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

Это "нормально" для такой маленькой программы, потому что мы все еще можем найти свой путь. Теперь представьте, что ваша программа состоит из тысяч строк, и все в ней не в порядке. Да, вы можете понять это, но было бы намного проще, если бы это выглядело так:

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 строк за раз.

person SaggingRufus    schedule 18.05.2018

Имена абзацев - это только метки. Вы можете использовать любой формат, который вам нравится. Однако, чтобы быть полезным, вы должны использовать какой-то стандарт - вы можете быть вынуждены делать это по стандартам вашего магазина. Нумерация может отражать порядок, в котором вы их написали, порядок их выполнения, глубину вызова (para1 выполняет para2 выполняет para3 и т. Д.) Или вы можете использовать альфа-представление. На ваше усмотрение (и ваш босс).

person NicC    schedule 18.05.2018