Ngoài cách vẽ biểu đồ trạng thái như trong UML đề cập, tôi xin đưa ra thêm một số quy tắc dùng biểu đồ trạng thái để biểu diễn giao thức. Công cụ PVG mà tôi xây dựng sẽ sử dụng các quy tắc này như là một chuẩn để nó có thể hiểu được giao thức
mà người dùng đặc tả bằng UML. Nếu người dùng không tuân thủ các quy tắc này,
chương trình sẽkhông đưa ra được kết quảnhư ý. Một số quy tắc:
- Trong một tài liệu UML, chỉ có một biểu đồ trạng thái thể hiện giao thức cần kiểm tra.
- Biểu đồ trạng thái bắt buộc phải có trạng thái bắt đầu và trạng thái kết thúc.
- Trạng thái bắt đẩu có tên bắt đầu bằng “Initial”, và chỉ có các cạnh đi ra
chứ không có cạnh đi vào trạng thái này.
- Trạng thái kết thúc có tên bắt đầu bằng “FinalState” và chỉ có cạnh đi vào,
36
- Các trạng thái khác phải có ít nhất một cạnh đi vào và một cạnh đi ra. Tên
của các trạng thái này không bắt đầu bằng “Initial” hoặc “FinalState”.
- Các cạnh là chữ ký (signature) của các hàm, phương thức sẽđược gọi dùng
để thay đổi trạng thái. Chữ ký này được định nghĩa gi ống như tên hàm
trong mã nguồn của chương trình cần kiểm chứng, bao gồm cả kiểu giá trị
trả về, tên hàm, danh sách các tham số truyền vào. Ví dụ:
o Trong mã nguồn, ta gọi hàm init() không có tham số truyền vào, kiểu trả về là void thì tên của cạnh trong biểu đồ UML sẽ là: void init().
o Hàm int setAge(int age) được gọi trong mã nguồn thì tên của cạnh
tương ứng sẽ là: int setAge(int age).Đối số age là không bỏđược. - Chú ý rằng tên của tham số truyền vào phải giống với tên biến đã khai báo
trong mã nguồn của chương trình cần kiểm chứng.
- Điều kiện tiên quyết (precondition) để hàm được gọi sẽ được mô tả trong “GuardCondition” của cạnh. Điều kiện này cũng phải giống với điều kiện trong mã nguồn của chương trình. Hoặc nó là đoạn code trả về giá trị boolean (ví dụnhư một phương thức tĩnh (static) boolean isTrue())
Sau đây là ví dụ mô tả một cạnh trong biểu đồ trạng thái UML: - Đoạn mã trong chương trình:
if(temp.isTrue()) {
init(); ... }
- Ta sẽ mô tả cạnh của biểu đồ trạng thái UML như sau:
Hình 4.1: UMLTransition
o Tên của cạnh (Name): void init().
o Điều kiện tiên quyết (GủadCondition): temp.isTrue()