Bất biến (invariant)

Một phần của tài liệu Nghiên cứu về kiểm chứng bất biến của đối tượng sử dụng lập trình hướng khía cạnh (Trang 54)

Bất biến của lớp (class invariant) là ràng buộc phải luôn luôn được thỏa đối với tất cả các thể hiện của lớp. Trong sơ đồ UML, bất biến là ràng buộc có stereotype là «invariant». Trong biểu thức OCL, bất biến là biểu thức logic được biểu diễn sau từ khóa inv hay invariant.

Giả sử chúng ta có lớp biểu diễn các cầu thủ là Player và mọi cầu thủ tham gia phải có tuổi lớn hơn hoặc bằng 16 thì thuộc tính age thể hiện tuổi của cầu thủ phải có giá trị luôn luôn lớn hơn hay bằng 16. Ràng buộc này được thể hiện trong OCL như sau:

inv: self.age >=16

Trong đó Player là kiểu của thể hiện theo ngữ cảnh của một biểu thức OCL được viết sau từ khóa context. Từ khóa inv khai báo một ràng buộc là một «invariant». self là một thể hiện của Player. Đa số các trường hợp ngữ cảnh là rõ ràng và ta có thể bỏ self.

inv: age >=16

Một ràng buộc có thể có tên được đặt sau từ khóa inv nhưng không bắt buộc. Trong ví dụ trên, có thể đặt tên cho ràng buộc là playerAge.

inv playerAge: self.age >=16

Ta cũng có thể gán một tên tường minh cho một ngữ cảnh thay thế cho self như sau:

Context p: Player inv: p.age >=16

Các bất biến có thể được thể hiện độc lập hoặc được nối với nhau bằng từ toán tử and. Ví dụ, tuổi của cầu thử được giới hạn từ 16 đến 35 thì bất biến được thể hiện:

Context p: Player

inv: p.age >=16 and p.age <=35 hoặc

Context p: Player inv: p.age >=16 inv: p.age <=35

Các biểu thức OCL có thể gọi các phương thức. Ví dụ, số cầu thủ một đội tuyển không được ít hơn 16 và không được vượt quá 20.

context PlayerTeam

inv: self.getSize() >= 16 and self.getSize() <= 20

Các biểu thức OCL có thể duyệt các liên kết. Ví dụ, tuổi của người lãnh đạo đội bóng phải lớn hơn hoặc bằng 40.

context PlayerTeam

inv: self.manager.age >=40

Việc liên kết sẽ tạo ra đối tượng với kiểu tương ứng. Trong ví dụ trên self.manager là một đối tượng có kiểu là Person. Để truy cập tới một liên kết hoặc thuộc tính hay phương thức của nó ta sử dụng mũi tên „->‟ hoặc dấu chấm.

Trong trường hợp trên bội của liên kết là 1. Khi bội của liên kết lớn hơn 1 thì các thao tác trên tập hợp sẽ được sử dụng như size, includes, isEmpty, union, intersection, … Ví dụ:

context PlayerTeam inv: player->size()<20

Một phần của tài liệu Nghiên cứu về kiểm chứng bất biến của đối tượng sử dụng lập trình hướng khía cạnh (Trang 54)