Thompson
3.2.1 Sinh dẫn xuất
Trong phát triển phần mềm hướng thành phần, mỗi thành phần như một hộp đen và nó được biểu diễn bởi một máy hữu hạn trạng thái không xác định (QC, Σ, C, q0
C) được định nghĩa trong Chương 2. Với máy hữu hạn trạng thái không xác định, chúng ta không thể biết được tất cả các trạng thái và hành vi của nó mà chỉ có thể tiến hành các thực hiện trên đó. Do đó, chúng ta có thể nhìn nhận nó như một bộ hai thành phần (Σ, T), với T Σ*
là một tập đóng các chuỗi tiền tố trên bảng chữ cái Σ.
Định nghĩa 3.2: Tập đóng chuỗi tiền tố
T là một tập đóng các chuỗi tiền tố trên bảng chữ cái Σ khi và chỉ khi T thì tiền tố của T. Các chuỗi trong T tương ứng với các thực hiện được của thành phần phần mềm C.
1. t = |S|
2. for k = 1 to n – t do
3. for each string s of size k, s S, e E do 4. if sxe L(Mi) and check(sxe) then 5. return sxe
6. end if 7. end for each 8. end for 9. return true
Giải thuật 3.3 mô tả thuật toán kiểm tra một dẫn xuất có phải là một thực hiện trên thành phần phần mềm C hay không. Thuật toán được tiến hành như sau:
Thiết lập cho thành phần phần mềm C về trạng thái khởi tạo (gọi hàm Reset). Khi đó, chuỗi thực hiện được trên C sẽ là chuỗi rỗng .
Kiểm tra một action a1 có thể thực hiện được trên C tại thời điểm hiện tại hay không. Nếu thực hiện được thì a1 sẽ được thêm vào chuỗi thực hiện được hiện thời. Giả sử thành phần phần mềm C cung cấp thông tin về việc thực thi action ai. Nếu chuỗi thực hiện được hiện thời trên C là T, a1a2..ai, ta cho C thực thi action ai+1 và kiểm tra xem ai+1 T hay không? Nếu điều này thoả mãn thì chuỗi thực hiện được trên C lúc này sẽ là ai+1 và tiếp tục thực hiện với các action kế tiếp trong Trái lại chuỗi thực hiện được là , khi đó trả về kết quả false. Nếu chuỗi thực hiện được trên C trùng lặp với thì trả về kết quả true và ta nói là một thực hiện trên Component C.
Giải thuật 3.3: isTraceOfC( , T)
Input: Một chuỗi a1a2..ak và một component C được cho bởi bộ (Σ, T)
Output: Trả về kết quả là true nếu là một thực hiện trên C, trái lại trả về false
1: khởi tạo: Reset(C), curExperiment = { }
2: Lặp
3: For i=1 to k do
4: If ( curExperiment).(ai) T then 5: Update curExperiment= ( curExperiment).(ai)
6: Else return false 7: Kết thúc vòng lặp For 8: Return true
Thuật toán sinh tập dẫn xuất
Giải thuật 3.4 mô tả quá trình sinh tập các dẫn xuất của một thành phần phần mềm C. Với mỗi thành phần phần mềm C ta không biết trước được tất cả các trạng thái và hành vi của nó. Giả sử rằng mọi dẫn xuất của nó đều có độ dài không vượt quá một hằng số maxLength. Khi đó, chúng ta sẽ tìm tập các dẫn xuất của C có độ dài không vượt quá maxLength như sau:
Xây dựng tập D gồm tất cả các dẫn xuất trên Σ có độ dài maxLength
D = { Σ *
|| | maxLength}
Tập D được xây dựng như trên gồm một số hữu hạn các phần tử là dẫn xuất từ Σ, có độ dài không vượt quá maxLength.
Với mỗi D, nếu là một thực hiện được trên C (theo thuật toán 3.3) thì kết nạp vào tập L các dẫn xuất cần tìm.
Như vậy sau một số hữu hạn bước thực hiện ta sẽ thu được tập L hữu hạn các dẫn xuất có độ dài không vượt quá maxLength do C sinh ra.
Giải thuật 3.4: makeTraceSet(C, maxLength)
Input: Một thành phần phần mềm C như một hộp đen, maxLength là độ dài cực đại của các dẫn xuất có thể thực hiện được trên C
Output: Tập L gồm các dẫn xuất trên C với độ dài maxLength
1: khởi tạo: D = { Σ * || | maxLength}, L = ; 2: Lặp 3: For each D) 4: if isTraceOfC( , T) then 5: L = L } 7: Kết thúc vòng lặp For 8: Return L