Mẫu gán trách nhiệm

Một phần của tài liệu giáo trình ngôn ngữ hóa thống nhất uml (Trang 130 - 137)

- 17

6.2.2 Mẫu gán trách nhiệm

Nhiệm vụ chính của người thiếtkế làđịnh nghĩa được các lớp để các đối tượng của chúngthựchiện đượcnhữngnhiệm vụmà hệthống yêu cầu.Muốnvậy, chúng ta phảithiết kếđượcchitiếtcácbiểuđồcộng tácmôtảchính xáctừnghoạtđộngcủahệ thống vàgánnhiệm vụcho cáclớpđốitượng.

Tráchnhiệm

Trách nhiệm (Responsibility) được mô tả trong hợp đồng, là nghĩa vụ của từng

đối tượng. Hoạt động (hành vi) của các đối tượng liên quan chặt chẽ tới các trách nhiệmcủacácđốitượng đó.

Nóichungcóhailoạitráchnhiệm:

1. Các trách nhiệm thực hiện: đó là những hoạt động mà đối tượng thực hiện

baogồm:

 Tựđộngthựchiệncáigìđó,

 Khởi động một hoạt động hoặc kích hoạt một thao tác của những đối tượngkhác,

 Điềukhiểnhoặcphốihợpcáchànhđộnggiữacácđốitượngkhácnhau,

2. Những trách nhiệm để biết:nhữnghiểubiếtvềcácđốitượng,baogồm:

 Hiểubiếtvềdữliệuriêng,đượcbaogóivàbịchegiấu,

 Hiểubiếtvềnhữngđốitượng liênquan,

 Hiểubiếtvềnhữngsựvậtcóthểxuấtpháthoặcnhữngtínhtoánnàođó. Tất cả các thông tin trong hệ thốnghướng đối tượng đều được lưutrữ theo các đối tượng và nó chỉ được xử lý khi các đối tượng đó được ra lệnh thựchiện những nhiệm vụ tương ứng. Để sửdụng được cácđối tượng, ngoài các thuộc tính,chúng ta phảibiết cáchgiao tiếpvớichúng,nghĩa làphảibiết chúng cónhữnghàm thànhphần nào.Điềunàycóthểtìmthấytrongcácbiểuđồcộngtác.

Cácbước thiếtkếbiểuđồcộngtác

Việctạo rabiểuđồcộngtáccóthểthựchiệnnhưsau:

1. Xác địnhcáctrách nhiệmtừ cáccasửdụng, môhình kháiniệm (biểuđồ lớp) vàcáchợpđồnghànhđộngcủahệthống,

-113-

2. Gán tráchnhiệm cho cácđối tượng,quyếtđịnh xem đốitượngnàophải thực thinhữngtráchnhiệmtrên,

3. Lặp lại haibướctrêncho đếnkhi gánhết cáctráchnhiệm trongbiểu đồ cộng tác.

Lưu ý: Các trách nhiệm của đối tượng sẽ được cài đặt trong lớp của những đối tượng đó bằng các hàm thành phần (phương thức).

TrongUML,các trách nhiệm sẽđượcgán cho đối tượngkhi tạora biểuđồ cộng tácvàbiểu đồcộngtácthểhiệncảhaikhía cạnh,gán tráchnhiệmvàsựcộng tácgiữa cácđốitượngtrongbiểuđồđó.

6.2.3Mẫugántráchnhiệm

Những người thiết kế hướng đối tượng có kinh nghiệm thường sử dụng những nguyên lý chung và những phương pháp giải phù hợp với một ngôn ngữ lập trình,

được gọi là mẫu (pattern) hướngdẫn để tạo ra phần mềm. Một cách đơn giản hơn,

mẫu là cách gọi một cặp (bài toán / lời giải) có thể áp dụng trong những ngữ cảnh mới,vớinhữnglờikhuyênlàmthếnàođểápdụngđượcvàotìnhhìnhmới.

Sau đây chúng ta sẽ xét năm mẫu gán trách nhiệm cơ bản (GRASP: General ResponsibilityAssignmentSoftwarePatterrn): Expert (Chuyên gia), Creator (Tạo lập mới), Low Coupling (Móc nối yếu), Hight Cohension (Cố kết chặt), và Controller (Điều khiển).

1. Gántráchnhiệmtheochuyêngia (Expert)

Ví dụ trong hệ thống bán hàng HBH, một số lớp cần phải biết số tiền của mỗi phiênbánhàngvàđểgánđượccáctráchnhiệmthìphảitrảlời:

Ai có trách nhiệm để biết về số tiền của mỗi phiên bán hàng?

Theoýkiến chuyên gia,đểtrả lờicâuhỏitrênthìphảitìmnhữnglớp chứanhững thôngtin trên.Đólà:Tất cảcác dòng bán hàng củamỗi phiên bán hàng, trongđó cần tínhtổng(total)củacácmục thành tiền(subtotal)củatừng dòng bán hàng.

Chỉcó phienBanHang(đốitượngphiên bánhànghiện thời)biếtvềthôngtinnày, vìvậy,theochuyên giathìgántráchnhiệmcholớpPhienBanHang.

Chúngtabắtđầu vẽbiểuđồcộngtácliênquan đếnviệcgán tráchnhiệm tínhtiền bánhàng(total())cholớpPhienBanHang.

total() PhienBanHang

: PhienBanHang

Bổ sung thêm hàm total()

Hình6-10Phầnđầucủabiểuđồcộngtác

-114-

ngayBan gioBan total()

nhữngmục con (sốtiền bán từng mặthàng). Thông tin nàyđược xácđịnh thông qua hàm subtotal().Vìvậy, :PhienBanHang phải gửitiếpthôngđiệp subtotal()cho từng :

DongBanHang nhưhình6-11.

total()

: PhienBanHang 1: *[for each] sLi := next()

2: st := subtotal() sLi: DongBanHang : DongBanHang PhienBanHang ngayBan gioBan DongBanHang soLuong subtotal() total()

Hình6-11 Traođổigiữacácđốitượngđểtínhđược total()

Để biết và tính được subtotal()thì :DongBanHang phải biếtthôngtin vềgiá bán

được lấytừ đâu. Nhưhình 6-11 thì subtotal()được xác định từ :DongBanHang và là

tíchcủa DongBanHang.soluong * MoTaMatHang.giaBan,dovậybiểuđồcộngtáccủa hoạtđộng tính total()sẽđượcxâydựngnhưhình6-12.

total() : PhienBanHang 1: *[for each] sLi := next() Number PhienBanHang:: 2: st := subtotal() sLi: DongBanHang 2.1: p := price() : MoTaMatHang subTotal(){ returnsoLuong*p;} : DongBanHang

MoTaMatHang PhienBanHang DongBanHang Number PhienBanHang:: total()

{ s = 0;

for each DongBanHang.sLi s += sLi.subTotal(); return s; maSanPham giaBan moTa ngayBan gioBan total() soLuong subtotal() -115-

Hình6-12 Biểuđồcộngtácđểthựchiệnviệctính total()

Lưu ý: mẫu gán trách nhiệm theo ý kiến chuyên gia được áp dụng nhiều hơn

những mẫu khác, nó là nguyên lý hướng dẫn chung trong thiết kế hướng đối tượng.

Mẫu nàythểhiệnđượcnhữngcảmgiác trựcquanchung vềcácđốitượng,chúngphải thực hiện những gì để có được những thông tin cần có. Sử dụng loại mẫu nàycũng đảm bảo duy trì được tính chất bao gói, che giấu thông tin vì các đối tượng chỉ sử dụngnhữngthôngtinriêngmàchúngcóđểthựchiệnnhữngnhiệm vụđượcgiao.

2. Mẫugán tráchnhiệmtạolậpmới(Creator)

Tạo lậpcácđốitượng khicầnthiết làmột trongnhữnghoạtđộng quantrọngcủa hệthốnghướngđốitượng.Dođócầnphải cónguyên lýchungđểgántráchnhiệmtạo lậpđốitượngtronghệthống.

Phương pháp giải: Gántráchnhiệmcho lớpBđểtạorađốitượngcủalớpA

(BlàphầntửtạolậpcácđốitượngcủaA)nếucómộttrongcácđiềukiệnsau:

B gồm các đối tượng củaA,

B chứa các đối tượng củaA,

B ghi chép các thể hiện của A,

B sử dụng trực tiếp các đối tượng của A,

B có những dữ liệu ban đầu sẽ được truyền cho các đối tượng của A khi chúng được tạo ra.

Ví dụ:hãyxétmộtphầncủamôhìnhkháiniệmnhưhình6-13(tríchtừhình4-10

saukhiđượcbổsungthêmcáchàmđượcxácđịnhởbướctrước).

PhienBanHang ngayBan gioBan total() DongBanHang Chứa 1..* Được-mô-tả-bởi soLuong subtotal() -116- MoTaMatHang maSanPham giaBan moTa price()

Hình6-13Mộtphầncủabiểuđồlớp

Một:PhienBanHangchứa(thựcchấtlàbaogồm)nhiềuđốitượng:DongBanHang,do vậytheomẫunàythìcóthểgántráchnhiệmPhienBanHangđểtạolập cácđốitượngcủa

DongBanHang.Tráchnhiệmnàyđượcgánkhicó yêucầucầntạoramộtdòngbánhàng với Nđơnvị, nghĩalàkhi :PhienBanHangnhậnđược thôngđiệp makeLineItem(N)thìnó sẽgửicho:DongBanHangthôngđiệp create(N)nhưhình6-14.

makeLineItem(N) ↓ : PhienBanHang 1: create(N) sLi: DongBanHang PhienBanHang ngayBan gioBan total() makeLineItem() Hình6-14TạoraDongBanHang

3. Mẫumócnốiyếu(Low Coupling)

Độ móc nối là một độ đovềsựkếtnốicủamộtlớpđểbiếtvề,hoặcphụthuộcvàocáclớp

khácnhưthếnào.Mộtlớpcóđộ móc nối yếu thì không phụ thuộc nhiều vào nhiều lớp khác. Ngượclại,mộtlớpcóđộmócnốimạnhthìphụthuộcvàonhiềulớpkhác.

Do đó, khigán trách nhiệm chomột lớp, hãy cố gắng sao cho độ móc nối giữa các lớp ở mức yếu.

Ví dụ:hãy xétmối quanhệ giữa cáclớp ThanhToan,HBHPhienBanHang

tronghệthống bánhàng.Giả sửcần phảitạora đốitượng :ThanhToantương ứngvới :PhienBanHang và :HBH nhậnđượcyêu cầu thanhtoán makePayment().Bởivì HBH

phải“ghinhận” :ThanhToannêntheomẫu tạolậpmớiởtrênthìlớpHBHlàđạibiểu đểtạolập.Điềunàydẫnđếnthiếtkếbiểuđồ cộngtácnhưhình6-15.

: HBH 1: create() p: ThanhToan makePayment() 2: addPayment(p) : PhienBanHang Hình6-15HBH tạora :ThanhToan : HBH 1: makePayment() :PhienBanHang makePayment() ↓ - 117 - 1.1: create() : ThanhToan

Hình6-16 ThanhToantạora :ThanhToan

Với cáchgán tráchnhiệm như hình6-15 thìHBHphải biếtvề lớp ThanhToan.

Nhưng thực tế điều này không đòi hỏi, vì chỉ cần PhienBanHang cần biết về

ThanhToan làđủ.Từđó chúng tacó thiếtkếtốthơn, thể hiệnđược mứcđộmóc nối lỏng hơn nhưhình 6-16. Sauđó lạiáp dụng các qui tắc khác đểgán tráchnhiệm cho cácđốitượng.

Trong các ngôn ngữ lập trình hướng đối tượng như C++, Java, ClassA với

ClassBđược mócnốivớinhau khi:

ClassAcónhữngthuộctínhmàđốitượngcủaClassBcầnthamkhảo

ClassAcónhữnghàmmàđốitượngcủaClassBcầnsửdụng,haythamchiếu

ClassAlàlớpconcủaClassB. 4. Cốkếtcao(HightCohension)

Cố kết là độ đo vềmứcđộliên kếttronglớp,tập trungvào cáctráchnhiệmđược

gáncho mỗilớp.Mộtlớp có tính cố kết caonếucácnhiệm vụcó liênquanchứcnăng vớinhau. Lớp cố kết là lớp có tối thiểu số các hàm đơn giản và chúng phải có liên hệ chức năng với nhau.

Vấn đềquan trọngtrong thiết kếhướngđối tượnglà phảigánđược trách nhiệm cho các lớpsao cho một mặtphù hợp vớithựctế của bàitoán, mặt khácđảm bảo có mốiliênhệchặtchẽvềchứcnăngnhưngkhôngđểcónhữnglớpphảilàm việcquátải.

Ví dụ: khi xétmối quan hệ giữacác lớp ThanhToan, HBHPhienBanHang

tronghệ thốngbánhàng tacóthểđưaramộtthiết kếbiểuđồ cộng tácnhư hình5-15. Vì HBH là lớp chính, nên việc để cho lớp HBH đảm nhận vai trò tạo lập create() :ThanhToan và thựchiệnthêmnhiều côngviệckháccó thểdẫnđếnquátải. Mặtkhác, nhiệmvụ create()khôngthựcsựliênhệvớicácnhiệm vụcòn lại,nêncóthểgántrách nhiệmnàycholớpPhienBanHangnhưhình6-16thìhợp lýhơn.

Nhữnglớpkhông cốkếtsẽkhóhiểu,khósửdụnglạivàrấtkhóduytrìhoạtđộng củahệthốngchocóhiệuquả.

5. Mẫuđiềukhiển(Controller)

Nhưtrênđãphântích,nhữngsựkiệnvào(input)sẽtácđộngvàlàmchohệthống được kích hoạt.Việc gántrách nhiệm đểxử lýcác sựkiện vàocủa hệthống cho các lớpđượcthựchiệnnhưsau:

 Gán trách nhiệm cho những lớp đại diện cho cả hệ thống (điều khiển bề mặt),

 Gántráchnhiệm chonhữnglớpđạidiện chotoànbộnghiệp vụhoặcchocả tổchức(điềukhiểnbềmặt),

 Gán trách nhiệm cho những lớp đại diện cho cái gì đó trong thế giớithực mà nó là tíchcực vàcó thểbị lôi kéo theo trong công việc(điều khiển vai trò),

 Gántráchnhiệm chonhững lớpđạidiện chobộ phậnnhântạođể xửlýcác sự kiện vào ở mỗi ca sử dụng thường được đặt tên “<UseCaseName>

Handler”(điềukhiểncasửdụng).

Ví dụ: tronghệthốngbán hàng,chúng tađãxácđịnhmột số thaotácchínhnhư:

enterItems() (nhập dữ liệu của mặt hàng), endSale() (kết thúc việc nhập dữ liệu của mộtphiênbánhàng)và makePayment()(thutiền,thanhtoán),v.v.

Trongphaphântích,những thaotácnàycủa hệthốngđãđượcghinhận vàolớp

HeThong. HeThong enterItems() endSale() makePayment() balance() makeCreditPayment() handleCreditReply()

Hình6-17 CácthaotáccủahệthốngđượcghinhậnvàolớpcótênlàHeThong

Tuynhiên,điềunàykhôngcónghĩalàlớpcótênHeThongphải thựchiện tấtcả nhữngnhiệmvụđó. Tronggiaiđoạnthiếtkế, nhữngthao táccủahệthốngcóthểđược gáncholớpđiềukhiển.

Dovậy, ởphathiếtkếcóthểgántráchnhiệmthựchiệncácthaotáccủahệthống chomộthaymộtsốlớpđiềukhiểnnhưgáncholớp HBH:đạidiệnchocảhệthống.

HBH

enterItems() endSale() makePayment()

Hình6-18 Gáncácthaotáccủahệthốngcholớpđiềukhiển

Một phần của tài liệu giáo trình ngôn ngữ hóa thống nhất uml (Trang 130 - 137)

Tải bản đầy đủ (DOCX)

(195 trang)
w