Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C#
97
Danh sách các đối tượng xử lý:
STT Tên Lớp/Kiểu Ý nghĩa
1 PreConditionCheck bool
Xác định có sử dụng
PreCondition hay không.
2 PostConditionCheck bool
Xác định có sử dụng
PostCondition hay không.
3 InvariantCheck bool
Xác định có sử dụng Invariant
hay không.
4 BasePreConditionCheck bool
Xác định có sử dụng
PreCondition của những lớp dẫn
xuất hay không.
5 BasePostConditionCheck bool
Xác định có sử dụng
PostCondition của những lớp
dẫn xuất hay không.
6 BaseInvariantCheck bool
Xác định có sử dụng Invariant
Danh sách các biến thành phần:
STT Tên Kiểu/Lớp Ý nghĩa
1 projectInfo ProjectInfo
Lưu trữ thông tin của Project hiện
hành.
Danh sách các biến cố:
STT Thể hiện Biến cố Xử lý
1 Command Exec
RightClick vào màn hình soạn thảo code,
xuất hiện pop-up menu. Click vào command
này, màn hình Configuration hiển thị cho
phép người dùng enable hoặc disable chức
năng kiểm tra của PreCondition,
PostCondition, Invariant.
2 Project BuildBegin
Bắt đầu chạy chương trình:
¾ Lưu thông tin của project hiện hành:
thông tin của các phương thức trong các
lớp (tên phương thức, precondition,
postcondition) và Invariant của mỗi lớp
trong project.
¾ Đổi tên tất cả các phương thức có liên
quan đến contract.
Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C#
100
Danh sách hàm thành phần:
STT Tên Tham số Kết quả Xử lý
1 FileCount
Đếm số file của project,
lưu vào biến NumFile
2 ChangeAllFuncName
Duyệt qua từng lớp, gọi
phương thức đổi tên hàm
của mỗi lớp đó.
3
SaveAssertionOfBase
Classes
Duyệt qua từng lớp, gọi
phương thức lưu thông
tin về assertion của
những lớp dẫn xuất của
từng lớp đó
4 GenerateCode
Duyệt qua từng lớp, gọi
phương thức thêm vào
phần code kiểm tra
Assertion của từng lớp
đó.
5 ReturnOriginalCode
Duyệt qua từng lớp, gọi
phương thức trả code về
như cũ của từng lớp đó.
Mảng đối tượng lớp
Assertion để lưu trữ thông
tin về Invariant của những
Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C#
102
lớp dẫn xuất.
5 FileName string Tên file chứa lớp.
Mỗi file
chỉ được
chứa 1
lớp
6 ClassName string Tên lớp.
7 BaseClassName string[] Mảng tên các lớp dẫn xuất.
8 extra Extra
Đối tượng lớp Extra, dùng
để gọi những hàm riêng,
không thuộc trách nhiệm
của những lớp chính.
Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C#
103
5 SaveInvariantInfo
Lưu thông tin Invariant
của lớp vào biến
Invariant.
6 ChangeFuncName
Duyệt qua từng hàm
trong lớp, lưu thông tin
của từng hàm (tên hàm,
PreCondition,
PostCondition), sau đó
đổi tên hàm.
7 GenerateCode
Tìm vị trí thích hợp trong
code, gọi hàm
CodeGenerated để phát
sinh code vào đó.
8 CodeGenerated string
Duyệt qua từng hàm, gọi
phương thức phát sinh
code của từng hàm tương
ứng, trả ra chuỗi code đã
được phát sinh.
9 ReturnOriginalCode
Xoá phần code phát sinh
và điều chỉnh tên hàm về
5 BasePreCondition Assertion[]
Mảng đối tượng lớp Assertion để lưu
trữ thông tin về PostCondition của
những lớp dẫn xuất.
6 Extra Extra
Đối tượng lớp Extra, dùng để gọi
những hàm riêng, không thuộc trách
nhiệm của những lớp chính. Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C#
105
Danh sách hàm thành phần:
STT Tên Tham số Kết quả Xử lý Ghi chú
1 ChangeName
Đổi tên hàm theo
dạng
@origin_[Tên cũ]
2 SaveContractsInfo
Lưu thông tin
PreCondition và
PostCondition của
hàm vào biến
khoá
OLD
5 GenerateCode
Dùng những tên
hàm đã lưu, phát
sinh ra những hàm
mới. Những hàm
này sẽ gọi lại
Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C#
106
những hàm gốc
(đã bị đổi tên)
cùng với code
kiểm tra những
PreCondition,
PostCondition và
Invariant của hàm.
16.2.2.6 Lớp Assertion
Hình 16-8: Lớp Assertion
OLD
4 Message string[]
Lưu những Message đi
kèm với mỗi Condition
5 Extra Extra
Đối tượng lớp Extra,
dùng để gọi những
hàm riêng, không
thuộc trách nhiệm của
những lớp chính. Danh sách hàm thành phần:
STT Tên Tham số
Kết
quả
Xử lý
1
GenerateAssertion
Code
string FuncName,
string Type
string
Dựa vào FuncName và
Type (Precondition,
PostCodition, Invariant,
BasePreCondition,
BasePostCondition,
BaseInvariant) để phát
3
GenerateAssertion
CodeBasePre
Assertion ass,
string FuncName,
string Type
string
Dựa vào FuncName và
Type (Precondition,
PostCodition, Invariant,
BasePreCondition,
BasePostCondition,
BaseInvariant) để phát
sinh hàm kiểm tra
Assertion.
Hàm này tương tự hàm
GenerateAssertionCode
nhưng chỉ dùng trong
trường hợp lớp dẫn xuất
có PreCondition, lúc này
cần truyền tham số kiểu
Assertion cho hàm.
4
GenerateCode_Ba
sePre
string FuncName,
Assertion[]
BasePreCondition
Chức năng giống hàm