Thiết kế chương trình

1. Mục đích

Các kết quả thu được qua các giai đoạn phân tích, thiết kế tổng thể và thiết kế chi tiết (về các giao diện, kiểm soát và cơ sở dữ liệu) dù là khá phong phú nhưng vẫn còn là chưa đủ để có thể chuyển sang lập trình được. Các yếu tố còn thiếu là:

Các chức năng xuất hiện trong các BLD chỉ là các chức năng logic (thuộc lĩnh vực bài toán) mà chưa có các chức năng phù trợ cần thiết như là:

  • Các chức năng đối thoại với người dùng
  • Xử lý lỗi
  • Xử lý vào, ra
  • Tra cứu CSDL
  • Các chức năng điều hành (nhằm liên kết các chức năng khác)

Các liên quan giữa các chức năng trong BLD chỉ là các chuyển giao dữ liệu mà không phải là chuyển giao điều khiển (tức là chuyển giao sự thực hiện khi thi hành). Một đặc trưng không thể thiếu trong một chương trình là đặc trưng điều khiển (sự tuần tự, chọn, lặp và đặc biệt là lời gọi giữa các chương trình con). Đặc trưng này chưa hề có trong các BLD.

Vì các thiếu sót này mà các BLD thu được từ giai đoạn phân tích còn phải được biến đổi, bổ sung thêm chi tiết thì mới trở thành đầu vào thực sự cho việc lập trình được. Vì vậy phải có thêm một giai đoạn thiết kế chi tiết, đó là thiết kế chương trình. Đây cũng chỉ là một giai đoạn của thiết kế, nhằm đưa ra các quyết định về cài đặt, chứ chưa phải là cài đặt, chưa phải là lập trình thực sự.

Đầu vào cho việc thiết kế chương trình

  • BLD của từng hệ thống con (thiết kế tổng thể)
  • Các giao diện
  • Các kiểm soát
  • CSDL.

Đầu ra của thiết kế chương trình

  • Lược đồ chương trình (LCT) cho mỗi hệ thống con
  • Đặc tả nội dung của từng module trong LCT
  • Phân bổ các module trong LCT thành các chương trình (hay module tải)
  • Thiết kế các mẫu thử

2. Lập lược đồ chương trình

Lược đồ chương trình còn gọi là lược đồ cấu trúc là một biểu diễn dưới dạng đồ thị của một tập hợp các module cùng với các giao diện giữa các module đó (bao gồm sự chuyển giao điều khiển và chuyển giao dữ liệu).

2.1. Module chương trình

Định nghĩa: trong định nghĩa lược đồ cấu trúc thì module được hiểu là một chương trình con hoặc một cụm câu lệnh nằm trong chương trình hay trong một số ngôn ngữ lập trình có các UNIT, CLASS, OBJECT thì đây thực chất là các nhóm module chương trình tập hợp xung quanh một cấu trúc dữ liệu.

Các thuộc tính cơ bản của module

  • Thông tin vào, ra: thông tin nhận được từ chương trình gọi nó hoặc thông tin trả lại cho chương trình gọi nó.
  • Chức năng hàm biến đổi từ vào thành ra.
  • Cơ chế: phương thức để thực hiện chức năng trên.
  • Dữ liệu cục bộ: các chỗ nhớ hay cấu trúc dữ liệu dùng riêng cho nó. b. Công cụ để diễn tả LCT

– Biểu diễn các module

– Module được biểu diễn bằng một hình chữ nhật trên có ghi nhãn là tên module.

– Trường hợp module được định nghĩa sẵn trong hệ thống hay trong thư viện chương trình thì các cạnh bên được vẽ nét đôi.

Thứ tự các module từ trái qua phải là thứ tự mà module A gọi đến module đó trước.

Thông tin trao đổi giữa các module

Các thông tin được gửi kèm với lời gọi(các tham số) và thông tin trả về sau khi thực hiện lời gọi được thể hiện bằng các mũi tên nhỏ vẽ dọc theo cung biểu diễn cho lời gọi, có kèm thoe tên của thông tin.

Ví dụ về LCT

Tính phụ cấp cho nhân viên phụ động

Tính phụ cấp cho nhân viên tạm tuyển

Tính phụ cấp cho nhân viên trong biên chế

2.2. Chất lượng của LCT

LCT sau khi được lập ta chưa nên xem xét là dạng cuối cùng để chấp nhận mà chỉ coi đây là phác thảo ban đầu của thiết kế module, ta còn phải tiếp tục tinh chỉnh nó bằng cách gộp, tách hay san sẻ lại nhiệm vụ giữa các module để đạt được các tiêu chuẩn về chất lượng sau.

– Sự tương liên

  • Sự tương liên là mức độ ảnh hưởng lãn nhau giữa các modul.
  • Một LCT tốt thì sự tương liên phải càng lỏng lẻo, càng đơn giản.
  • Các loại tương liên:
  • Tương liên về nội dung: ví dụ một module làm thay đổi nội dung (các lệnh) của module khác, rẽ nhánh sang một module khác hay sử dụng dữ liệu của module được gọi. Cần loại bỏ tương liên này.
  • Tương liên về điều khiển: là trường hợp một module này chuyển điều khiển cho một module khác. Tương liên điều khiển vi phạm nguyên tắc che giấu thông tin. Vì vậy tương liên điều khiển cũng nên tránh.
  • Tương liên về dữ liệu: đó là trường hợp hai module trao đổi dữ liệu cho nhau. Sự trao đổi dữ liệu càng đơn giản càng tốt.

– Sự cố kết

  • Là sự gắn bó giữa các phần bên trong của một module.
  • Module càng cố kết thì chức năng của nó càng dễ thấy, logic do đó dễ phát hiện lỗi, dễ bảo trì.

– Hình thái

  • Phạm vi điều khiển của một module là phần LCT bao gồm module đó và những module phụ thuộc (được gọi) trực tiếp hay gián tiếp từ nó.
  • Phạm vi ảnh hưởng của một quyết định là phần LCT bao gồm mọi module chịu ảnh hưởng của quyết định đó.

Ví dụ: Cho LCT sau

Ta có:

+ Phạm vi điều khiển của A là B, C

+ Giả sử trong B có một quyết định q1 và quyết định được dùng trong A, E, F thì khi đó phạm vi ảnh hưởng của q1 là A, E, F.

Một LCT tốt thì về mặt hình thái:

  • Các quyết định có miền ảnh hưởng càng hẹp càng tốt
  • Mỗi phạm vi ảnh hưởng nằm trong phạm vi điều khiển tương ứng.

2.3. Đặc tả các module

Sau khi lập được LCT cho mỗi hệ thống con, ta phải đặc tả mỗi module trong đó, tức là miêu tả rõ nội dung của module.

Đặc tả một module ta cần nêu rõ:

  • Thông tin đầu vào (Input), thông tin đầu ra (Output)
  • Các thao tác thực hiện trong chương trình: các đối thoại với người dùng, các xử lý lỗi, tra cứu CSDL, các xử lý, …
  • Các dữ liệu cục bộ của module

Lưu ý: để đặc tả một module ta có thểle tải là một nhóm module chương trình được tải vào bộ nhớ trong đồng thời.

  • Nếu một LCT dùng ngôn ngữ tựa ngôn ngữ lập trình hoặc sơ đồ khối.

2.4. Đóng gói thành module tải

  • Modu hợp thành một module tải: thời gian tiêu tốn cho việc tải chương trình là ít nhất nhưng bên cạnh đó thì dung lượng bộ nhớ đòi hỏi phải lớn, nhiều khi không đáp được. Ngược lại, nếu mỗi module là một module tải thì tiết kiệm bộ nhớ nhưng chi phí thời gian tải chương trình nhiều. Vì vậy chúng ta cần cắt LCT thành các module tải hợp lý.
  • Thiết kế module tải phải căn cứ vào các yếu tố như:
  • Kích cỡ bộ nhớ
  •  Kích cỡ các module
  • Tần suất lần gọi module
  • Một module tải bao gồm nhiều nhất các module gắn kết với nhau.

2.5. Thiết kế các mẫu thử

  • Mẫu thử có thể được phát sinh ngẫu nhiên hoặc không ngẫu nhiên, tự động hoặc không tự động.
  • Cách thử chương trình bằng mẫu thử:
  • Thử tính đúng đắn
  • So kết quả thu được với kết quả chờ đợi
  • Nếu trong quá trình thử phức tạp, yêu cầu chương trình in các giá trị trung gian
  • Kiểm tra giá trị trung gian
  • Kiểm tra vệt chương trình
  • Thử hiệu năng: các mẫu thử phải đủ lớn và có thể thử nghiệm trong một thời gian dài.