- 17
6.3 Thiết kế hệ thống HBH
TrongphầnnàychúngtahãyápdụngGRASPđểgántráchnhiệmchocáclớpvà tạo ra cácbiểu đồ cộng tác. Chúng ta thựchiện mẫu đối với ca sửdụng “Mua Hàng
bằng tiền mặt” (Buy Items with Cash) và “Khởi động” (Start Up), sau đó thực hiện
tươngtựđốivớinhữngcasửdụngkhác.
Khithiếtkếbiểuđồ cộngtác,chúng tahãythựchiệntheonhữnghướngdẫnsau: 1. Vớimỗithaotác(hoạtđộngchính)đãđượcmôtảtrongcác hợp đồng củahệ
thốngnêntạoramộtbiểuđồriêng.
2. Nếubiểuđồnàyphứctạpthìcóthểchianóthànhnhữngbiểuđồđơngiảnhơ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 saukhihoànthành(post-condition)vàcácmô tảcasửdụngđểxác định tráchnhiệmcủacácđốitượngtronghệ thốngtheomẫugántráchnhiệm nhưđãnêutrên.
Đểthựchiệncasửdụng“Mua Hàng bằng tiền mặt”(Buy Items with Cash)và“Khởi động”(Start Up),hệthốngphảithựchiện: enterItems()(nhậpcácmặthàng), endSale()(kết thúc một phiên bán hàng), makePayment() (thanhToan) và startUp() (khoiDong). Theo hướngdẫntrên,chúngtathiếtkếcácbiểuđồcộngtácchonhữngthaotácđó.
Chúngtabắtđầutừbốnbiểuđồnhưhình6-19. enterItems() endSale() makePayment() startUp() :HBH 1:????() :HBH 1:????() :HBH 1:????() :HBH 1:????() HBH enterItems() endSale() makePayment() startUp() - 120 -
Hình6-19 Cácthaotáccủahệthống
Biểuđồcộngtáccho enterItems()
Trướchếtchúngtaxem lại hợp đồngthựchiệnenterItems() để biếthệthốngphải làmnhữnggì.
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ủahệ thống không có tráchnhiệm hiển thị các thôngtin. Nhữngcôngviệcnàycóthểđượccácđốitượnggiaodiện(Interface Object)đảmnhiệmbằng cáchtruynhậpvàoCSDLvềcácmặthàngvàgửicácthôngđiệpchứanhữngthôngtintương ứngchocácđốitượngđanghoạ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ánhàngthìphảitạolập phienBanHangmới. TráchnhiệmnàyđượcgánchoHBHvà nócónhiệmvụlàphảighilạicácphiênbánhàngnhưthế.
Hơnnữa, mỗikhi phienBanHangđượctạomớithìnólàtập rỗngvàsauđó được bổsungthêmcác dongBanHangmỗikhinhậpxongmộtmặthàng.
Áp dụng cácmẫugán tráchnhiệm nêu trên,gán việctạolập dongBanHangmới choPhienBanHanglàhợplý.
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đanghoạtđộng,dođónócầngửithôngđiệp add()(bổsungvào)chonhững
dongBanHangđangđược nhập vào. Những dongBanHang đượcđưa vào phienBanHang
phảiđượcxácđịnhtừDanhMucMatHangvàsauđólàMoTaMatHang.Vậyđểcóđược nhữngthông tintrên thìHBH phảigửithôngđiệp specification(upc), xácđịnhmô 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ìmtrongtậpcácmôtảmặthàngcómã upc.
Dựavàonhữngthảoluậnnhưtrên,biểuđồcộngtácsẽđượcxâydựngnhưsau: enterItems(upc, n) ↓ 2: mt := specification(up c) : HBH 1: [new] create() 3: makeLineItem(mt, n) 1.1: create () : PhienBanHang 3.1: create(mt,n)
:DanhMucMatHang 3.2: add(sLi) sLi: DongBanHang
2.1: mt := find(upc)
: MoTaMatHang
: DongBanHang
Hình6-20Biểuđồcộngtáccho enterItems()
Tầmnhìncủa cáclớ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ácthông điệp,cụ thểhơn như trongcác biểuđồ tương táclà trao đổi thôngqua các lờigọi hàm.Trongbiể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ánchẳng hạn thìnó gửi tới cho :DanhMucMatHang lời gọi hàm specification(upc),đối tượng nàylại gửi cho :MoTaMatHang lờigọihàm find(upc).
Một đối tượng muốn có được những thông tin từnhững đối tượngkhá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ứchơn,
Để đố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.
Trong thiết kếhướng đốitượng, sự liênkết có liên quan chặtchẽ 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ĩalàgiữahailớptươngứngcóquanhệkếthợp.
Nếu giữahaiđối tượng :Avà :Bhiện thờicóliên kếtvớinhau thìmột trong haiđốitượngđócómộtđốitượngnhìn thấyđối tượngkia.
Vềsựtraođổithôngđiệpgiữacácđốitượngcóthểphátbiểuchínhxácnhưsau:
Để đối tượng :A gửi được thông điệp cho đối tượng :B thì hiện
thời đối tượng :A phải nhìn thấy được đối tượng :B.
Cóbốncáchđểđốitượng A nhìnthấyđượcđốitượng:B.
1. Tầm nhìn thuộc tính::B làthuộctínhcủa:A.
2. Tầm nhìn tham số::Blàthamsốcủamộthàmnàođócủa:A.
3. Tầm nhìn khai báo cục bộ: :B được khaibáolà đốitượng cụcbộ trongđịnh
nghĩahàmcủa:B.
4. Tầm nhìn toàn cục::B làtoàncụ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 đặctí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ộngtáccho endSale
CóthểchọnHBHđểđiềukhiểnthaotácnàycủahệthống.Hợpđồngcủathaotácnàyyê ucầu:
PhienBanHang.isCompleteđượcgántrị truekhikếtthúcnhậpdữliệu.
Nhưvậy, hệ HBH có thể gửithông điệp becomeComplete() cho PhienBanHang đểđặtthuộctính isComplelet nhận giá trị true.
endSale() becomeCompelete()
:HBH :PhienBanHang
becomeComplete(){ isComplete = true; }
Hình6-21 Biểuđồcộngtácthểhiện Kết thúc nhập dữ liệu endSale()
BiểuđồcộngtácchomakePayment
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 cholớp HBH (hình 6-16).Biểu đồ cộng tác môtảthaotác makePayment() đượcvẽlạinhưsau:
makePayment(soTien) 1: makePayment(soTien)
:HBH :PhienBanHang
1.1:create(soTien) Qua bộ điều khiển
:ThanhToan Theo mẫu móc nối yếu
và cố kết cao
Hình6-22 Biểuđồcộngtáccho makePayment() Biểuđồnàyđápứngnhữngđiềukiện sau:
MộtđốitượngcủalớpThanhToanđểthanhtoán,
ThanhToanđượckếthợpvớiPhienBanHang
ThanhToan.soluong = soTien.
-123-
Mỗi khi kết thúcmộ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
CuaHangsaukhiđãgán tráchnhiệm makePayment()choPhienBanHang.Biểuđồở hình6-22đượcbổsungthành: makePayment(soTien) 1: makePayment(soTien) :HBH 2:addSale(s) :CuaHang 2.1:add(s) s:PhienBanHang 1.1:create(soTien) :ThanhToan daBan:PhienBanHang
Hình6-23 Biểuđồcộngtáccho makePayment()vàghinhậnthôngtinđãbán
BiểuđồcộngtácchocasửdụngStartUp
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
(StartUp)vàmộtsố thaotácliên quanđếnviệc khởitạocácgiá trịchomột ứngdụ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ếtkế sau đểđảm bảo mọi thông tin liênquan đến cáchoạtđộngsaunàycủahệthốngđềuđãđượcpháthiệ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 ứngdụng đượctạo ra(created). Nghĩalàtronghệthốngbánhàngphảigántrách nhiệm create()chonhữnglớpchính,đólàHBHhoặcCuaHang.
Chúng tachọn CuaHang bởi vìHBH đãđược chọn làmbộ điềukhiển cho các hoạtđộngcủacảhệthống.
Căn cứ vào hợp đồng của StartUp và nhữngthảo luận ở trên, ta có thể thiết kế
biểuđồcộngtáccho StartUpnhưsau:
1. Bắtđầugửithôngđiệp create()choCuaHang,
2. ĐểtạorađốitượngthuộclớpHBHvàchophépnhữngđốitượngđógửiđược các thông điệp cho DanhMucMatHang đểyêu cầucác thông tin về các mặt hàng (xem biểu đồ cộng táccủa enterItems) thì trướctiên nó cần phải tạo ra các đốitượng DanhMucMatHang.Nghĩa lànógửi thôngđiệp create() trước choDanhMucMatHang,sauđómớigửichoHBHthôngđiệptươngtự. 3. Khimột đối tượngDanhMucMatHang đãđượctạo lập thìnó sẽyêu cầutạo
lập MoTaMatHang và sau đó bổ sung vào danh sách các mô tả mặt hàng, đồngthờibảnthânnótựnạpnhữngthôngtinmôtảnhữngmặthàngtiếptheo.
- 124 -
Biểuđồnàyđượcvẽnhưhình6-24.
create() 2: create(pc) : CuaHang : HBH 1:create() pc: DanhMucMatHang 1.1: create() 1.2.2:*add(p s) ↓ :MoTaMatHang 1.2: loadProdSpec()
1.2.1: *create(upc, price, descrip) ↓
DanhMucMatHang:: loadProdSpec(){ ↓ ps:MoTaMatHang do{
ps = new DanhMucMatHang(upc, price, descrip); Collection(MoTaMatHang).add(ps);
}while NotFinished; }
Hình6-24 Biểuđồ cộngtácchoStartUp
Sựchênhlệchgiữaphântíchvàthiếtkế
Trongbiểuđồ cộngtácchoStartUpmớichỉthểhiệnviệctạora một đối tượngđại diệnchomộtđiểmbánhàngđầucuối.Trongkhiởmôhìnhkháiniệmởphaphân tích, nó được xâydựngđểmô hình cho nhữngcửa hàng thựctế 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
đượctạora.
Từđócóthểthấycómộtsốđiểnchênhlệchgiữakếtquảphântíchvàthiếtkế: 1. Đối tượng :CuaHangtrongcácbiểuđồkhôngphảilàcửahàngthực,nólàđối
tượngmềm,
2. Đối tượng:HBH trongcácbiểuđồkhôngphảilàđiểmbánhàngđầucuốicụ thể,nólàđốitượngmề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ượngHBHvớinhiềuđốitượngkháccầnphảiđượcđồngbộhoáđểđảmbảo sựtoànvẹntrongviệcchiasẻcác thôngtintronghệthống. Điềunàydẫnđến
tính toán đa luồng (multi-thread computation) hoặc tính toán tương tranh
- 125 -
(concurrent computation), vấnđề nàyvượt ra ngoàiphạm vi củađề tài đang thảoluậnởđây.