Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

Hiểu về Paragraph trong COBOL: Cấu trúc, PERFORM và EXIT

Paragraph trong COBOL là gì?

Trong COBOL, paragraph là đơn vị cơ bản của executable logic trong PROCEDURE DIVISION. Nó rất giống function hoặc subroutine trong các ngôn ngữ hiện đại:

  • tên (label) để gọi bằng câu lệnh PERFORM.
  • Chứa các câu lệnh thực thi tuần tự.
  • Khi paragraph kết thúc, control bình thường quay lại nơi gọi.
  • Nhiều team dùng paragraph -EXIT như một return point theo convention.

Ví dụ pattern thường gặp:

SQL-COMMIT-PROC.
    EXEC SQL COMMIT WORK RELEASE END-EXEC.
SQL-COMMIT-EXIT.
    EXIT.

Paragraph khác gọi nó bằng PERFORM:

PERFORM SQL-COMMIT-PROC.

Và dạng THRU sẽ chạy tất cả paragraph từ tên đầu tới label exit:

PERFORM LOGON-PROC THRU LOGON-EXIT.

Về ý nghĩa:

  • SQL-COMMIT-PROC. giống thân của một function.
  • SQL-COMMIT-EXIT.exit point được đặt tên rõ ràng.
  • PERFORM SQL-COMMIT-PROC giống như gọi function.

Cấu trúc chương trình COBOL và vị trí của Paragraph

Một chương trình COBOL cơ bản có các division:

  • IDENTIFICATION DIVISION
  • ENVIRONMENT DIVISION
  • DATA DIVISION
  • PROCEDURE DIVISION

Trong PROCEDURE DIVISION thường có:

  • Section (tuỳ chọn, hay dùng trong chương trình lớn).
  • Paragraph bên trong section, hoặc trực tiếp trong PROCEDURE DIVISION.

Ví dụ rút gọn:

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE.

PROCEDURE DIVISION.
MAIN-LOGIC SECTION.
MAIN-START.
    PERFORM INITIALIZE-PROC
    PERFORM PROCESS-ORDERS
    PERFORM FINALIZE-PROC
    GOBACK.

INITIALIZE-PROC.
    ... initialization statements ...
INITIALIZE-EXIT.
    EXIT.

PROCESS-ORDERS.
    ... processing statements ...
PROCESS-ORDERS-EXIT.
    EXIT.

FINALIZE-PROC.
    ... cleanup statements ...
FINALIZE-EXIT.
    EXIT.

Điểm chính:

  • Section gom nhóm các paragraph liên quan.
  • Paragraph là đơn vị logic được PERFORM.
  • Paragraph -EXIT là convention cho paragraph cuối của một routine.

Cú pháp cơ bản của Paragraph

Định nghĩa paragraph:

paragraph-name.
    statement-1
    statement-2
    ...

Quy tắc đặt tên

  • paragraph-nameuser-defined word kết thúc bằng dấu chấm.
  • Thường dùng chữ in hoa, có gạch nối: SQL-COMMIT-PROC, LOGON-PROC, LOGON-EXIT.
  • Convention phổ biến:
    • -PROC cho paragraph chính (procedure).
    • -EXIT cho paragraph exit.

Thân Paragraph

Thân paragraph chứa các câu lệnh trong PROCEDURE DIVISION:

VALIDATE-ORDER-PROC.
    IF ORDER-NUMBER = ZERO
        MOVE 'Y' TO ERROR-FLAG
        MOVE 'ORDER NUMBER MISSING' TO ERROR-MESSAGE
    END-IF.
VALIDATE-ORDER-EXIT.
    EXIT.

Paragraph kết thúc khi:

  • Control fall-through sang paragraph tiếp theo, hoặc
  • Gặp GOBACK, EXIT PROGRAM, STOP RUN, hoặc
  • Kết thúc phạm vi PERFORM ... THRU ....

Paragraph, Section và Sentence

Trong PROCEDURE DIVISION có ba mức chính:

  • Section – nhóm paragraph, dùng cho flow cấp cao.
  • Paragraph – block logic gắn nhãn.
  • Sentence – nhóm một hoặc nhiều câu lệnh kết thúc bằng dấu chấm ..

Bảng so sánh khái niệm

Concept COBOL Term Vai trò / Granularity Cách dùng điển hình
High Section Nhóm paragraph liên quan Tổ chức main flow: init, processing, end
Medium Paragraph Đơn vị thực thi, giống function nhỏ Business rule, I/O, DB call
Low Sentence Nhóm câu lệnh kết thúc bằng dấu chấm Bước logic nhỏ trong paragraph

Trong coding style hiện đại:

  • Có thể không dùng section, chỉ dùng paragraph.
  • Paragraph là đơn vị chính để PERFORM.
  • Hạn chế sentence quá dài với nhiều lệnh; nên tách thành các sentence ngắn, rõ ràng.

Gọi Paragraph bằng PERFORM

PERFORM là cách bạn invoke một paragraph.

PERFORM một paragraph

PERFORM SQL-COMMIT-PROC.
  • Control nhảy tới SQL-COMMIT-PROC..
  • Chạy các câu lệnh trong đó.
  • Khi paragraph (hoặc -EXIT) kết thúc, control quay lại sau PERFORM.

PERFORM THRU – gọi một dải paragraph

PERFORM LOGON-PROC THRU LOGON-EXIT.

Chạy tất cả paragraph từ LOGON-PROC tới LOGON-EXIT (bao gồm cả hai).

Ví dụ cấu trúc:

LOGON-PROC.
    PERFORM LOGON-VALIDATE-INPUT
    PERFORM LOGON-CALL-SECURITY
    PERFORM LOGON-HANDLE-RESULT
LOGON-EXIT.
    EXIT.

LOGON-VALIDATE-INPUT.
    ...
LOGON-CALL-SECURITY.
    ...
LOGON-HANDLE-RESULT.
    ...

Hai style thường gặp:

  1. Một paragraph chính + -EXIT.
  2. Paragraph điều phối PERFORM nhiều paragraph nhỏ hơn + -EXIT.

Style (2) giúp chia nhỏ logic phức tạp, dễ tái sử dụng và test.

Inline PERFORM vs Paragraph PERFORM

PERFORM ... UNTIL có thể dùng với code inline, nhưng:

  • Dùng inline cho loop nhỏ, đơn giản.
  • Dùng paragraph + PERFORM cho business logic tái sử dụng.

Ví dụ inline:

PERFORM VARYING I FROM 1 BY 1 UNTIL I > MAX-COUNT
    ADD 1 TO TOTAL-COUNT
END-PERFORM.

Ví dụ Paragraph COMMIT SQL

SQL-COMMIT-PROC.
    EXEC SQL
        COMMIT WORK RELEASE
    END-EXEC.
SQL-COMMIT-EXIT.
    EXIT.

Caller:

PROCESS-ORDERS.
    PERFORM READ-ORDER-PROC
    PERFORM UPDATE-ORDER-PROC
    PERFORM SQL-COMMIT-PROC
    PERFORM PROCESS-ORDERS-EXIT
    .
PROCESS-ORDERS-EXIT.
    EXIT.

PROCESS-ORDERS là routine cấp cao, xử lý xong thì PERFORM SQL-COMMIT-PROC để commit transaction.

Phiên bản có error handling:

SQL-COMMIT-PROC.
    EXEC SQL
        COMMIT WORK
    END-EXEC
    IF SQLCODE NOT = 0
        MOVE 'Y' TO ERROR-FLAG
        MOVE 'COMMIT FAILED' TO ERROR-MESSAGE
        PERFORM LOG-ERROR-PROC
    END-IF
SQL-COMMIT-EXIT.
    EXIT.

So sánh Paragraph COBOL với Function trong ngôn ngữ khác

Feature COBOL Paragraph C Function Java Method
Unit of logic Paragraph Function Method
Name Label kết thúc bằng . Identifier Identifier trong class
Call syntax PERFORM PARAGRAPH function(); obj.method();
Return value Qua data item chung Return type Return type
Multiple exits GOBACK, EXIT, ... return return
Grouped unit Section / PERFORM THRU File/module Class/package
Parameter Data Division items Parameter list Parameter list
Scope biến Data Division toàn chương Local/global Field / local variable

Khác biệt quan trọng:

  • Paragraph không có parameter list; dùng shared data trong WORKING-STORAGE, LINKAGE SECTION, ...
  • Không có return như C/Java; control quay lại caller khi kết thúc PERFORM hoặc gặp lệnh kết thúc chương trình.

Best Practice khi thiết kế Paragraph

  • Mỗi paragraph nên có một trách nhiệm rõ ràng (single responsibility).
  • Đặt tên có ý nghĩa, nhất quán (READ-CUSTOMER-PROC, VALIDATE-ORDER-PROC, ...).
  • Tránh paragraph quá dài (hàng trăm dòng logic lẫn lộn).
  • Ưu tiên PERFORM paragraph nhỏ thay vì dùng nhiều GO TO.

Paragraph và Control Flow

  • Mặc định, control fall-through từ paragraph này sang paragraph tiếp theo nếu không quay về caller.
  • Điều này dễ gây bug nếu ai đó chèn thêm paragraph ở giữa.
  • Best practice: dùng paragraph “controller” gọi PERFORM, mỗi routine có paragraph -EXIT rõ ràng.

Kết hợp với loop:

PROCESS-ORDERS.
    PERFORM PROCESS-SINGLE-ORDER
        UNTIL NO-MORE-ORDERS = 'Y'
PROCESS-ORDERS-EXIT.
    EXIT.

PROCESS-SINGLE-ORDER giống thân vòng while trong ngôn ngữ khác.

Tổng kết

  • Paragraph là đơn vị executable logic chính trong COBOL, tương đương function/subroutine.
  • Được gọi bằng PERFORM, có thể dùng PERFORM ... THRU ... để gọi dải paragraph.
  • Coding style hiện đại khuyến khích paragraph nhỏ, tên rõ ràng, tránh GO TO và hạn chế fall-through.