V – PHA PHÂN TÍCH HƯỚNG ĐỐI TƯỢNG
4. Phân tích dòng dữ liệu
Phân tích dòng dữ liệu (data flow analyis, DFA) là một kỹ thuật để phân rã phần mềm thành các module có tính cố kết cao (module with high cohesion). (Tính cố kết là khái niệm của công nghệ phần mềm được định nghĩa trong một số tài liệu, tuy nhiên ở đây chúng ta sẽ không tìm hiểu quá chi tiết về khái niệm này). Trước hết, cần có một chút lưu ý về thuật ngữ.
Chúng ta đang ở pha thiết kế, vậy từ "phân tích dòng dữ liệu" có thể gây sự hiểu nhầm. Tuy nhiên, nếu thay từ "phân tích" bằng từ "thiết kế" thì ý nghĩa bị sai lệch. Chúng ta sử dụng từ "phân tích" ở đây với ý nghĩa thực của nó (rõ ràng ở bất kỳ ở pha nào cũng cần phân tích vấn đề để đưa tới kết quả). Có lẽ vì vậy, người ta hay gọi "pha phân tích" là "pha đặc tả".
DFA được biễu diễn trong sự nối tiếp với phân tích hệ thống có cấu trúc (structured system analysis). Đầu vào của kỹ thuật này là các DFD. Điểm mấu chốt là, với mỗi DFD, người phát triển phần mềm có được thông tin chính xác liên quan đến đầu vào và đầu ra của phần mềm.
Tạm thời, ta giả sử phần mềm cần xây dựng được biểu diễn trong một biểu đồ dòng dữ liệu chỉ có một đầu vào và một đầu ra, và trong quá trình xử lý dữ liệu không bị tách ra, ví dụ như dòng dữ liệu được biểu diễn bởi DFD trong hình 5.16. Trong DFD, dữ liệu vào (input) qua nhiều bước biến đổi và cuối cùng thành dữ liệu ra (output). Tuy nhiên, trong quá trình biến đổi này dữ liệu chỉ thay đổi về chất ở một số vị trí. Ví dụ: với dòng dữ liệu có đầu vào là họ tên một người nào đó, và đầu ra là chuỗi ký tự đó trong dạng chữ in hoa cùng với ký tự xuất hiện nhiều nhất trong trong họ tên dó và độ dài của chuỗi.
Giả sử a là thao tác nhập tên, còn b là kiểm tra xem tên có hợp lệ không, ví dụ nếu tên có chứa số chẳng hạn thì không hợp lệ. Như thế b không làm biến đổi
đầu vào ban đầu, nên b là hành động không làm thay đổi dữ liệu về chất (quality). Người ta gọi điểm mà trong thao tác tiếp theo dữ liệu vào ban đầu sẽ bị biến đổi thực sự về chất là điểm có mức trừu tượng cao nhất của đầu vào (point of highest abstraction of input). Để đơn giản trong cách viết, ta tạm gọi là điểm HA của đầu vào. Tương tự ta định nghĩa được điểm HA của đầu ra.
Hình 5.16. DFD biểu diễn dòng các dữ liệu và hành động
Giả sử dữ liệu vào của DFD trong hình 5.16 là họ tên. Trong đó các thao tác là:
a: Nhập họ tên là một chuỗi ký tự b: Kiểm tra tính hợp lệ
c: Chuyển tất cả các ký tự sang dạng chữ hoa d: Loại dấu cách ở hai đầu
e: Loại dấu cách thừa ở trong chuỗi ký tự f: Đếm ký tự xuất hiện nhiều nhất
g: Tính độ dài của chuỗi
h: Cho hiện kết quả trên màn hình
Khi đó ta xác định được các điểm HA của Input và Output như trên hình 5.17.
Hình 5.17. Các điểm HA trên biểu đồ dòng dữ liệu và cách phân rã module Sau khi xác định được các điểm HA của đầu vào và đầu ra, ta có thể phân chia quá trình thành ba module với tên gọi như trên hình vẽ. Tiếp theo, ta xem xét dòng dữ liệu nằm trong phần transform module và lại thực hiên phân chia tương tự. Quá trình này được thực hiện cho đến khi module biến đổi (transform module) là khá đơn giản, không cần phân chia nữa thì kết thúc.
Đối với những dòng dữ liệu phức tạp, có nhiều nhánh thì ta tách DFD thành từng DFD con chỉ có một nhánh và thực hiện phân rã như vừa nêu ở trên.
Input a b c d e f g h Output Input a b c d e f g h Output Điểm HA
của input Điểm HAcủa output Input module Transform module Output module
Cách phân phân rã một dòng dữ liệu thành các module thường còn tùy thuộc vào cách nhìn nhận của người phân tích, và do đó cùng một DFD có thể có nhiều cách phân rã khác nhau.
Sau khi có được các module thì bước tiếp theo là thiết kế chi tiết các module này. Trước hết là bản mô tả từng module theo mẫu sau (ở đây chúng tôi điền thông tin của trường hợp trên đây để các bạn tiện theo dõi):
Module name (tên module): Nhập và kiểm tra tính hợp lệ của họ tên Module type (kiểu module): Function
Return type (kiểu trả về): Boolean
Input arguments (các tham số vào): Họ và tên: string Output arguments (các tham số ra): Họ và tên: string Error messages (các thông báo lỗi): Không
Files accessed (những tệp được truy cập): Không Files changed (những tệp bị thay đổi): Không Modules called (những module được gọi): Không
Narrative (tường thuật): Module này được gọi với tham số vào là một chuỗi biểu diễn họ tên. Chuỗi này sẽ được hiện trên màn hình và người sử dụng có thể sửa lại hoặc nhập họ và tên mới. Chương trình sẽ kiểm tra tính hợp lệ. Nếu kiểm tra thấy rằng chuỗi này là tên hợp lệ thì sẽ trả về giá trị logic là true, nếu không hợp lệ thì trả về false. Tham số ra của module cũng chính là tham số vào nhưng đã được sửa hoặc nhập lại.
Hình 5.18. Thiết kế chi tiết của một module
Thiết kế trong bảng 5.18 là độc lập với ngôn ngữ lập trình. Tuy nhiên, nếu người quản lý quyết định ngôn ngữ lập trình trước khi thực hiện thiết kế chi tiết thì người ta thường dùng ngôn ngữ mô tả chương trình (a program description language, PDL), hay còn gọi là giả ngôn ngữ lập trình (pseudocode) để biểu diễn thiết kế chi tiết. PDL thực chất là các lời chú dẫn được nối với các từ khóa của ngôn ngữ đã lựa chọn. Sau đây là một đoạn thiết kế chi tiết được viết bằng PDL tương ứng với C++ (đoạn chương trình này mô tả thao tác đếm số từ trong một tệp):
void perform word count() {String validated file name; int word count;
if (get intput (validated file name) is false) print "error 1: file does not exist"; else
{set word count equal to count number of words (validated file name); if (word count is equal to -1)
print "error 1: file does not exist"; else
produce output (word count); }
}