Các biểu đồ cộng tác

Biểu đồ cộng tác gần giống như biểu đồ trình tự (như đã trình bày ở trên), mô tả sự tương tác của các đối tượng với nhau, nhưng khác với biểu đồ trình tự là ở đây tập trung vào ngữ cảnh và không gian thực hiện công việc.

Biểu đồ cộng tác chính là một đồ thị chỉ ra một số các đối tượng và những sự liên kết giữa chúng, trong đó các đỉnh là các đối tượng còn cạnh thể hiện sự trao đổi thông điệp giữa các đối tượng.

Hãy xét vấn đề thanhtoán trong hệ thống bán hàng. Giả sử khách hàng trả tiền mua hàng bằng tiền mặt. Người bán phải ghi lại số tiền mà khách đưa và qua đó hệ thống HBH nhận được thông điệp makePayment(soTien).soTien là số tiền khách đưa, thường là lớn hơn số tiền hàng và hệ thống phải tính số dư để trả lại cho khách. Để thực hiện được yêu cầu thanh toán thì HBH lại gửi một thông điệp tương tự cho phiênbánhàngvà kết quả là tạo ra một đối tượng của lớp ThanhToantheo thông điệp create(soTien) để thực hiện thanh toán với khách hàng. Hình 1 mô tả biểu đồ trình tự trao đổi các thông điệp trên lần lượt theo thời gian. Sau đây chúng ta sử dụng biểu đồ cộng tác để thể hiện cùng mối tương tác đó nhưng theo ngữ cảnh thực hiện công việc.

Biểu đồ cộng tác để thực hiện thanh toán tiền mặt

Biểu đồ trên được đọc như sau:

1. Thông điệp đầu makePayment(soTien)(chính là lời gọi hàm) được gửi tới một đối tượng :HBH của HBH.

2. Đối tượng :HBH gửi tiếp thông điệp tới một đối tượng của PhienBanHanglà :PhienBanHang. Hàm này được đánh số là 1.

3. :PhienBanHang gọi toán tử tạo lập của lớp ThanhToanđể tạo ra một đối tượng :ThanhToan theo thông điệp created(soTien)để làm nhiệm vụ thu tiền. Thông điệp này được đánh số là 1.1.

Qua đó có thể khẳng định: biểu đồ cộng tác của một hoạt động thể hiện thuật toán để thực thi hành động đó.

Trước khi thiết kế các biểu đồ cộng tác cho các hoạt động của hệ thống, hãy lưu ý một số ký hiệu, cách biểu diễn các thông điệp và một số qui ước như sau:

(1) Thể hiện giá rị trả lại(returnvalue)

Một số thông điệp được gửi đến cho một đối tượng và yêu cầu trả lại giá trị cho đối tượng gửi. Giá trị này có thể chỉ ra thông qua phép gán cho một tên biến và tên của thông điệp đó. Trong lập trình, thực chất đây là lời gọi hàm có kiểu giá trị trả lại (trong C, đó là những hàm có kiểu trả lại khác void).

Cú pháp chung của thông điệp này có dạng:

ReturnVariableName := message(parameter:ParameterType): ReturnType

Thông điệp có giá trị trả lại

(2) Thể hiện các thông điệp lặp

Một đối tượng có thể gửi một thông điệp lặp lại một số lần cho đối tượng khác. Thông điệp được gửi lặp lại nhiều lần có thể biểu diễn bằng dấu ‘*’ trước thông điệp.

Thông điệp lặp lại với số lần không xác định

Thông điệp lặp lại với số lần xác định

Có một số cách khác nhau để biểu diễn cho chu trình lặp, ví dụ thay vì viết *[i := 1..10] ta có thể viết *[ i < 11].

Như đã khẳng định từ trước, khi một đối tượng nhận được một thông điệp, cụ thể như :HBH nhận được msg() như hình 3, thì lớp HBH phải có hàm thành phần msg(). Mặt khác, biểu đồ cộng tác thể hiện thuật toán mô tả hoạt động của hệ thống. Vậy dựa vào biểu đồ cộng tác ở hình 4, người lập trình có thể viết hàm msg() (trong C) cho lớp HBH như sau:

void msg(){

for(int i = 1; i < 11; i++)

dong[i] = phienBH.dongBanTiep();

}

Hàm này gọi tới hàm dongBanTiep() của lớp PhienBanHang thông qua đối tượng phienBH để đọc liên tiếp 10 dòng bán hàng.

Một đối tượng có thể gửi thông điệp cho chính nó, nghĩa là thông điệp có thể quay vòng tròn.

(3) Tạo lập đối tượng mới

UML sử dụng thông điệp create()để tạo lập một đối tượng mới (một thể hiện nào đó của một lớp). Trong biểu đồ có thể sử dụng thêm ký tự <<new>> ở đối tượng nhận thông điệp.

Tạo lập đối tượng mới

(4) Quy tắc đánh số các thông điệp

(i) Thông điệp đầu không được đánh số.

(ii) Những thông điệp được gửi tới cho các đối tượng trực tiếp được đánh số tăng dần 1:--, 2:--, v.v.

(iii) Các thông điệp gửi tiếp cho các đối tượng tiếp theo được đánh số theo quy tắc “dấu chấm” (‘.’).

Đánh số các thông điệp

(5) Các điều kiện gửi thông điệp

Đôi khi, một thông điệp có thể bị cầm canh (guarded) và nó được gửi đến cho một đối tượng khác chỉ khi thoả mãn một điều kiện nào đó. Điều kiện condition được để trong cặp ngoặc ‘[‘ và ‘]’.

Các thông điệp được gửi đi có điều kiện

Biểu đồ trên thể hiện:

+ Thông điệp số 1a được gửi cho :B nếu điều kiện condition thoả mãn,

+ Ngược lại, nếu condition sai (non condition) thì thông điệp 1b sẽ được gửi đến cho :D.

(6) Các thông điệp gửi cho một tập (nhiều) các đối tượng

UML ký hiệu tập các thể hiện (đối tượng) như là một kho các đối tượng dạng:

Ký hiệu tập các đối tượng phienBH của lớp PhienBanHang.

Đối tượng :PhienBanHang gửi thông điệp next() tất cả các phienBH và thông điệp print() cho một :DongBanHang bất kỳ.

Gửi thông điệp cho nhiều đối tượng