Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C# Danh sách các đối tượng xử lý: STT 1 2 3 Tên PreConditionCheck PostConditionCheck InvariantCheck Lớp/Kiểu bool bool bool Ý nghĩa Xác định có sử dụng PreCondition hay không. Xác định có sử dụng PostCondition hay không. Xác định có sử dụng Invariant hay không. Xác định có sử dụng 4 BasePreConditionCheck bool PreCondition của những lớp dẫn xuất hay không. Xác định có sử dụng 5 BasePostConditionCheck bool PostCondition của những lớp dẫn xuất hay không. Xác định có sử dụng Invariant 6 BaseInvariantCheck...
Trang 1Danh sách các đối tượng xử lý:
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 của những lớp dẫn xuất hay không
Danh sách các biến cố :
1 Form Load
Hiển thị màn hình Configuration cho phép người dùng enable hoặc disable chức năng kiểm tra của PreCondition, PostCondition, Invariant
2 btnOK Click Lưu những thông số đã chọn trên màn hình và
thoát khỏi màn hình
3 btnClose Click Thoát khỏi màn hình
Trang 216.2.2.2 Lớp Connect
Hình 16-4: Lớp Connect
Danh sách các biến thành phần:
1 projectInfo ProjectInfo Lưu trữ thông tin của Project hiện
hành
Danh sách các biến cố:
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
Trang 3¾ Lưu thông tin về contract của những lớp dẫn xuất cho lớp kế thừa
¾ Phát sinh source code để kiểm tra những Assertion
3 Project BuildDone Trả source code về như cũ
16.2.2.3 Lớp ProjectInfo
Hình 16-5: Lớp ProjectInfo
Danh sách biến thành phần:
1 classInfo ClassInfo[]
Mảng các đối tượng ClassInfo, mỗi đối tượng lưu trữ thông tin một lớp của project
2 NumFile int Số file trong project này
Trang 4Danh sách hàm thành phần:
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 đó
Trang 516.2.2.4 Lớp ClassInfo
Hình 16-6: Lớp ClassInfo
Danh sách biến thành phần:
1 functionInfo FunctionInfo[]
Mảng các đối tượng FunctionInfo, mỗi đối tượng lưu trữ thông tin một hàm của lớp
2 NumFunc int Số hàm trong class này
3 Invariant Assertion
Đối tượng lớp Assertion để lưu trữ thông tin về
Invariant của lớp
4 BaseInvariant Assertion[]
Mảng đối tượng lớp Assertion để lưu trữ thông tin về Invariant của những
Trang 6lớ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
7 BaseClassName string[] Mảng tên các lớp dẫn xuất
Đố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:
vào biến NumFunc
2 GetClassName
Phân tích code để lấy tên của lớp, lưu vào
ClassName
3 GetBaseClassesName
Phân tích code để lấy tên của những lớp dẫn xuất của lớp này, lưu vào BaseClassName
4 SaveAssertionOfBase
Class
ClassInfo []
Lưu Invarian, PreCondition, PostCondition của những lớp dẫn xuất
Trang 75 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ề như cũ
Trang 816.2.2.5 Lớp FunctionInfo
Hình 16-7: Lớp FunctionInfo
Danh sách biến thành phần:
1 PreCondition Assertion Đối tượng lớp Assertion để lưu trữ
thông tin về PreCondition của hàm
2 PostCondition Assertion Đối tượng lớp Assertion để lưu trữ
thông tin về PostCondition của hàm
3 FunctionName string Biến lưu tên hàm
4 BasePreCondition Assertion[]
Mảng đối tượng lớp Assertion để lưu trữ thông tin về PreCondition của những lớp dẫn xuất
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
Trang 9Danh sách hàm thành phần:
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 PreCondition và PostCondition
Phân tích một mệnh đề của Assertion để lấy
ra biến và kiểu dữ liệu
dùng cho những mệnh đề
có từ khoá OLD
4 GetVarHaveOLD
Keyword Assertion string[][]
Với mỗi mệnh đề của một đối tượng Assertion, gọi hàm GetVar để lấy biến và kiểu
dữ liệu
Chỉ làm việc với những mệnh đề
có từ 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
Trang 10nhữ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
Danh sách biến thành phần:
1 Routine string
Lưu tên thủ tục(tên hàm) chứa Assertion này
Giá trị rỗng đối với Invariant
2 ConditionFull string[] Lưu trữ toàn bộ mệnh
Trang 113 Condition string Lưu trữ toàn bộ mệnh
đề của Assertion
Khác ConditionFull
ở chỗ không lưu kiểu dữ liệu của biến có từ khoá 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:
1 GenerateAssertion
Code
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
2 GenerateCode
string FuncName, string Type, string[][] OLDVar
Phát sinh trong hàm FuncName những dòng code kiểm tra gọi đến những hàm kiểm tra Assertion đã tạo ra bằng
Trang 12GenerateAssertionCode OLDVar là mảng chứa những biến có từ khoá OLD của PostCondition
và kiểu dữ liệu tương ứng để phát sinh code kiểm tra đối với những biến này
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 GenerateCode nhưng hỉ dùng trong trường hợp lớp dẫn xuất có chứa PreCondition, vì trường