IV.1. Khái niệm về đơn thể
Ý tưởng cơ bản của lập trình cấu trúc là phân rãî vấn đề lớn thành các vấn đề nhỏ hơn cho đến khi nhận được các vấn đề tương đối đơn giản, mỗi vấn đề này được giải quyết bởi một đơn thể chương trình (module). Mỗi đơn thể có các tính chất như sau :
a) Tính đơn thuần
• Chỉ giải quyết những đối tượng dữ liệu có liên hệ với nhau trong phạm vi của vấn đề. • Có một lối vào và một lối ra, bên trong chỉ dùng những cấu trúc điều khiển chuẩn. • Hoạt động chỉ phụ thuộc vào dữ liệu đưa vào chứ không phụ thuộc vào tình trạng
trước đó của nó. Mỗi đơn thể là một hàm dữ liệu vào, kết quả tiên đoán được.
b) Tính chuyên biệt
• Chỉ thực hiện một chức năng, nhiệm vụ nhất định.
• Không quá dài hoặc quá ngắn (lý tưởng là mỗi đơn thể có từ 60 đến 70 dòng lệnh vừa nằm trọn trong một trang A4).
• Chỉ được khởi động bằng cách gọi.
c) Tính độc lập
• Là một đơn vị biên dịch. Có thể viết và chạy thử độc lập.
Các ngôn ngữ lập trình bậc cao như Pascal (kỹ thuật dùng Unit), C, C++ (include các tệp chương trình ) và hầu hệ các công cụ lập trình thường gặp hiện nay đều cho phép lập trình theo đơn thể.
Phương pháp lập trình cấu trúc 33
IV.2. Mối liên hệ giữa các đơn thể
Các đơn thể nối kết với nhau thành chương trình, tổ chức phân cấp dạng cây (tree). D B C G F E A
Hình 2.5. Mối liên hệ giữa các đơn thể
IV.2.1.Phân loại đơn thể
Có 4 loại đơn thể :
a) Đơn thể điều khiển
Đơn thể điều khiển (Director Module) có chức năng gọi các đơn thể khác xử lý.
b) Đơn thể xử lý
Đơn thể xử lý (Pcocessing Module) chuyên trách một nhiệm vụ nào đó trên vùng dữ liệu độc lập. Đơn thể xử lý được đơn thể điều khiển gọi tới và sau khi thực hiện xong chức năng, đơn thể xử lý trả quyền điều khiển trở lại cho đơn thể điều khiển.
c) Đơn thể vào/ra
Đơn thể vào/ra (IO Module) chuyên trách vào/ra dữ liệu, có sự kiểm tra và xử lý sai sót. Đơn thể cũng do đơn thể điều khiển gọi tới giống như hoạt động của đơn thể xử lý.
d) Đơn thể chương trình con
(Subroutine Module) nhằm giải quyết một nhiệm vụ trọn vẹn nhưng có quan hệ với các đơn thể khác. Đơn thể chương trình con được gọi thực hiện nhiều lần trong chương trình.
IV.2.2. Tổ chức một chương trình có cấu trúc đơn thể
Cấu trúc chương trình gồm : - Cấu trúc nội tại của các đơn thể. - Mối liên hệ giữa các đơn thể.
Các đơn thể được tổ chức phân cấp dạng cây nhưng phải thỏa mãn tính cục bộ tham chiếu (locality of Reference) : chỉ có đơn thể mức cao hơn (cha) mới có quyền tham chiếu (gọi) đến đơn thể mức thấp hơn kề đó (con).
Những cấu trúc cây thỏa mãn tính cục bộ tham chiếu được gọi là cấu trúc cây thuần túy (Pure tree Structure).
Ví dụ 9 :
Hình 2.6. Cấu trúc cây thuần túy
− D chỉ phục vụ B, chỉ có B mới có quyền điều khiển D, C không thể gọi D.
− Giữa B và D chỉ có một đường tương tác duy nhất là trao đổi tham biến. A C B E D
a) Đặc điểm của cấu trúc cây thuần túy
− Mỗi đơn thể chỉ được quyền điều khiển đơn thể con trực tiếp, giảm được tính phức tạp của chương trình.
− Các nhánh hoàn toàn tách biệt nhau nên có tính tương tác tối thiểu.
Ngoại lệ : Nếu một công việc nào đó cần thực hiện nhiều lần, nhiều chỗ trong chương trình thì nên tổ chức thành một đơn thể chương trình con và vẽ riêng, không vẽ vào cấu trúc cây.
Như vậy, các đơn thể chương trình con chỉ đóng vai trò thư viện, một sự mở rộng của ngôn ngữ lập trình. Trường hợp đơn thể chương trình con phức tạp thì có thể tổ chức theo cấu trúc cây thuần túy.
Như vậy toàn bộ chương trình là một tập hợp các cấu trúc cây thuần túy.
Ví dụ 10 :
Hình 2.7. Cấu trúc cây thuần túy của chương trình và chương trình con
Các đơn thể chương trình con A C B E F F3 F1 F2 G1 G D
Phương pháp lập trình cấu trúc 35
b) Thử nghiệm chương trình trên cấu trúc cây thuần túy
Quá trình thử nghiệm một chương trình :
− Thử nghiệm các đơn thể chương trình con trước.
− Thử nghiệm các đơn thể trong chương trình chính, từ dưới lên và riêng từng nhánh.
Cần phân biệt :
− Các đơn thể xử lý phụ thuộc vào ngữ cảnh (context) nào, là con của đơn thể nào ?
− Các đơn thể chương trình con độc lập với ngữ cảnh.
Để thử nghiệm chương trình cho trong hình vẽ trong ví dụ ở trên :
− Thử F và G trước (sau khi đã thử F1, F2, F3 và G1).
− Thử D và E rồi thử B.
− Thử C.
− Thử cả chương trình.