Hình 9. Chuyển quan hệ tổng quát hóa sang quan hệ nhị phân[3]
Mô tả :
Vế trái Hình 9 biểu diễn quan hệ tổng quát hóa giữa 2 lớp S và G trong đó lớp G là lớp tổng quát hóa, vế phải biểu diễn quan hệ nhị phân giữa 2 lớp S và G và thêm vào đó các lượng tử tham gia quan hệ và ràng buộc.
Giải thích Hình 9
rg : Biểu diễn mút liên hệ (association end) giữa 2 lớp S và G và biểu diễn rg : S-> G.
26
Chúng ta phải đưa ra ràng buộc để đảm bảo tương đương ngữ nghĩa giữa vế trái và vế phải của hình. Ràng buộc thêm vào đảm bảo một đối tượng của lớp S buộc phải liên hệ với một đối tượng G duy nhất hay là sẽ không có 2 đối tượng thuộc lớp S cùng liên hệ với một đối tượng thuộc lớp G.
Biểu diễn ràng buộc bằng OCL
S->forAll(s,s’ | s<>s’ implies s.rg <> s’.rg )
Ví dụ
Mô tả : Giả sử có 2 lớp G và lớp S, trong đó lớp G là lớp tổng quát hóa của lớp S. Lớp G có thuộc tính name kiểu string. Lớp S có thêm thuộc tính old kiểu Old.
Mục đích của chúng ta là chuyển quan hệ tổng quát hóa giữa 2 lớp S và G thành quan hệ nhị phân như trình bày ở trên.
Hình 10. Ví dụ mô hình chuyển đổi OCL sang Alloy
Chuyển vế phải của hình 12 sang biểu diễn Alloy[2]. Mỗi lớp chuyển thành một khai báo ký hiệu trong Alloy[2], mỗi thuộc tính lớp chuyển thành một trường trong ký hiệu tương ứng, mỗi mút liên kết cũng chuyển thành một trường quan hệ trong ký hiệu
tương ứng, các ràng buộc OCL[5] chuyển thành các biểu thức ràng buộc logic Alloy[2]. Kiểu của thuộc tính chuyển thành một khai báo ký hiệu.
Bảng 5. Quy tắc chuyển quan hệ tổng quát hóa sang quan hệ nhị phân
UML và đặc tả OCL Biểu diễn Alloy tương ứng
class S sig S
Kiểu dữ liệu Old sig Old
Thuộc tính old một trường old trong sig S
27
Kiểu dữ liệu string sig string
thuộc tính name một trường name trong sig G
rg chuyển thành trường trong S
ràng buộc OCL : S->forAll(s,s’ | s<> s’ implies s.rg <> s’.rg)
all s,s’: S | s!= s’ => s.rg != s’.rg và đảm bảo một đối tượng của lớp S chỉ liên hệ với một đối tượng của lớp G.
Biểu diễn đặc tả OCL
Bên cạnh việc chuyển quan hệ tổng quát hóa hay còn gọi là quan hệ kế thừa trong ngôn ngữ lập trình hướng đối tượng sang quan hệ nhị phân thì chúng ta có thể sử dụng quan hệ kế thừa trong Alloy[2], mỗi lớp trong biểu đồ UML[1] chuyển thành một ký hiệu
trong Alloy[2], quan hệ tổng quát hóa biểu diễn trong UML[1] chuyển trực tiếp thành quan hệ kế thừa trong Alloy[2] thông qua cú pháp :
sig G{}
sig S extends sig G {}
Trong đó :
G là lớp tổng quát hóa của lớp S.
Tổng quát lại quy tắc chuyển đổi đã nêu ở phần 3.1.1 và 3.1.2 chúng ta có quy tắc chuyển đơn giản sau
Tên vai trò - role name : Tên vai trò thể hiện vai trò của một lớp với lớp khác, chúng sẽ được chuyển thành các trường quan hệ trong khai báo của ký hiệu tương ứng.
Bản số quan hệ -muliticity: Bản số cho biết một đối tượng của lớp này có thể liên hệ với bao nhiêu đối tượng của lớp kia. Bản số quan hệ sẽ được chuyển thành các khai báo bất biến trong OCL[5], tiếp đó các bất biến này được chuyển thành các khai báo logic
28
Alloy[2] và được đặt trong khai báo sự kiện, khai báo này tương đương với khai báo bất biến trong OCL[5], các ràng buộc trong sự kiện luôn luôn được tham chiếu trước tiên khi thực thi chương trình.
Tổng quát hóa : Có 2 cách có thể biểu diễn quan hệ này trong Alloy[2], với cách thứ nhất chúng ta sẽ chuyển quan hệ tổng quát hóa sang quan hệ nhị phân bình thường và thêm vào các ràng buộc cho quan hệ, cách thứ 2 chúng ta biểu diễn trực tiếp quan hệ tổng quát hóa trong biểu diễn UML[1] sang quan hệ kế thừa trong Alloy[2] thông qua từ khóa extends.