MainframeMaster

COBOL Code Readability

Code readability is fundamental to writing maintainable COBOL programs. Readable code is easier to understand, debug, modify, and maintain, reducing the time and effort required for future development work. Good readability practices make COBOL programs more accessible to both current and future developers.

Understanding Code Readability

Readable code follows consistent patterns, uses clear and descriptive names, includes meaningful comments, and is organized in a logical manner. The goal is to make the code self-documenting so that anyone reading it can quickly understand its purpose, structure, and functionality without extensive external documentation.

Naming Conventions

1. Descriptive Variable Names

Variable names should clearly describe what the data represents and how it's used in the program. Good names make the code self-documenting and reduce the need for additional comments to explain what variables contain or represent.

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
IDENTIFICATION DIVISION. PROGRAM-ID. READABLE-NAMING-EXAMPLE. *> This program demonstrates good naming conventions for readability DATA DIVISION. WORKING-STORAGE SECTION. *> Good naming: descriptive and clear 01 CUSTOMER-ACCOUNT-DATA. 05 CUSTOMER-ACCOUNT-NUMBER PIC 9(10). 05 CUSTOMER-FULL-NAME PIC X(50). 05 CUSTOMER-ACCOUNT-BALANCE PIC 9(10)V99. 05 CUSTOMER-ACCOUNT-TYPE PIC X(1). 88 CHECKING-ACCOUNT VALUE 'C'. 88 SAVINGS-ACCOUNT VALUE 'S'. 88 BUSINESS-ACCOUNT VALUE 'B'. *> Good naming: indicates purpose and usage 01 TRANSACTION-PROCESSING-CONTROLS. 05 CURRENT-TRANSACTION-AMOUNT PIC 9(8)V99. 05 TRANSACTION-PROCESSING-STATUS PIC X(1). 88 TRANSACTION-SUCCESSFUL VALUE 'S'. 88 TRANSACTION-FAILED VALUE 'F'. 05 TRANSACTION-ERROR-MESSAGE PIC X(100). *> Good naming: shows data relationships 01 ACCOUNT-BALANCE-CALCULATIONS. 05 PREVIOUS-ACCOUNT-BALANCE PIC 9(10)V99. 05 TRANSACTION-AMOUNT PIC 9(8)V99. 05 NEW-ACCOUNT-BALANCE PIC 9(10)V99. 05 BALANCE-CHANGE-AMOUNT PIC S9(8)V99. PROCEDURE DIVISION. MAIN-PROCESSING-LOGIC. DISPLAY 'Starting customer account processing...' *> Clear procedure names that describe their function PERFORM INITIALIZE-CUSTOMER-ACCOUNT-DATA PERFORM VALIDATE-CUSTOMER-ACCOUNT-INPUT PERFORM PROCESS-CUSTOMER-TRANSACTION PERFORM UPDATE-CUSTOMER-ACCOUNT-BALANCE PERFORM DISPLAY-TRANSACTION-RESULTS STOP RUN. INITIALIZE-CUSTOMER-ACCOUNT-DATA. *> Procedure name clearly indicates what it does MOVE ZERO TO CUSTOMER-ACCOUNT-NUMBER MOVE SPACES TO CUSTOMER-FULL-NAME MOVE ZERO TO CUSTOMER-ACCOUNT-BALANCE MOVE 'C' TO CUSTOMER-ACCOUNT-TYPE MOVE 'S' TO TRANSACTION-PROCESSING-STATUS MOVE SPACES TO TRANSACTION-ERROR-MESSAGE DISPLAY 'Customer account data initialized'. VALIDATE-CUSTOMER-ACCOUNT-INPUT. *> Clear validation procedure with descriptive name IF CUSTOMER-ACCOUNT-NUMBER = 0 MOVE 'F' TO TRANSACTION-PROCESSING-STATUS MOVE 'Customer account number is required' TO TRANSACTION-ERROR-MESSAGE ELSE IF CUSTOMER-FULL-NAME = SPACES MOVE 'F' TO TRANSACTION-PROCESSING-STATUS MOVE 'Customer name is required' TO TRANSACTION-ERROR-MESSAGE ELSE IF CUSTOMER-ACCOUNT-BALANCE < 0 MOVE 'F' TO TRANSACTION-PROCESSING-STATUS MOVE 'Account balance cannot be negative' TO TRANSACTION-ERROR-MESSAGE END-IF END-IF END-IF. PROCESS-CUSTOMER-TRANSACTION. *> Descriptive procedure name for transaction processing IF TRANSACTION-SUCCESSFUL PERFORM CALCULATE-NEW-ACCOUNT-BALANCE PERFORM VALIDATE-ACCOUNT-BALANCE-LIMITS END-IF. CALCULATE-NEW-ACCOUNT-BALANCE. *> Clear calculation procedure MOVE CUSTOMER-ACCOUNT-BALANCE TO PREVIOUS-ACCOUNT-BALANCE MOVE 100.00 TO TRANSACTION-AMOUNT ADD TRANSACTION-AMOUNT TO CUSTOMER-ACCOUNT-BALANCE MOVE CUSTOMER-ACCOUNT-BALANCE TO NEW-ACCOUNT-BALANCE COMPUTE BALANCE-CHANGE-AMOUNT = NEW-ACCOUNT-BALANCE - PREVIOUS-ACCOUNT-BALANCE. VALIDATE-ACCOUNT-BALANCE-LIMITS. *> Clear validation procedure for balance limits IF CHECKING-ACCOUNT IF CUSTOMER-ACCOUNT-BALANCE > 100000.00 MOVE 'F' TO TRANSACTION-PROCESSING-STATUS MOVE 'Checking account balance exceeds limit' TO TRANSACTION-ERROR-MESSAGE END-IF ELSE IF SAVINGS-ACCOUNT IF CUSTOMER-ACCOUNT-BALANCE > 500000.00 MOVE 'F' TO TRANSACTION-PROCESSING-STATUS MOVE 'Savings account balance exceeds limit' TO TRANSACTION-ERROR-MESSAGE END-IF END-IF END-IF. UPDATE-CUSTOMER-ACCOUNT-BALANCE. *> Clear update procedure IF TRANSACTION-SUCCESSFUL DISPLAY 'Account balance updated successfully' ELSE DISPLAY 'Account balance update failed: ' TRANSACTION-ERROR-MESSAGE END-IF. DISPLAY-TRANSACTION-RESULTS. *> Clear display procedure DISPLAY 'Transaction Processing Results:' DISPLAY 'Customer Account: ' CUSTOMER-ACCOUNT-NUMBER DISPLAY 'Customer Name: ' CUSTOMER-FULL-NAME DISPLAY 'Previous Balance: ' PREVIOUS-ACCOUNT-BALANCE DISPLAY 'Transaction Amount: ' TRANSACTION-AMOUNT DISPLAY 'New Balance: ' NEW-ACCOUNT-BALANCE DISPLAY 'Balance Change: ' BALANCE-CHANGE-AMOUNT.

This example demonstrates excellent naming conventions that make the code self-documenting. Variable names like CUSTOMER-ACCOUNT-NUMBER and TRANSACTION-PROCESSING-STATUS clearly indicate their purpose and usage. Procedure names like VALIDATE-CUSTOMER-ACCOUNT-INPUT and CALCULATE-NEW-ACCOUNT-BALANCE describe exactly what each section does. This approach makes the code much easier to understand and maintain.

2. Consistent Naming Patterns

Consistent naming patterns help developers quickly understand the structure and relationships in the code. Using prefixes, suffixes, and consistent word ordering makes it easier to locate related variables and understand their purpose.

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
IDENTIFICATION DIVISION. PROGRAM-ID. CONSISTENT-NAMING-PATTERNS. *> This program demonstrates consistent naming patterns DATA DIVISION. WORKING-STORAGE SECTION. *> Consistent prefix pattern: CUSTOMER- for all customer-related data 01 CUSTOMER-MASTER-RECORD. 05 CUSTOMER-ID PIC 9(8). 05 CUSTOMER-NAME PIC X(50). 05 CUSTOMER-ADDRESS PIC X(100). 05 CUSTOMER-PHONE PIC X(15). 05 CUSTOMER-EMAIL PIC X(100). 05 CUSTOMER-CREATION-DATE PIC X(10). 05 CUSTOMER-LAST-UPDATE-DATE PIC X(10). *> Consistent prefix pattern: ACCOUNT- for all account-related data 01 ACCOUNT-DETAILS-RECORD. 05 ACCOUNT-NUMBER PIC 9(10). 05 ACCOUNT-TYPE PIC X(1). 05 ACCOUNT-BALANCE PIC 9(10)V99. 05 ACCOUNT-OPEN-DATE PIC X(10). 05 ACCOUNT-STATUS PIC X(1). 05 ACCOUNT-CREDIT-LIMIT PIC 9(8)V99. *> Consistent suffix pattern: -COUNT for all counter variables 01 PROCESSING-STATISTICS. 05 TOTAL-RECORDS-COUNT PIC 9(6). 05 VALID-RECORDS-COUNT PIC 9(6). 05 ERROR-RECORDS-COUNT PIC 9(6). 05 PROCESSED-RECORDS-COUNT PIC 9(6). *> Consistent suffix pattern: -FLAG for all boolean indicators 01 PROCESSING-CONTROL-FLAGS. 05 END-OF-FILE-FLAG PIC X(1). 88 END-OF-FILE VALUE 'Y'. 88 NOT-END-OF-FILE VALUE 'N'. 05 VALIDATION-ERROR-FLAG PIC X(1). 88 VALIDATION-ERROR VALUE 'Y'. 88 NO-VALIDATION-ERROR VALUE 'N'. 05 PROCESSING-COMPLETE-FLAG PIC X(1). 88 PROCESSING-COMPLETE VALUE 'Y'. 88 PROCESSING-INCOMPLETE VALUE 'N'. *> Consistent pattern: -MESSAGE for all error messages 01 ERROR-MESSAGES. 05 FILE-ERROR-MESSAGE PIC X(100). 05 VALIDATION-ERROR-MESSAGE PIC X(100). 05 PROCESSING-ERROR-MESSAGE PIC X(100). 05 SYSTEM-ERROR-MESSAGE PIC X(100). PROCEDURE DIVISION. MAIN-PROCESSING-ROUTINE. *> Consistent procedure naming: descriptive action names PERFORM INITIALIZE-PROCESSING-VARIABLES PERFORM OPEN-INPUT-FILES PERFORM PROCESS-ALL-RECORDS PERFORM CLOSE-INPUT-FILES PERFORM DISPLAY-PROCESSING-STATISTICS STOP RUN. INITIALIZE-PROCESSING-VARIABLES. *> Consistent initialization pattern MOVE ZERO TO TOTAL-RECORDS-COUNT MOVE ZERO TO VALID-RECORDS-COUNT MOVE ZERO TO ERROR-RECORDS-COUNT MOVE ZERO TO PROCESSED-RECORDS-COUNT SET NOT-END-OF-FILE TO TRUE SET NO-VALIDATION-ERROR TO TRUE SET PROCESSING-INCOMPLETE TO TRUE MOVE SPACES TO FILE-ERROR-MESSAGE MOVE SPACES TO VALIDATION-ERROR-MESSAGE MOVE SPACES TO PROCESSING-ERROR-MESSAGE MOVE SPACES TO SYSTEM-ERROR-MESSAGE. OPEN-INPUT-FILES. *> Consistent file operation naming DISPLAY 'Opening input files...' *> File opening logic would go here. PROCESS-ALL-RECORDS. *> Consistent processing pattern PERFORM UNTIL END-OF-FILE PERFORM READ-NEXT-RECORD IF NOT-END-OF-FILE PERFORM VALIDATE-RECORD-DATA IF NO-VALIDATION-ERROR PERFORM PROCESS-VALID-RECORD ELSE PERFORM HANDLE-VALIDATION-ERROR END-IF END-IF END-PERFORM. READ-NEXT-RECORD. *> Consistent I/O operation naming ADD 1 TO TOTAL-RECORDS-COUNT *> Record reading logic would go here. VALIDATE-RECORD-DATA. *> Consistent validation naming IF CUSTOMER-ID = 0 SET VALIDATION-ERROR TO TRUE MOVE 'Invalid customer ID' TO VALIDATION-ERROR-MESSAGE ELSE IF CUSTOMER-NAME = SPACES SET VALIDATION-ERROR TO TRUE MOVE 'Customer name is required' TO VALIDATION-ERROR-MESSAGE END-IF END-IF. PROCESS-VALID-RECORD. *> Consistent processing naming ADD 1 TO VALID-RECORDS-COUNT ADD 1 TO PROCESSED-RECORDS-COUNT *> Record processing logic would go here. HANDLE-VALIDATION-ERROR. *> Consistent error handling naming ADD 1 TO ERROR-RECORDS-COUNT DISPLAY 'Validation error: ' VALIDATION-ERROR-MESSAGE. CLOSE-INPUT-FILES. *> Consistent file operation naming DISPLAY 'Closing input files...' *> File closing logic would go here. DISPLAY-PROCESSING-STATISTICS. *> Consistent display naming DISPLAY 'Processing Statistics:' DISPLAY 'Total records: ' TOTAL-RECORDS-COUNT DISPLAY 'Valid records: ' VALID-RECORDS-COUNT DISPLAY 'Error records: ' ERROR-RECORDS-COUNT DISPLAY 'Processed records: ' PROCESSED-RECORDS-COUNT.

This example shows consistent naming patterns that make the code structure immediately clear. All customer-related variables use the CUSTOMER- prefix, all counters use the -COUNT suffix, all flags use the -FLAG suffix, and all error messages use the -MESSAGE suffix. This consistency helps developers quickly understand relationships and locate related variables throughout the program.

Code Structure and Organization

1. Logical Procedure Organization

Organizing procedures in a logical order that follows the natural flow of the business process makes the code easier to follow and understand. Related procedures should be grouped together, and the main procedure should provide a clear overview of the program's structure.

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
IDENTIFICATION DIVISION. PROGRAM-ID. WELL-ORGANIZED-STRUCTURE. *> This program demonstrates logical procedure organization DATA DIVISION. WORKING-STORAGE SECTION. 01 CUSTOMER-PROCESSING-DATA. 05 CUSTOMER-RECORD-COUNT PIC 9(6) VALUE 0. 05 PROCESSING-STATUS PIC X(1). 88 PROCESSING-SUCCESS VALUE 'S'. 88 PROCESSING-FAILURE VALUE 'F'. PROCEDURE DIVISION. *> Main procedure provides clear program overview MAIN-CUSTOMER-PROCESSING. DISPLAY 'Starting Customer Processing System' *> Logical flow: Initialize -> Process -> Validate -> Update -> Report PERFORM INITIALIZE-CUSTOMER-PROCESSING PERFORM PROCESS-CUSTOMER-RECORDS PERFORM VALIDATE-PROCESSING-RESULTS PERFORM UPDATE-CUSTOMER-DATABASE PERFORM GENERATE-PROCESSING-REPORT PERFORM CLEANUP-PROCESSING-RESOURCES DISPLAY 'Customer Processing System Completed' STOP RUN. *> ======================================== *> INITIALIZATION SECTION *> ======================================== INITIALIZE-CUSTOMER-PROCESSING. *> Grouped initialization procedures PERFORM INITIALIZE-PROCESSING-VARIABLES PERFORM INITIALIZE-FILE-HANDLES PERFORM INITIALIZE-ERROR-HANDLING PERFORM VALIDATE-SYSTEM-ENVIRONMENT. INITIALIZE-PROCESSING-VARIABLES. MOVE 0 TO CUSTOMER-RECORD-COUNT SET PROCESSING-SUCCESS TO TRUE DISPLAY 'Processing variables initialized'. INITIALIZE-FILE-HANDLES. DISPLAY 'Initializing file handles...' *> File initialization logic. INITIALIZE-ERROR-HANDLING. DISPLAY 'Initializing error handling...' *> Error handling setup. VALIDATE-SYSTEM-ENVIRONMENT. DISPLAY 'Validating system environment...' *> Environment validation. *> ======================================== *> PROCESSING SECTION *> ======================================== PROCESS-CUSTOMER-RECORDS. *> Grouped processing procedures PERFORM OPEN-CUSTOMER-FILES PERFORM READ-AND-PROCESS-RECORDS PERFORM CLOSE-CUSTOMER-FILES. OPEN-CUSTOMER-FILES. DISPLAY 'Opening customer files...' *> File opening logic. READ-AND-PROCESS-RECORDS. PERFORM UNTIL END-OF-FILE PERFORM READ-NEXT-CUSTOMER-RECORD IF NOT-END-OF-FILE PERFORM VALIDATE-CUSTOMER-RECORD IF RECORD-VALID PERFORM PROCESS-CUSTOMER-RECORD ELSE PERFORM HANDLE-INVALID-RECORD END-IF END-IF END-PERFORM. READ-NEXT-CUSTOMER-RECORD. ADD 1 TO CUSTOMER-RECORD-COUNT *> Record reading logic. VALIDATE-CUSTOMER-RECORD. *> Grouped validation procedures PERFORM VALIDATE-CUSTOMER-ID PERFORM VALIDATE-CUSTOMER-NAME PERFORM VALIDATE-CUSTOMER-ADDRESS PERFORM VALIDATE-CUSTOMER-PHONE. VALIDATE-CUSTOMER-ID. IF CUSTOMER-ID = 0 SET RECORD-INVALID TO TRUE END-IF. VALIDATE-CUSTOMER-NAME. IF CUSTOMER-NAME = SPACES SET RECORD-INVALID TO TRUE END-IF. VALIDATE-CUSTOMER-ADDRESS. IF CUSTOMER-ADDRESS = SPACES SET RECORD-INVALID TO TRUE END-IF. VALIDATE-CUSTOMER-PHONE. IF CUSTOMER-PHONE = SPACES SET RECORD-INVALID TO TRUE END-IF. PROCESS-CUSTOMER-RECORD. *> Grouped processing procedures PERFORM CALCULATE-CUSTOMER-STATISTICS PERFORM UPDATE-CUSTOMER-FIELDS PERFORM WRITE-CUSTOMER-RECORD. CALCULATE-CUSTOMER-STATISTICS. *> Statistics calculation logic. UPDATE-CUSTOMER-FIELDS. *> Field update logic. WRITE-CUSTOMER-RECORD. *> Record writing logic. HANDLE-INVALID-RECORD. DISPLAY 'Invalid record encountered' *> Error handling logic. CLOSE-CUSTOMER-FILES. DISPLAY 'Closing customer files...' *> File closing logic. *> ======================================== *> VALIDATION SECTION *> ======================================== VALIDATE-PROCESSING-RESULTS. *> Grouped validation procedures PERFORM VALIDATE-RECORD-COUNTS PERFORM VALIDATE-PROCESSING-STATUS PERFORM VALIDATE-SYSTEM-INTEGRITY. VALIDATE-RECORD-COUNTS. IF CUSTOMER-RECORD-COUNT = 0 SET PROCESSING-FAILURE TO TRUE END-IF. VALIDATE-PROCESSING-STATUS. *> Status validation logic. VALIDATE-SYSTEM-INTEGRITY. *> System integrity checks. *> ======================================== *> UPDATE SECTION *> ======================================== UPDATE-CUSTOMER-DATABASE. *> Grouped update procedures PERFORM BACKUP-CURRENT-DATABASE PERFORM APPLY-CUSTOMER-UPDATES PERFORM VERIFY-DATABASE-INTEGRITY. BACKUP-CURRENT-DATABASE. DISPLAY 'Backing up current database...' *> Backup logic. APPLY-CUSTOMER-UPDATES. DISPLAY 'Applying customer updates...' *> Update logic. VERIFY-DATABASE-INTEGRITY. DISPLAY 'Verifying database integrity...' *> Integrity verification. *> ======================================== *> REPORTING SECTION *> ======================================== GENERATE-PROCESSING-REPORT. *> Grouped reporting procedures PERFORM CREATE-REPORT-HEADER PERFORM GENERATE-REPORT-DATA PERFORM FORMAT-REPORT-OUTPUT PERFORM DISPLAY-REPORT-RESULTS. CREATE-REPORT-HEADER. DISPLAY 'Creating report header...' *> Header creation logic. GENERATE-REPORT-DATA. DISPLAY 'Generating report data...' *> Data generation logic. FORMAT-REPORT-OUTPUT. DISPLAY 'Formatting report output...' *> Output formatting logic. DISPLAY-REPORT-RESULTS. DISPLAY 'Processing Report:' DISPLAY 'Records processed: ' CUSTOMER-RECORD-COUNT DISPLAY 'Processing status: ' PROCESSING-STATUS. *> ======================================== *> CLEANUP SECTION *> ======================================== CLEANUP-PROCESSING-RESOURCES. *> Grouped cleanup procedures PERFORM RELEASE-MEMORY-RESOURCES PERFORM CLOSE-SYSTEM-FILES PERFORM RESET-PROCESSING-FLAGS. RELEASE-MEMORY-RESOURCES. DISPLAY 'Releasing memory resources...' *> Memory cleanup logic. CLOSE-SYSTEM-FILES. DISPLAY 'Closing system files...' *> File cleanup logic. RESET-PROCESSING-FLAGS. DISPLAY 'Resetting processing flags...' *> Flag reset logic.

This example demonstrates excellent code organization with clear section headers and logical grouping of related procedures. The main procedure provides a high-level overview of the program flow, while related procedures are grouped together under descriptive section headers. This organization makes it easy to understand the program structure and locate specific functionality.

2. Meaningful Comments and Documentation

Comments should explain the "why" behind the code, not just the "what". Good comments provide context, explain business logic, document complex algorithms, and help future maintainers understand the reasoning behind implementation decisions.

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
IDENTIFICATION DIVISION. PROGRAM-ID. WELL-DOCUMENTED-CODE. AUTHOR. DEVELOPMENT-TEAM. DATE-WRITTEN. 2024-01-15. DATE-COMPILED. 2024-01-15. *> ================================================================ *> PROGRAM PURPOSE: *> This program processes customer account transactions and updates *> account balances. It handles deposits, withdrawals, and transfers *> while maintaining audit trails and ensuring data integrity. *> *> BUSINESS RULES: *> 1. All transactions must be validated before processing *> 2. Account balances cannot go below zero for checking accounts *> 3. Savings accounts have a minimum balance requirement of $100 *> 4. All transactions are logged for audit purposes *> 5. Daily transaction limits apply based on account type *> ================================================================ DATA DIVISION. WORKING-STORAGE SECTION. *> ================================================================ *> CUSTOMER ACCOUNT DATA STRUCTURE *> This structure holds all customer account information including *> identification, balance, and account type for processing *> ================================================================ 01 CUSTOMER-ACCOUNT-INFORMATION. 05 CUSTOMER-ACCOUNT-NUMBER PIC 9(10). 05 CUSTOMER-ACCOUNT-BALANCE PIC 9(10)V99. 05 CUSTOMER-ACCOUNT-TYPE PIC X(1). *> Account type codes: C=Checking, S=Savings, B=Business 88 CHECKING-ACCOUNT-TYPE VALUE 'C'. 88 SAVINGS-ACCOUNT-TYPE VALUE 'S'. 88 BUSINESS-ACCOUNT-TYPE VALUE 'B'. 05 CUSTOMER-DAILY-LIMIT PIC 9(8)V99. 05 CUSTOMER-MINIMUM-BALANCE PIC 9(8)V99. *> ================================================================ *> TRANSACTION PROCESSING CONTROLS *> These variables control the transaction processing flow and *> track the status of various validation and processing steps *> ================================================================ 01 TRANSACTION-PROCESSING-CONTROLS. 05 CURRENT-TRANSACTION-AMOUNT PIC 9(8)V99. 05 TRANSACTION-TYPE-CODE PIC X(1). *> Transaction type codes: D=Deposit, W=Withdrawal, T=Transfer 88 DEPOSIT-TRANSACTION VALUE 'D'. 88 WITHDRAWAL-TRANSACTION VALUE 'W'. 88 TRANSFER-TRANSACTION VALUE 'T'. 05 TRANSACTION-PROCESSING-STATUS PIC X(1). 88 TRANSACTION-APPROVED VALUE 'A'. 88 TRANSACTION-REJECTED VALUE 'R'. 88 TRANSACTION-PENDING VALUE 'P'. 05 TRANSACTION-ERROR-CODE PIC X(2). 88 NO-ERROR VALUE '00'. 88 INSUFFICIENT-FUNDS VALUE '01'. 88 EXCEEDS-DAILY-LIMIT VALUE '02'. 88 INVALID-ACCOUNT-TYPE VALUE '03'. 88 BELOW-MINIMUM-BALANCE VALUE '04'. PROCEDURE DIVISION. *> ================================================================ *> MAIN PROCESSING LOGIC *> This is the primary entry point that orchestrates the entire *> transaction processing workflow *> ================================================================ MAIN-TRANSACTION-PROCESSING. DISPLAY 'Starting Transaction Processing System' *> Initialize all processing variables and validate system state PERFORM INITIALIZE-TRANSACTION-PROCESSING *> Process the transaction through validation and approval steps PERFORM PROCESS-CUSTOMER-TRANSACTION *> Update account balances and create audit records PERFORM UPDATE-ACCOUNT-AND-AUDIT-TRAIL *> Generate processing results and error reports PERFORM GENERATE-TRANSACTION-RESULTS DISPLAY 'Transaction Processing System Completed' STOP RUN. *> ================================================================ *> INITIALIZATION PROCEDURES *> These procedures set up the processing environment and validate *> that all required systems and data are available *> ================================================================ INITIALIZE-TRANSACTION-PROCESSING. *> Set up all processing variables with default values MOVE ZERO TO CUSTOMER-ACCOUNT-NUMBER MOVE ZERO TO CUSTOMER-ACCOUNT-BALANCE MOVE 'C' TO CUSTOMER-ACCOUNT-TYPE MOVE ZERO TO CURRENT-TRANSACTION-AMOUNT MOVE 'D' TO TRANSACTION-TYPE-CODE SET TRANSACTION-PENDING TO TRUE SET NO-ERROR TO TRUE *> Set account-specific limits based on account type PERFORM SET-ACCOUNT-TYPE-LIMITS DISPLAY 'Transaction processing initialized successfully'. SET-ACCOUNT-TYPE-LIMITS. *> Configure daily limits and minimum balances based on account type *> This implements business rules for different account types EVALUATE CUSTOMER-ACCOUNT-TYPE WHEN 'C' *> Checking account limits MOVE 5000.00 TO CUSTOMER-DAILY-LIMIT MOVE 0.00 TO CUSTOMER-MINIMUM-BALANCE WHEN 'S' *> Savings account limits MOVE 10000.00 TO CUSTOMER-DAILY-LIMIT MOVE 100.00 TO CUSTOMER-MINIMUM-BALANCE WHEN 'B' *> Business account limits MOVE 50000.00 TO CUSTOMER-DAILY-LIMIT MOVE 1000.00 TO CUSTOMER-MINIMUM-BALANCE WHEN OTHER SET INVALID-ACCOUNT-TYPE TO TRUE END-EVALUATE. *> ================================================================ *> TRANSACTION PROCESSING PROCEDURES *> These procedures handle the core business logic for processing *> different types of transactions with appropriate validations *> ================================================================ PROCESS-CUSTOMER-TRANSACTION. *> Main transaction processing logic that coordinates all validation *> and processing steps for the current transaction *> First, validate the transaction meets basic requirements PERFORM VALIDATE-TRANSACTION-BASIC-REQUIREMENTS *> If basic validation passes, perform account-specific validations IF TRANSACTION-APPROVED PERFORM VALIDATE-ACCOUNT-SPECIFIC-REQUIREMENTS END-IF *> If all validations pass, process the transaction IF TRANSACTION-APPROVED PERFORM EXECUTE-TRANSACTION-PROCESSING END-IF. VALIDATE-TRANSACTION-BASIC-REQUIREMENTS. *> Validate that the transaction meets fundamental requirements *> such as valid account number, positive amount, etc. IF CUSTOMER-ACCOUNT-NUMBER = 0 SET TRANSACTION-REJECTED TO TRUE SET INVALID-ACCOUNT-TYPE TO TRUE DISPLAY 'ERROR: Invalid account number' ELSE IF CURRENT-TRANSACTION-AMOUNT <= 0 SET TRANSACTION-REJECTED TO TRUE SET NO-ERROR TO TRUE *> Generic validation error DISPLAY 'ERROR: Transaction amount must be positive' ELSE SET TRANSACTION-APPROVED TO TRUE DISPLAY 'Basic transaction validation passed' END-IF END-IF. VALIDATE-ACCOUNT-SPECIFIC-REQUIREMENTS. *> Perform validations specific to the account type and transaction *> This includes balance checks, daily limits, and minimum balance *> requirements based on business rules EVALUATE TRANSACTION-TYPE-CODE WHEN 'W' *> Withdrawal validations PERFORM VALIDATE-WITHDRAWAL-REQUIREMENTS WHEN 'D' *> Deposit validations (usually minimal) PERFORM VALIDATE-DEPOSIT-REQUIREMENTS WHEN 'T' *> Transfer validations PERFORM VALIDATE-TRANSFER-REQUIREMENTS WHEN OTHER SET TRANSACTION-REJECTED TO TRUE DISPLAY 'ERROR: Invalid transaction type' END-EVALUATE. VALIDATE-WITHDRAWAL-REQUIREMENTS. *> Validate withdrawal-specific requirements including sufficient *> funds, daily limits, and minimum balance maintenance *> Check if sufficient funds are available IF CURRENT-TRANSACTION-AMOUNT > CUSTOMER-ACCOUNT-BALANCE SET TRANSACTION-REJECTED TO TRUE SET INSUFFICIENT-FUNDS TO TRUE DISPLAY 'ERROR: Insufficient funds for withdrawal' ELSE *> Check if withdrawal would violate minimum balance requirement IF (CUSTOMER-ACCOUNT-BALANCE - CURRENT-TRANSACTION-AMOUNT) < CUSTOMER-MINIMUM-BALANCE SET TRANSACTION-REJECTED TO TRUE SET BELOW-MINIMUM-BALANCE TO TRUE DISPLAY 'ERROR: Withdrawal would violate minimum balance' ELSE *> Check if withdrawal exceeds daily limit IF CURRENT-TRANSACTION-AMOUNT > CUSTOMER-DAILY-LIMIT SET TRANSACTION-REJECTED TO TRUE SET EXCEEDS-DAILY-LIMIT TO TRUE DISPLAY 'ERROR: Withdrawal exceeds daily limit' ELSE SET TRANSACTION-APPROVED TO TRUE DISPLAY 'Withdrawal validation passed' END-IF END-IF END-IF. VALIDATE-DEPOSIT-REQUIREMENTS. *> Validate deposit-specific requirements (usually minimal) *> Most deposits are allowed unless they exceed system limits IF CURRENT-TRANSACTION-AMOUNT > 100000.00 SET TRANSACTION-REJECTED TO TRUE SET NO-ERROR TO TRUE *> Generic error for large deposits DISPLAY 'ERROR: Deposit amount exceeds system limit' ELSE SET TRANSACTION-APPROVED TO TRUE DISPLAY 'Deposit validation passed' END-IF. VALIDATE-TRANSFER-REQUIREMENTS. *> Validate transfer-specific requirements *> Transfers are treated as withdrawals from source account PERFORM VALIDATE-WITHDRAWAL-REQUIREMENTS DISPLAY 'Transfer validation completed'. EXECUTE-TRANSACTION-PROCESSING. *> Execute the actual transaction processing based on type *> This updates account balances and prepares audit information EVALUATE TRANSACTION-TYPE-CODE WHEN 'D' *> Process deposit ADD CURRENT-TRANSACTION-AMOUNT TO CUSTOMER-ACCOUNT-BALANCE DISPLAY 'Deposit processed successfully' WHEN 'W' *> Process withdrawal SUBTRACT CURRENT-TRANSACTION-AMOUNT FROM CUSTOMER-ACCOUNT-BALANCE DISPLAY 'Withdrawal processed successfully' WHEN 'T' *> Process transfer (withdrawal from source) SUBTRACT CURRENT-TRANSACTION-AMOUNT FROM CUSTOMER-ACCOUNT-BALANCE DISPLAY 'Transfer processed successfully' END-EVALUATE. *> ================================================================ *> AUDIT AND REPORTING PROCEDURES *> These procedures handle audit trail creation and result reporting *> ================================================================ UPDATE-ACCOUNT-AND-AUDIT-TRAIL. *> Update the account record and create audit trail entries *> This ensures all transactions are properly logged for compliance IF TRANSACTION-APPROVED PERFORM UPDATE-CUSTOMER-ACCOUNT-RECORD PERFORM CREATE-AUDIT-TRAIL-ENTRY DISPLAY 'Account and audit trail updated successfully' ELSE PERFORM LOG-REJECTED-TRANSACTION DISPLAY 'Rejected transaction logged for audit' END-IF. UPDATE-CUSTOMER-ACCOUNT-RECORD. *> Update the customer account record with new balance DISPLAY 'Updating customer account record...' *> Account update logic would go here. CREATE-AUDIT-TRAIL-ENTRY. *> Create audit trail entry for approved transaction DISPLAY 'Creating audit trail entry...' *> Audit trail creation logic would go here. LOG-REJECTED-TRANSACTION. *> Log rejected transaction for audit and analysis DISPLAY 'Logging rejected transaction...' *> Rejection logging logic would go here. GENERATE-TRANSACTION-RESULTS. *> Generate final transaction results and error reports DISPLAY 'Generating transaction results...' DISPLAY 'Transaction Status: ' TRANSACTION-PROCESSING-STATUS DISPLAY 'Account Balance: ' CUSTOMER-ACCOUNT-BALANCE IF TRANSACTION-REJECTED DISPLAY 'Error Code: ' TRANSACTION-ERROR-CODE END-IF.

This example demonstrates excellent documentation practices with comprehensive comments that explain the business logic, data structures, and processing flow. The comments provide context for why certain validations are performed, what business rules are being implemented, and how the different procedures work together. This level of documentation makes the code much easier to understand and maintain.

Best Practices for Code Readability

Common Readability Patterns