Sự khác biệt OCL[5] và Alloy[2] không cho phép chuyển đổi giữa chúng một cách hoàn toàn. Do vậy chúng ta chỉ đề cập tới một số khía cạnh có thể chuyển đổi từ OCL[5] sang Alloy[2]. Bảng sau mô tả phép chuyển.
Các ký hiệu viết tắt
33 v : Biến – varable (v) trong biểu thức
T : Biểu diễn kiểu của biến be : Biểu diễn biểu thức Boolean e : Biểu diễn biểu thức
Bảng 6. Quy tắc chuyển OCL sang Alloy – [4]
OCL Alloy
col ->forAll(v : T | be) all Tr(v) : Tr(col) | Tr(be)
col -> exists(v : T | be) some Tr(v) : Tr(col) | Tr(be)
e1 and e2 Tr(e1) && Tr(e2)
not e !Tr(e)
col -> size() #Tr(col)
col -> includes(v : T) Tr(v) in Tr(col)
col -> excludes(v : T) Tr(v) ! in Tr(col)
col1 -> includesAll(col2) Tr(col2) in Tr(col1)
col1 -> excludesAll(col2) Tr(col2) ! in Tr(col1)
col -> including(v :T) Tr(col) + Tr(v)
col -> excluding(v: T) Tr(col) – Tr(v)
col ->isEmpty() no ( col)
col ->notEmpty() some (col)
if condition then e1 else e2 Tr(condition) =>Tr(e1) else Tr(e2)
e.oclIsUndefined #Tr(e) = 0
e -> oclKindOf(v : T) Tr(v) in Tr(e)
col1 -> union(col2) Tr(col1) + Tr(col2)
34
col1 ->product(col2) Tr(col1) -> Tr(col2)
col->sum() sum Tr(col)
Ràng buộc OCL[5] đặc tả biểu đồ UML[1] chúng ta chỉ đề cập tới 2 vấn đề. Vấn đề thứ nhất chuyển các đặc tả bất biến OCL[5] sang biểu thức logic Alloy[2] và vấn đề thứ hai chuyển đặc tả tiền điều kiện và hậu điều kiện của một phương thức sang biểu thức logic Alloy[2].
Bất biến
Mỗi bất biến đặc tả OCL[5] được hiểu là ràng buộc cho mọi thể hiện của đối tượng được khai báo trong một ngữ cảnh cụ thể. Do vậy chúng ta sẽ chuyển các bất biến thành các biểu thức ràng buộc Alloy[2] nằm trong sự kiện, và chỉ rõ đối tượng chịu ràng buộc trong sự kiện. Ví dụ với đặc tả lớp Student chúng ta khai báo thuộc tính years (sinh viên năm thứ mấy), giả sử chúng ta có ràng buộc là mọi sinh viên phải là sinh viên năm thứ 1, hoặc 2 ..4.
Lớp với thuộc tính và phương thức.
Biến seft chỉ các thể hiện của đối tượng Student. Do vậy trong sự kiện chúng ta phải chỉ ra đối tượng Student. Do vậy bất biến này sẽ được viết thành biểu thức logic trong Alloy[2] như sau:
fact {all s : Student | int s.years >=1 and int s.years <=4 } all s : Student Chỉ ra tất cả thể hiện của đối tượng Student.
int s.years >=1 and int s.years <=4 Ràng buộc cho thể hiện đối tượng.
35
Phần trước chúng ta đã đề cập tới chuyển một phương thức của biểu đồ lớp UML[1] sang Alloy[2]. Khi chuyển một tiền điều kiện và hậu điều kiện của một phương thức trước tiên chúng ta chuyển phương thức đó sang Alloy[2]. Các tiền điều kiện là các điều kiện cho các tham biến, khi đó chúng ta chỉ việc thêm vào các ràng buộc cho các biến trong phương thức được chuyển sang Alloy[2], còn các hậu điều kiện chính là kiểm tra kết quả sau khi thực thi phương thức chúng ta chỉ cần cho biến có kiểu trả về thỏa mãn ràng buộc OCL[5]. Ví dụ chúng ta có phương thức operation(pre : T) và ràng buộc tiền điều kiện là pre > 5 và ràng buộc hậu điều kiện là post < 10.
operation(pre : T) pre operation(pre : T, post : T’) {pre > 5 & post < 10}
Tuy vậy việc chuyển các biểu thức hậu điều kiện là tương đối phức tạp. Do vậy trong đây chúng ta chỉ chuyển đổi các biểu thức tiền điều kiện.