- Tác giả

- Name
- Nguyễn Đức Xinh
- 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:
- Có 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
-EXITnhư 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.là exit point được đặt tên rõ ràng.PERFORM SQL-COMMIT-PROCgiố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 DIVISIONENVIRONMENT DIVISIONDATA DIVISIONPROCEDURE 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
-EXITlà 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-namelà user-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:
-PROCcho paragraph chính (procedure).-EXITcho 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 sauPERFORM.
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:
- Một paragraph chính +
-EXIT. - Paragraph điều phối
PERFORMnhiề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 +
PERFORMcho 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ó
returnnhư C/Java; control quay lại caller khi kết thúcPERFORMhoặ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
PERFORMparagraph nhỏ thay vì dùng nhiềuGO 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-EXITrõ 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ùngPERFORM ... 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 TOvà hạn chế fall-through.
