Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1)

Phát triển phần mềm ngày càng trở nên phức tạp. Thay đổi giao diện từ các xâu ký tự sang

giao diện đồ họa xu thế sự kiện; kiến trúc hệ thống đa tầng khách/chủ; cơ sở dữ liệu (CSDL) phân

tán; Internet làm tăng độ phức tạp của hệ thống phần mềm. Thách thức trong hai mươi năm tới

của xây dựng hệ thống phần mềm không phải là tốc độ thực hiện chương trình, kinh phí hay sức

mạnh của nó mà vấn đề sẽ là độ phức tạp (Sun Microsystem). Kẻ thù của chúng ta là độ phức tạp,

ta phải loại bỏ chúng (Jan Bean). Vậy, loại bỏ độ phức tạp bằng cách nào? Các phương pháp tiếp

cận hướng cấu trúc, tiệm cận hướng logic, tiếp cận hướng hướng đối tượng và tiếp cận hướng tác

tử để có thể giải quyết vấn đề này nhưng ở mức độ khác nhau.

Tổng quát thì việc xây dựng phần mềm phải quan tâm đến tổ chức, các quan hệ và cấu trúc để

hình thành được các hành vi phức tạp của hệ thống. Mọi việc khảo sát hệ thống phải được thực

hiện với mức độ trừu tượng khác nhau, từ các chi tiết đến tổ chức tổng thể. Do vậy, xây dựng

phần mềm là thực hiện dãy tương tác chia nhỏ và hợp nhất. Chia nhỏ để hiểu rõ vấn đề và hợp

nhất để xây dựng hệ thống. Tiến trình chia nhỏ (tách) đã có truyền thống và tuân thủ các tiêu chí

chức năng. Các chức năng của hệ thống được nhận diện, sau đó chúng được tách thành các chức

năng con. Tiến trình này được thực hiện lặp đi lặp lại cho đến khi có được các thành phần đơn

giản đến mức chúng được biểu diễn trực tiếp bằng các hàm hay thủ tục của ngôn ngữ lập trình

(hình 1.1). Cách tiếp cận này được gọi là tiếp cận hướng chức năng (hay còn gọi là thủ tục, truyền

thống). Người phát triển phần mềm sẽ tập trung vào các nhiệm vụ điều khiển và tách thuật toán

lớn thành các thuật toán nhỏ. Khối chính để hình thành phần mềm ở đây là các hàm hay thủ tục.

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 1

Trang 1

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 2

Trang 2

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 3

Trang 3

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 4

Trang 4

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 5

Trang 5

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 6

Trang 6

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 7

Trang 7

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 8

Trang 8

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 9

Trang 9

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1) trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 136 trang duykhanh 9480
Bạn đang xem 10 trang mẫu của tài liệu "Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1)

Giáo trình Phân tích thiết kế hướng đối tượng (Phần 1)
huột trên cột Type và nhập kiểu đối 
 6. Nhấn cột Default và nhập giá trị mặc định nếu muốn. 
 5.8.1.17 - Ánh xạ thao tác thành thông điệp 
 Trong biểu đồ tương tác, mỗi thông điệp sẽ được ánh xạ vào một thao at1c bên trong lớp. 
Trình tự ánh xạ các thông điệp thành thao tác theo thứ tự sau: 
 1. Đảm bảo rằng đối tượng nhận thông điệp đã được ánh xạ đến lớp 
 2. Nhấn phím phải trên thông điệp trong biểu đồ tương tác 
 3. Danh sách các thao tác xuất hiện 
 4. Chọn thao tác trong danh sách cho thông điệp. 
 Loại bỏ ánh xạ thao tác thông điệp như sau; 
 1. Nhấn đúp trên thông điệp trong biểu đồ tương tác 
 2. Trong cửa sổ Name: xóa tên thao tác và nhập tên thông điệp mới. 
 Tạo lập thao tác mới cho thông điệp như sau; 
 1. Đảm bảo rằng đối tượng nhận thông điệp đã được ánh xạ đến lớp 
 2. Nhấn phím phải trên thông điệp trong biểu đồ tương tác 
 3. Chọn 
 4. Nhập tên và các chi tiết khác của thao tác mới 
 5. Nhấn phím OK 
 6. Nhấn phím phải trên thông điệp 
 7. Chọn thao tác mới trong danh sách. 
 5.8.1.18 - Tính nhiều của lớp 
 Để đặt tính nhiều (multiplicity) cho các lớp ta làm như sau: 
 1. Nhấn phím phải trên một đầu cuối của quan hệ 
 2. Chọn thực đơn Multiplicity 
 3. Chọn multiplicity mong muốn 
 4. Lặp lại các bước 1-3 cho đầu cuối còn lại của quan hệ. 
 Cách khác là: 
 1. Mở cửa sổ đặc tả quan hệ (Nhấn phím phải trên quan hệ, chọn Specification) 
 2. Chọn bảng Role Detail cho đầu cuối của quan hệ 
Phát triển phần mềm bằng UML trang | 123 
 3. Thay đổi multiplicity thông qua trường cardinality 
 4. Lặp lại từ 1-3 cho đầu kia của quan hệ. 
 5.8.1.19 - Đặt tên và hướng quan hệ 
 Đặt tên quan hệ theo các bước như sau: 
 1. Chọn quan hệ, mở cữa sổ đặt tả quan hệ 
 2. Chọn bảng General 
 3. Nhập tên quan hệ vào cửa sổ name 
 Đặt hướng tên quan hệ như sau: 
 1. Mở cửa sổ đặc tả của quan hệ mong muốn 
 2. Chọn bảng Detail 
 3. Chọn hướng tên quan hệ bằng cửa sổ hướng tên quan hệ. 
 5.8.1.20 - Gán stereotype cho quan hệ 
 Đặt stereotype cho quan hệ theo các bước sau đây: 
 1. Mở cửa sổ đặc tả cho quan hệ 
 2. Chọn bảng General 
 3. Nhập stereotype cho quan hệ 
 5.8.1.21 - Gán nhiệm vụ cho quan hệ 
 Đặc tên nhiệm vụ theo thứ tự như sau: 
 1. Nhấn phím phải trên đầu cuối của quan hệ kết hợp 
 2. Chọn thực đơn Role Name 
 3. Nhập tên nhiệm vụ 
 5.8.1.22 - Phạm vi của quan hệ 
 Trong quan hệ kết hợp, Rose sẽ tạo các thuộc tính khi phát sinh mã tình. Sử dụng cử sổ 
Export Control trong Rose để phát sinh phạm vi thuộc tính. Phạm vi có thể là Public, Private, 
Protected hay Pakage (Inplementation). 
 Trong quan hệ hai chiều có thê đặt phạm vi cho hai thuộc tính, mỗi chúng ở một đầu quan hệ. 
Trong quan hệ một chiều thì chỉ cần đặt mộ đầu cho quan hệ. Phạm vi được đặc bằng chọn bảng 
Role A General hay Role B General trong cửa sổ đặc tả cửa quan hệ. 
 Đặt phạm vi quan hệ như sau: 
 1. Nhấn phím phải trên tên nhiệm vụ 
 2. Chọn Export Control thích ứng 
Phát triển phần mềm bằng UML trang | 124 
 5.8.1.23 - Đặt quan hệ tĩnh 
 Để đặt quan hệ kết hợp là tĩnh ta làm như sau: 
 1. Nhấn phím phải trên tên nhiệm vụ 
 2. Chọn thực đơn Static. 
 5.8.1.24 - Đặt quan hệ friend 
 Đặt quan hệ là friend như sau: 
 1. Nhấn phím phải trên quan hệ 
 2. Chọn thực đơn Friend 
 5.8.1.25 - Đặt Containment 
 Đặt tính này cho biết cách lưu trữ thuộc tính trong lớp như thế nào. Đặt tính chất chứa như 
sau: 
 1. Nhấn phím phải chuột trên quan hệ 
 2. Chọn Contaiment 
 3. Chọn By Reference, By Value hay Unspecified. 
 5.8.1.26 - Đặt thành phần liên kết 
 Trình tự đặt phần tử liên kết cho quan hệ: 
 1. Mở cửa sổ đặc tính quan hệ 
 2. Chọn bảng Detail 
 3. Đặt phần tử liên kết nhờ trường Link Element. 
 5.8.1.27 - Đặt giới hạn phạm vi quan hệ 
 Trình tự đặc giới hạn phạm vi cho quan hệ như sau: 
 1. Nhấn phím phải trên đầu cuối của quan hệ kết hợp 
 2. Chọn thực đơn Key/Qualifier 
 3. Nhập tên và kiểu qualifier 
 5.8.2 - Thí dụ: Hệ thống bán hàng (tiếp theo) 
 Sau khi khách hàng và người phát triển phần mềm thống nhất cho rằng biểu đồ tương tác phù 
hợp với yêu cầu tác nghiệp, người thiết kế quyết định nhóm các lớp thành nhóm theo stereotype. 
Vậy các gói sau này sẽ được tạo lập: Entities, Boundaries và Control. Sau đó chuyển các lớp vào 
nhóm tương ứng. Tiếp theo các biểu đồ lớp sẽ được lập trong mỗi gói: biểu đồ lớp Main hiển thị 
các gói, biểu đồ lớp Enter New Order chỉ ra lớp cho UC này. 
Phát triển phần mềm bằng UML trang | 125 
 5.8.2.1 - Đặt cấu hình Rose 
 1. Chọn thực đơn Topols>Options 
 2. Chọn bảng Diagram 
 3. Đảm bảo các hộp đánh dấu sau được chọn: Show Stereotype, Show all Attributes, Show all 
 Operations. 
 4. Đảm bảo các hộp đán dấu sau không được chọn: Suppress Attributes, Suppress 
 Operations. 
 5.8.2.2 - Tạo lập gói 
 1. Nhấn phím phải trên Logical View trong Browse 
 2. Chọn thực đơn New>Pakage 
 3. Đặt tên Entities 
 4. ặp lại để tạo các gói Boundaries và Control. 
 5.8.2.3 - Tạo lập biểu đồ lớp Main 
 1. Nhấn đúp trên Main class diagram ngay dưới Logical View để mở nó 
 2. Di gói Entities từ browser vào biểu đồ 
 3. Di các gói Boundaries và Control vào biểu đồ. Hình 5.39 là biểu đồ lớp Main kết quả. 
 Boundaries
 Entities
 Control
 Hình 5.39 Các gói 
Phát triển phần mềm bằng UML trang | 126 
 OrderOption OrderMgr TransactionMgr
 Create() SaveOrder() SaveOrder()
 Commit()
 OrderDtail
 Order
 Open()
 Create()
 SubmitInfor()
 SetInfor()
 Save()
 GetInfor()
 Hình 5.40 Biểu đồ lớp của Uc Entry New Order 
 5.8.2.4 - Tạo lập biểu đồ lớp cho mọi lớp trong UC Enter New Order 
 1. Nhấn phím phải trên Logical View trong Browse 
 2. Chọn thực đơn New>Class Diagram 
 3. Đặt tên mới cho biểu đồ lớp: Add New Order 
 4. Nhấn đúp trên biểu đồ lớp Add New Order để mở nó 
 5. Di các lớp OrderOptions, OrderDetail, OrderMgr, Order và TransactionMgr từ browser 
 vào biểu đồ. Biểu đồ kết quả trên hình 5.40. 
 5.8.2.5 - Bổ sung Stereotype vào lớp 
 1. Nhấn phím phải trên lớp OrderOptions trong biểu đồ 
 2. Chọn Open Specification 
 3. Nhập Boundaries vào vùng stereotype 
 4. Nhấn phím OK 
 5. Nhấn phím phải trên lớp OrderDetail trong biểu đồ 
 6. Chọn Open Specification 
 7. Chọn Boundaries từ hộp danh sách 
 8. Nhấn OK 
 9. Lặp lại để gán các lớp OrderMgr, TransactionMgr cho stereotype Control và lớp Order 
 cho stereotype Entity. Kết quả được thể hiện trên hình 5.41. 
Phát triển phần mềm bằng UML trang | 127 
 > > >
 OrderOptions OrderMgr TransactionMgr
 Create() SaveOrder() SaveOrder()
 Commit()
 > >
 OrderDetail Order
 Open() Create()
 SubmitInfor() SetInfor()
 Save() GetInfor()
 Hình 5.41 Stereotype của lớp 
 Hình 5.42 Các gói trong browser 
 5.8.2.6 - Nhóm các lớp vào gói 
 1. Di lớp OrderOptions và OrderDetail trong browser vào gói Boundaries. 
 2. Di các lớp OrderMgr, TransactionMgr vào gói Control 
 3. Di lớp Order vào gói Entities. 
 5.8.2.7 - Bổ sung lớp vào các gói 
 1. Nhấn phím phải vào gói Boundaries trong browser 
Phát triển phần mềm bằng UML trang | 128 
 2. Chọn thực đơn New>Class Diagram 
 3. Đặt tên biểu đồ mới: Main 
 4. Nhấn đúp trên Main để mở nó 
 5. Di các lớp OrderOptions và OrderDetail từ browser vào biểu đồ 
 6. Đóng biểu đồ. Biểu đồ kết quả trên hình 5.43. 
 7. Nhấn phím phải trên gói Entities trong browser 
 8. Chọn thực đơn New>Class Diagram 
 9. Đặt tên biểu đồ mới: Main 
 > >
 OrderOptions OrderDetail
 Create() Open()
 SubmitInfor()
 Save()
 Hình 5.43 Lớp trong gói Boundaries 
 10. Nhấn đúp trên Main để mở nó 
 11. Di lớp Order từ browser vào biểu đồ 
 12. Đóng biểu đồ. Biểu đồ kết quả trên hình 5.44. 
 13. Nhấn phím phải trên gói Control trong browser 
 14. Chọn thực đơn New>Class Diagram 
 15. Đặt tên biểu đồ mới: Main 
 16. Nhấn đúp trên Main để mở nó 
 17. Di các lớp OrderMgr và TransactionMgr từ browser vào biểu đồ 
 18. Đóng biểu đồ. Biểu đồ kết quả trên hình 5.45. 
 > > >
 Order OrderMgr TransactionMgr
 Create() SaveOrder() SaveOrder()
 SetInfor() Commit()
 GetInfor()
 Hình 5.44 Lớp trong gói Entity Hình 5.45 Lớp trong gói Control 
 Ta đã có biểu đồ lớp cho UC Enter New Order. Bây giờ cần bổ sung tham số, kiểu dữ liệu và 
kiểu giá trị cho lại vào lớp. Ta phải đi trở lại luồng sự kiện để tìm ra ac1c thuộc tính. Các thuộc 
tính Order Number và Customer Name sẽ được bổ sung vào lớp Order trong biểu đồ lớp. Vì có 
nhiều chi tiết trong một đơn hàng (order items) và mỗi đơn hàng lại có thông tin và hành vi riêng, 
do vậy các mục đơn hàng sẽ được mô hình hóa thành lớp, thay cho thuộc tính của Order. Biểu đồ 
trình tự sẽ được cập nhật như trên hình 5.46. 
Phát triển phần mềm bằng UML trang | 129 
 Order Options Form Order Detail Form Order Manager : Order #1234 : Order Cabinet : Large Cabinet : Transaction Manager : 
 : OrderOptions : OrderDetail OrderMgr Order OrderItem OrderItem TransactionMgr
: Salesperson
 1: Create()
 2: Open( )
 3: SubmitInfor()
 4: Save()
 5: SaveOrder()
 6: Create()
 ự
 7: SetInfor()
 8: Create()
 trình t
 9: SetInfor() đồ
 u 
 ể
 10: Create()
 11: SetInfor()
 12: SaveOrder()
 13: GetInfor() Hình 5.46 Bi
 14: GetInfor()
 trang | 130 
 15: GetInfor()
 16: Commit()
 ng UML
 ằ
 m b
 ề
 n m
 ầ
 n ph
 ể
 Phát tri
 5.8.2.8 - Bổ sung thuộc tính và thao tác 
 Khách hàng bây giờ có nhu cầu thay đổi yêu cầu như: hệ thống có khả năng yêu cầu thay đổi 
đặt hàng và thời gian cung cấp hàng; bổ sung thêm nguồn hàng; thay đổi cút ít về thủ tục nhập 
hàng vào kho. 
 Tài liệu về các yêu cầu mới hay thay đổi phải được cập nhật. Nhận thấy rằng yêu cầu mới về 
ngày tháng ảnh hưởng đến UC đang thiết kế Enter New Order. Do vậy chúng được quan tâm ở 
đây bằng cách bổ sung hai thuộc tính mới cho lớp Order. 
 5.8.2.9 - Đặt cấu hình Rose 
 1. Chọn thực đơn Tools>Options 
 2. Chọn bảng Diagram 
 3. Đảm bảo các hộp đánh dấu sau được chọn: Show Visibility, Show Stereotype, Show 
 Operation Signatures, Show all Attributes và Show all Operarions 
 4. Đảm bảo các hộp đánh dấu sau không được chọn: Suppress Attributes, Suppress 
 Operations 
 5. Chọn bảng Notation 
 6. Đảm bảo hộp đánh dấu sau không được chọn: Visibility as Icons. 
 5.8.2.10 - Bổ sung lớp mới 
 1. Tìm biểu đồ lớp Add New Order trong browser 
 2. Nhấp đúp để mở biểu đồ 
 3. Chọn phím công cụ Class trên thanh công cụ 
 4. Nhấn bất kỳ đâu trong biểu đồ để vẽ lớp mới 
 5. Nhập tên OrderItem cho lớp mới 
 6. Gán Entity cho stereotype của lớp OrderItem 
 7. Di lớp OrderItem từ browser vào gói Entities 
 5.8.2.11 - Bổ sung thuộc tính 
 1. Nhấn phím phải trên lớp Order 
 2. Chọn New Attribute 
 3. Nhập thuộc tính mới: OrderNumber: Integer 
 4. Nhấn phím Enter 
 5. Nhập tiếp thuộc tính mới: CustomerName: String 
 6. Lặp để nhập các thuộc tính sau: OrderDate: Date, OrderFillDate: Date 
 7. Nhấn phím phải trên lớp OrderItem 
 8. Chọn New Attribute 
Phát triển phần mềm bằng UML trang | 131 
 9. Nhập thuộc tính mới: ItemID: Integer 
 10. Nhấn phím Enter 
 11. Nhập tiếp thuộc tính mới: ItemDescription: String 
 5.8.2.12 - Bổ sung thao tác vào lớp OrderItem 
 1. Nhấn phím phải trên lớp OrderItem 
 2. Chọn New Operation 
 3. Nhập thao tác mới: Create 
 4. Nhấn phím Enter 
 5. Nhập thao tác mới: SetInfo 
 6. Nhấn phím Enter 
 7. Nhập thao tác mới: GetInfo 
 5.8.2.13 - Bổ sung chi tiết thao tác trong biểu đồ lớp 
 1. Nhấn phím chuột trên lớp Order để mở nó 
 2. Nhấn chuột trong lớp Order 
 3. Cập nhật thao tác Create() thành Create(): Boolean 
 4. Cập nhật thao tác SetInfo() thành Setinfo(OrderNum: Integer, Customer: String, 
 OrderDate: Date, OrderFillDate: Date): Boolean 
 5. Cập nhật thao tác GetInfo() thành GetInfo():Boolean 
 5.8.2.14 - Bổ sung chi tiết thao tác trong browser 
 1. Tìm lớp OrderItem trong browser 
 2. Nhấn trên ký tự + cạnh OrderItem để mở nó 
 3. Nhấn đúp trên GetInfo() để mở Operation Specification (hình 5.47). 
Phát triển phần mềm bằng UML trang | 132 
 Hình 5.47 Cửa sổ thao tác đặc biệt 
 4. Chọn String trong hộp danh sách Return type 
 5. Nhấn OK 
 Thực hiện tương tự như trên để chọn Boolean cho kiểu gái trị cho lại của thao tác SetInfo() 
 6. Chọn bảng Detail 
 7. Nhấn phím phải trên khoảng trắng của vùng đối số để bổ sung tham số như hình 5.48. 
Phát triển phần mềm bằng UML trang | 133 
 Hình 5.48 Bổ sung thao tác 
 8. Chọn Select. Rose tự gán đối số có tên argname 
 9. Đổi tên từ argname thành ID 
 10. Nhấn trong cột Type để mở hộp danh sách kiểu. Chọn Integer 
 11. Nhấn cột Default để bổ sung giá trị mặc định. Nhập giá trị 0 
 12. Nhấn OK 
 13. Nhấn đúp trên thao tác Create() của lớp OrderItem để mở cửa sổ đặc tả thao tác 
 14. Chọn Boolean cho combobox kiểu cho lại (Return type) 
 15. Nhấn OK. 
 5.8.2.15 - Bổ sung quan hệ 
 Sau khi đã bổ sung thuộc tính và các thao tác vào lớp, ta đã tiến gần đến phát sinh mã trình. 
Nhưng trước hết phải quan tâm đến quan hệ giữa các lớp. Hãy quan s1t việc bổ sung thực đơn 
trong biểu đồ trình tự để tìm ra quan hệ. Bất kỳ lớp nào trong biểu đồ trình tự đều cần quan hệ 
trên biểu đồ lớp. Một khi tìm ra quan hệ thì bổ sung vào biểu đồ. Thí dụ sau đây thực hiện bổ 
sung quan hệ vào các lớp trong UC Enter New Order. 
 5.8.2.16 - Đặt cấu hình Rose 
 1. Định vị biểu đồ lớp Add New Order trong browser 
 2. Nhấp đúp để mở biểu đồ 
Phát triển phần mềm bằng UML trang | 134 
 3. Tìm phím công cụ Unidirectional Association, nếu không tìm thấy thì tiếp tục tiếp bước 
 sau. 
 4. Nhấn phím phải trên thanh công cụ Dagram để chọn Customize 
 5. Bổ sung phím tên Creates A Unidirectional Asscoiation. 
 5.8.2.17 - Bổ sung kết hợp 
 1. Chọn phím công cụ Unidirectional Association 
 2. Vẽ kết hợp từ lớp OrderOptions đến lớp OrderDetail 
 3. Lặp lại để vẽ các kết hộp sau: 
 a. Từ OrderDetail đến OrderMgr 
 b. Từ OrderMgr đến Order 
 c. Từ OrderMgr đến TransactionMgr 
 d. Từ TransactionMgr đến Order 
 e. Từ TransactionMgr đến OrderItem 
 f. Từ Order đến OrderItem 
 4. Nhấn phím phải trên kết hợp một chiều giữa OrderOptions và lớp OrderDetail, gần phía 
 lớp OrderOptions. 
 5. Chọn Multiplicity>Zero or One 
 6. Nhấn phím phải trên phía kia của quan hệ một chiều. 
 7. Chọn Multiplicity>Zero or One 
 8. Lặp lại và bổ sung các Multiplicity 
 9. Sơ đồ kết quả như trên hình 5.49. 
Phát triển phần mềm bằng UML trang | 135 
 >
 >
 OrderOptions
 (from Boundaries) OrderMgr
 (from Control)
 Create(OrderID : Integer) : Boolean
 SaveOrder() : Boolean
 0..1
 1 0..1
 0..1
 0..1 0..n 0..1
 >
 > >
 0..1 Order
 OrderDetail TransactionMgr
 (from Entities)
 (from Boundaries) (from Control)
 Create() 0..n 0..1
 Open() : Boolean SaveOrder()
 SetInfor()
 SubmitInfor() : Boolean Commit()
 Save() : Boolean GetInfor()
 1 0..1
 1..n 0..n
 >
 OrderItem
 (from Entities)
 Create() : Boolean
 SetInfor(ID : int=0) : Boolean
 GetInfor() : Boolean
 Hình 5.49 Quan hệ kết hợp trong Add New Order 
Phát triển phần mềm bằng UML trang | 136 

File đính kèm:

  • pdfgiao_trinh_phan_tich_thiet_ke_huong_doi_tuong.pdf