Biểu đồ cộng tác chỉ ra cách các thông điệp được gửi đến cho các đối tượng bằng các lời gọi hàm. Dãy các thông điệp nhận được sẽ được dịch tương ứng sang dãy các lệnh trong định nghĩa hàm thành phần của một lớp.
Chúng ta hãy xét biểu đồ cộng tác mô tả nhiệm vụ enterItems (nhập dữ liệu vào) và dựa vào đó đểđịnh nghĩa hàm enterItems().
Hình 7-8 Biểu đồ cộng tác cho enterItems
Thông điệp enterItems được gửi cho một đối tượng của HBH, do vậy, trong lớp HBH sẽ có hàm enterItems() được định nghĩa như sau:
HBH endSale() enterItems() makePayment(soTien: Number) PhienBanHang ngayBan: Date gioBan: Time isComplete: Boolean becomeComplete() makeLineItem() total() muc public class HBH{ HBH(DanhMucMatHang pc); public void endSale();
public void enterItems();
public void makePayment(float soTien); private PhienBanHang banHang ; private DanhMucMatHang muc; } 1 1 DanhMucMatHang specification() banHang 1 1 2: mt := specification(upc) :DongBanHang enterItems(upc, n) :PhienBanHang :DanhMucMatHang 1: [new] create() 2.1: mt := find(upc) : HBH 3: makeLineItem(mt, n) :MoTaMatHang sLi: DongBanHang 1.1: create() 3.2: add(sLi) 3.1: create(mt,n)
public void enterItems(UPC upc, int soLuong);
Thông điệp 1: Theo biểu đồ trên, để thực hiện được nhiệm vụ enterItems() thì
trước tiên nó phải tạo ra :PhienBanHang mới, nếu đó là mặt hàng đầu tiên được nhập vào. Nghĩa là
if (isNewSale()){banHang = new PhienBanHang();}
Hàm đầu tiên chúng ta cần khảo sát là: isNewSale(). Hàm này có thể khai báo
private, làm nhiệm vụ kiểm tra xem biến đối tượng của PhienBanHang có rỗng hay không, nghĩa là đối tượng của PhienBanHang chưa được thiết lập hoặc là đã kết thúc phiên bán hàng trước đó. Vậy
private int isNewSale(){return (banHang == null)
|| banHang.isComplete();}
Lứu ý: C++ không có kiểu Boolean, nhưng nó xem giá trị của biểu thức khác 0 là
đúng (true) và bằng 0 là sai (false). Hàm này được bổ sung vào lớp HBH ngoài những hàm được xác định nhưở hình 7.7.
Thông điệp 2: Tiếp theo, một thông điệp được gửi cho :DanhMucMatHang để
xác định các thông tin về mặt hàng có mã là upc.
DanhMucMatHang moTa = muc.specification(upc);
muc là một đối tượng của DanhMucMatHang.
Thông điệp 3: Thông điệp thứ ba makeLineItem được gửi cho :PhienBanHang để
xác lập một dòng bán hàng thông qua đối tượng banHang. banHang.makeLineItem(moTa, soLuong);
Tóm lại, mỗi thông điệp được gửi đi để thực hiện một yêu cầu của thông điệp đầu tiên trong biểu đồ cộng tác, sẽ được ánh xạ thành dãy các câu lệnh tương ứng trong định nghĩa hàm thành phần ứng với từng thông điệp đó.
Theo nguyên tắc đó, hàm enterItems() được định nghĩa đầy đủ như sau: public void enterItems(UPC upc, int soLuong){
if (isNewSale()){banHang = new PhienBanHang();} DanhMucMatHang moTa = muc.specification(upc); banHang.makeLineItem(moTa, soLuong);
}
Định nghĩa hàm makeLineItem()
Xét tiếp biểu đồ cộng tác cho enterItems(upc, soLuong) ở hình 6-20, lớp
PhienBanHang nhận được thông điệp makeLineItem(moTa, soLuong). Để thực hiện
được yêu cầu này, nó lại phải gửi đi hai thông điệp: 3.1: create(moTa, soLuong) cho sl: DongBanHang và 3.2: adds(sl) cho tập các đối tượng :DongBanHang. Do đó, hàm
makeLineItem() trong lớp PhienBanHang sẽđược định nghĩa như sau:
lineItem.addElement(new DongBanHang(moTa, soLuong);
}
Thứ tự cài đặt các lớp
Các lớp cần được cài đặt từ những lớp cặp bộ yếu dần đến những lớp cặp bộ cao hơn. Ví dụ, những lớp đầu tiên có thể chọn để cài đặt trong hệ HBH là: hoặc
ThanhToan, hoặc MoTaMatHang, sau đó là DanhMucMatHang, PhienBanHang, rồi đến HBH và CuaHang, v.v. như hình 7-9.
Hình 7-9 Thứ tự cài đặt các lớp