5. Mẫu điều khiển (Controller)
6.3 Thiết kế hệ thống HBH
Trong phần này chỳng ta hóy ỏp dụng GRASP để gỏn trỏch nhiệm cho cỏc lớp và tạo ra cỏc biểu đồ cộng tỏc. Chỳng ta thực hiện mẫu đối với ca sử dụng “Thanh toỏn
tiền mặt” và “Khởi động” (Start Up), sau đú thực hiện tương tự đối với những ca sử
dụng khỏc.
Khi thiết kế biểu đồ cộng tỏc, chỳng ta hóy thực hiện theo những hướng dẫn sau: 1. Với mỗi thao tỏc (hoạt động chớnh) đó được mụ tả trong cỏc hợp đồng của hệ
thống nờn tạo ra một biểu đồ riờng.
2. Nếu biểu đồ này phức tạp thỡ cú thể chia nú thành những biểu đồ đơn giản hơn. 3. Sử dụng cỏc hợp đồng trỏch nhiệm, trong đú dựa vào những điều kiện cần
thoả món sau khi hồn thành (post-condition) và cỏc mụ tả ca sử dụng để xỏc định trỏch nhiệm của cỏc đối tượng trong hệ thống theo mẫu gỏn trỏch nhiệm như đó nờu trờn.
Để thực hiện ca sử dụng “Thanh toỏn tiền mặt và “Khởi động”, hệ thống phải thực hiện: enterItems() (nhập cỏc mặt hàng), endSale() (kết thỳc một phiờn bỏn hàng),
makePayment() (thanh toỏn) và startUp() (khởi động). Theo hướng dẫn trờn, chỳng ta thiết
kế cỏc biểu đồ cộng tỏc cho những thao tỏc đú.
Chỳng ta bắt đầu từ bốn biểu đồ như hỡnh 6-19.
Hỡnh 6-19 Cỏc thao tỏc của hệ thống enterItems() :HBH 1: ????() startUp() :HBH 1: ????() makePayment() :HBH 1: ????() endSale() :HBH 1: ????() HBH enterItems() endSale() makePayment() startUp()
Biểu đồ cộng tỏc cho enterItems()
Trước hết chỳng ta xem lại hợp đồng thực hiện enterItems() để biết hệ thống phải làm những gỡ.
1. Hiển thị thụng tin mụ tả và giỏ bỏn của mặt hàng được nhập vào.
Núi chung, cỏc đối tượng của hệ thống khụng cú trỏch nhiệm hiển thị cỏc thụng tin. Những cụng việc này cú thể được cỏc đối tượng giao diện đảm nhiệm bằng cỏch truy nhập vào CSDL về cỏc mặt hàng và gửi cỏc thụng điệp chứa những thụng tin tương ứng cho cỏc đối tượng đang hoạt động.
2. Tạo lập phiờn bỏn hàng mới.
Như trong hợp đồng đó nờu rừ: khi nhập vào mặt hàng đầu tiờn của mỗi phiờn bỏn hàng thỡ phải tạo lập phienBanHang mới. Trỏch nhiệm này được gỏn cho HBH và nú cú nhiệm vụ là phải ghi lại cỏc phiờn bỏn hàng như thế.
Hơn nữa, mỗi khi phienBanHang được tạo mới thỡ nú là tập rỗng và sau đú được bổ sung thờm cỏc dongBanHang mỗi khi nhập xong một mặt hàng.
Áp dụng cỏc mẫu gỏn trỏch nhiệm nờu trờn, gỏn việc tạo lập dongBanHang mới
cho PhienBanHang là hợp lý.
3. Xỏc định cỏc thụng tin mụ tả và giỏ bỏn.
Sau khi cỏc dongBanHang được tạo lập thỡ phải được đưa bổ sung vào
phienBanHang đang hoạt động, do đú nú cần gửi thụng điệp add() (bổ sung vào) cho những dongBanHang đang được nhập vào. Những dongBanHang được đưa vào phienBanHang
phải được xỏc định từ DanhMucMatHang và sau đú là MoTaMatHang. Vậy để cú được những thụng tin trờn thỡ HBH phải gửi thụng điệp specification(upc), xỏc định mụ tả mặt hàng cú mó là upc cho :DanhMucMatHang, đối tượng này lại gửi tiếp đi thụng điệp find(upc), để tỡm trong tập cỏc mụ tả mặt hàng cú mó upc.
Dựa vào những thảo luận như trờn, biểu đồ cộng tỏc sẽ được xõy dựng như sau:
Hỡnh 6-20 Biểu đồ cộng tỏc cho enterItems()
2: mt := specification(upc) : DongBanHang : 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)
Tầm nhỡn của cỏc lớp
Như đó khẳng định nhiều lần, cỏc đối tượng trong hệ thống tương tỏc với nhau bằng cỏch trao đổi cỏc thụng điệp, cụ thể hơn như trong cỏc biểu đồ tương tỏc là trao đổi thụng qua cỏc lời gọi hàm. Trong biểu đồ ở hỡnh 6-20, khi hệ thống cần xỏc định những thụng tin về mặt hàng cú mó upc cho trước, như giỏ bỏn chẳng hạn thỡ nú gửi tới cho :DanhMucMatHang lời gọi hàm specification(upc), đối tượng này lại gửi cho :MoTaMatHang lời gọi hàm find(upc).
Một đối tượng muốn cú được những thụng tin từ những đối tượng khỏc thỡ đối tượng đú phải cú khả năng nhỡn thấy được những gỡ mà nú cần thiết. Một cỏch hỡnh thức hơn,
Trong thiết kế hướng đối tượng, sự liờn kết cú liờn quan chặt chẽ với khỏi niệm
khả năng nhỡn thấy được của cỏc đối tượng.
Nếu :A cú thể nhỡn thấy :B thỡ phải cú một liờn kết giữa hai đối tượng đú, nghĩa là giữa hai lớp tương ứng cú quan hệ kết hợp.
Nếu giữa hai đối tượng :A và :B hiện thời cú liờn kết với nhau thỡ một trong hai đối tượng đú cú một đối tượng nhỡn thấy đối tượng kia.
Về sự trao đổi thụng điệp giữa cỏc đối tượng cú thể phỏt biểu chớnh xỏc như sau:
Cú bốn cỏch để đối tượng A nhỡn thấy được đối tượng :B.
1. Tầm nhỡn thuộc tớnh: :B là thuộc tớnh của :A.
2. Tầm nhỡn tham số: :B là tham số của một hàm nào đú của :A.
3. Tầm nhỡn khai bỏo cục bộ: :B được khai bỏo là đối tượng cục bộ trong định
nghĩa hàm của :B.
4. Tầm nhỡn toàn cục: :B là toàn cục.
Dựa vào phạm vi quan sỏt của cỏc đối tượng trong cỏc biểu đồ để khai bỏo cỏc đặc tớnh private, protected, public cho cỏc thuộc tớnh và hàm thành phõn trong cỏc lớp
đối tượng.
Biểu đồ cộng tỏc cho endSale
Cú thể chọn HBH để điều khiển thao tỏc này của hệ thống. Hợp đồng của thao tỏc này yờu cầu: PhienBanHang.isComplete được gỏn trị true khi kết thỳc nhập dữ liệu.
Để đối tượng :A cú thể gửi một thụng điệp cho đối tượng :B thỡ lớp A phải được liờn kết với lớp B.
Để đối tượng :A gửi được thụng điệp cho đối tượng :B thỡ đối tượng :A phải nhỡn thấy được đối tượng :B.
Như vậy, hệ HBH cú thể gửi thụng điệp becomeComplete() cho PhienBanHang
để đặt thuộc tớnh isComplelet nhận giỏ trị true.
Hỡnh 6-21 Biểu đồ cộng tỏc thể hiện Kết thỳc nhập dữ liệu endSale()
Biểu đồ cộng tỏc cho makePayment
Một lần nữa nhắc lại, chỳng ta sẽ xem HBH như là bộ điều khiển. Trong phần thảo luận về mẫu gỏn trỏch nhiệm để đảm bảo mức độ múc nối giữa cỏc lớp yếu, nhưng độ cố kết lại cao, chỳng ta đó gỏn trỏch nhiệm tạo lập đối tượng ThanhToan
cho lớp PhienBanHang, chứ khụng gỏn cho lớp HBH (hỡnh 6-16). Biểu đồ cộng tỏc mụ tả thao tỏc makePayment() được vẽ lại như sau:
Hỡnh 6-22 Biểu đồ cộng tỏc cho makePayment() Biểu đồ này đỏp ứng những điều kiện sau:
Một đối tượng của lớp ThanhToan đảm nhận việc thanh toỏn, ThanhToan được kết hợp với PhienBanHang
ThanhToan.soluong = soTien.
Ghi nhận những phiờn bỏn hàng đó kết thỳc
Mỗi khi kết thỳc một phiờn bỏn hàng, theo yờu cầu trong hoạt động kinh doanh của Cụng ty, hệ thống phải ghi lại ký sự của những phiờn bỏn hàng đú. Theo kinh nghiệm của chuyờn gia, ta cú thể gỏn trỏch nhiệm này, trỏch nhiệm addSale() cho
becomeComplete(){ isComplete = true; } :HBH endSale() :PhienBanHang becomeCompelete() makePayment(soTien) :HBH 1: makePayment(soTien) :PhienBanHang :ThanhToan 1.1: create(soTien)
Theo mẫu múc nối yếu và cố kết cao Qua bộ điều khiển
CuaHang sau khi đó gỏn trỏch nhiệm makePayment() cho PhienBanHang. Biểu đồ ở
hỡnh 6-22 được bổ sung thành:
Hỡnh 6-23 Biểu đồ cộng tỏc cho makePayment() và ghi nhận thụng tin đó bỏn
Biểu đồ cộng tỏc cho ca sử dụng StartUp
Phần lớn cỏc hệ thống (nhưng khụng phải tất cả) đều cú ca sử dụng “Khởi động” và một số thao tỏc liờn quan đến việc khởi tạo cỏc giỏ trị cho một ứng dụng khi bắt đầu thực thi. Mặc dự thao tỏc này thường là thao tỏc đầu tiờn hệ thống phải thực hiện, nhưng chỳng ta để lại thiết kế sau để đảm bảo mọi thụng tin liờn quan đến cỏc hoạt động sau này của hệ thống đều đó được phỏt hiện.
Biểu đồ cộng tỏc của StartUp chỉ ra những gỡ cú thể xảy ra khi đối tượng của
miền ứng dụng được tạo ra. Nghĩa là trong hệ thống bỏn hàng phải gỏn trỏch nhiệm
create() cho những lớp chớnh, đú là HBH hoặc CuaHang.
Chỳng ta chọn CuaHang bởi vỡ HBH đó được chọn làm bộ điều khiển cho cỏc hoạt động của cả hệ thống.
Căn cứ vào hợp đồng của StartUp và những thảo luận ở trờn, ta cú thể thiết kế
biểu đồ cộng tỏc cho StartUp như sau:
1. Bắt đầu gửi thụng điệp create() cho CuaHang,
2. Để tạo ra đối tượng thuộc lớp HBH và cho phộp những đối tượng đú gửi được cỏc thụng điệp cho DanhMucMatHang để yờu cầu cỏc thụng tin về cỏc mặt hàng (xem biểu đồ cộng tỏc của enterItems) thỡ trước tiờn nú cần phải tạo ra
cỏc đối tượng DanhMucMatHang. Nghĩa là nú gửi thụng điệp create() trước cho DanhMucMatHang, sau đú mới gửi cho HBH thụng điệp tương tự. 3. Khi một đối tượng DanhMucMatHang đó được tạo lập thỡ nú sẽ yờu cầu tạo
lập MoTaMatHang và sau đú bổ sung vào danh sỏch cỏc mụ tả mặt hàng,
đồng thời bản thõn nú tự nạp những thụng tin mụ tả những mặt hàng tiếp theo. Biểu đồ này được vẽ như hỡnh 6-24.
makePayment(soTien) 2: addSale(s) 2.1: add(s) :HBH 1: makePayment(soTien) s:PhienBanHang :ThanhToan 1.1: create(soTien) :CuaHang daBan:PhienBanHang
Hỡnh 6-24 Biểu đồ cộng tỏc cho StartUp
Sự chờnh lệch giữa phõn tớch và thiết kế
Trong biểu đồ cộng tỏc cho startUp mới chỉ thể hiện việc tạo ra một đối tượng đại diện cho một điểm bỏn hàng đầu cuối. Trong khi ở mụ hỡnh khỏi niệm ở pha phõn tớch, nú được xõy dựng để mụ hỡnh cho những cửa hàng thực tế cú thể cú nhiều điểm bỏn hàng đầu cuối, nghĩa là khi hệ thống hoạt động thỡ sẽ cú nhiều đối tượng của HBH
được tạo ra.
Từ đú cú thể thấy cú một số điển chờnh lệch giữa kết quả phõn tớch và thiết kế: 1. Đối tượng :CuaHang trong cỏc biểu đồ khụng phải là cửa hàng thực, nú là đối
tượng mềm,
2. Đối tượng :HBH trong cỏc biểu đồ khụng phải là điểm bỏn hàng đầu cuối cụ
thể, nú là đối tượng mềm,
3. Biểu đồ cộng tỏc thể hiện mối quan hệ tương tỏc giữa một đối tượng :CuaHang và :HBH.
4. Tổng quỏt hoỏ từ một đối tượng của HBH sang nhiều đối tượng đũi hỏi
CuaHang phải tạo ra nhiều thể hiện. Và những sự tương tỏc giữa cỏc đối
tượng HBH với nhiều đối tượng khỏc cần phải được đồng bộ hoỏ để đảm bảo sự toàn vẹn trong việc chia sẻ cỏc thụng tin trong hệ thống. Điều này dẫn đến tớnh toỏn đa hoặc tớnh toỏn tương, vấn đề này vượt ra ngoài phạm vi của đề tài đang thảo luận ở đõy.
1.1: create()
DanhMucMatHang:: loadProdSpec(){ do{
ps = new DanhMucMatHang(upc, price, descrip); Collection(MoTaMatHang).add(ps); }while NotFinished; } create() pc: DanhMucMatHang ps:MoTaMatHang 1.2: loadProdSpec() : CuaHang : HBH : MoTaMatHang 2: create(pc) 1:create() 1.2.2:*add(ps)
1.2.1: *create(upc, price, descrip)