Tài liệu môn Công nghệ phần mềm

Quan hệ giữa các lớp thực thể:  Một Hotel có nhiều Room, một Room phải thuộc vào một Hotel nhất định  Một Room có thể đặt bởi nhiều Client, một Client lại có thể đặt nhiều Room tại nhiều thời điểm khác nhau → Đề xuất thêm một lớp Booking  Một Booking có thể dùng nhiều Service khác nhau, một Service lại có thể được sử dụng bởi nhiều Booking khác nhau → Đề xuất thêm lớp UsedService  Một Booking có thể được thanh toán nhiều lần khác nhau nên có thể có nhiều Bill  Mỗi Bill có tối đa một User lập và nhận thanh toán

pdf395 trang | Chia sẻ: huyhoang44 | Lượt xem: 926 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tài liệu môn Công nghệ phần mềm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
2. Giao diện quản lí phòng hiện ra với 3 nút: thêm, sửa, xóa phòng 3. Nhân viên A click vào nút sửa phòng. 4. Giao diện tìm kiếm phòng hiện ra với một ô nhập tên phòng và một nút tìm kiếm 5. A nhập 305 vào ô tên phòng và click vào nút tìm kiếm 6. Giao diện kết quả tìm kiếm hiện ra gồm một bảng các phòng có tên 305, mỗi dòng có đầy đủ thông tin một phòng với các cột: id phòng, tên phòng, kiểu phòng, giá hiển thị, mô tả, và 1 nút chọn sửa. 17 Viết scenario (7) Manage room: scenario chuẩn cho sửa phòng (tt) 7. A chọn click vào nút chọn sửa của dòng thứ nhất. 8. Giao diện sửa phòng hiện ra với các ô chứa sẵn thông tin phòng đã chọn gồm có: id phòng(không sửa được), tên phòng, kiểu phòng, giá hiển thị, mô tả, 1 nút hủy bỏ và 1 nút sửa. 9. A sửa thông tin loại phòng và mô tả phòng, và click vào nút sửa. 10. Thông báo sửa phòng thành công hiện ra. 11. A click vào nút OK 12. Hệ thống quay lại trang chủ của người quản lí. 18 Viết scenario (8) Manage room: scenario chuẩn cho xóa phòng 1. Nhân viên quản lí A chọn chức năng quản lí phòng sau khi login. A muốn xóa thông tin phòng 503. 2. Giao diện quản lí phòng hiện ra với 3 nút: thêm, sửa, xóa phòng 3. Nhân viên A click vào nút sửa phòng. 4. Giao diện tìm kiếm phòng hiện ra với một ô nhập tên phòng và một nút tìm kiếm 5. A nhập 503 vào ô tên phòng và click vào nút tìm kiếm 6. Giao diện kết quả tìm kiếm hiện ra gồm một bảng các phòng có tên 503, mỗi dòng có đầy đủ thông tin một phòng với các cột: id phòng, tên phòng, kiểu phòng, giá hiển thị, mô tả, và 1 nút chọn xóa. 19 Viết scenario (9) Manage room: scenario chuẩn cho xóa phòng (tt) 7. A chọn click vào nút chọn xóa của dòng thứ nhất. 8. Một dialog hiện ra yêu cầu nhân viên quản lí xác nhận có muốn xóa thông tin phòng 503 hay không 9. A click vào nút xác nhận có muốn xóa. 10. Thông báo xóa phòng thành công hiện ra. 11. A click vào nút OK 12. Hệ thống quay lại trang chủ của người quản lí. 20 Viết scenario (10) Yêu cầu của một scenario:  Luôn phải nêu rõ ý định, mục đích của actor trước khi bắt đầu scenario hoặc ngay trong bước 1  Các bước luôn đánh số thứ tự từ 1  Mỗi một bước chỉ có một hành động đơn. Nếu có hai hành động trở lên thì các hành động đó phải cùng một chủ thể  Hai bước liên tiếp mà có cùng một chủ thể thì nên gộp lại thành một bước  Scenario kết thúc khi chủ thể ban đầu đạt được mục đích ban đầu  Một scenario có thể có nhiều ngoại lệ, các ngoại lệ cần được mô tả hết 21 Viết scenario (11) Yêu cầu của một scenario:  Thông tin trong mỗi bước là phải cụ thể, không được viết chung chung Ví dụ viết thế này là không được: 1. Nhân viện click vào nút xóa phòng 2. Giao diện tìm kiếm phòng hiện ra 3. Nhân viên nhập tên phòng vào 4. Giao diện kết quả hiện ra 5. Nhân viên chọn xóa 1 phòng 6. Hệ thống thông báo xóa thành công 22 Viết scenario (12) Ví dụ với bài toán đặt phòng khách sạn, các use case của nhân viên lễ tân: 23 Viết scenario (13) Mô tả các use case:  Receptionist login: Use case này cho phép nhân viên lễ tân đăng nhập theo tài khoản của mình  Booking on site: use case này cho phép nhân viên lễ tân đặt phòng khi có yêu cầu từ khách hàng tại quầy.  Cancel on site: use case này cho phép nhân viên lễ tân hủy đặt phòng khi có yêu cầu từ khách hàng tại quầy.  Checkin: use case này cho phép nhân viên lễ tân cập nhật thông tin khách đã nhận phòng  Checkout: use case này cho phép nhân viên lễ tân cập nhật thông tin khách trả phòng và thanh toán cho khách hàng 24 Viết scenario (14) Scenario chuẩn cho đặt phòng tại chỗ 1. Nhân viên tiếp tân A chọn chức năng quản lí đặt phòng sau khi login. A muốn thêm thông tin đặt phòng do khách hàng B yêu cầu. 2. Giao diện quản lí đặt phòng hiện ra với 3 nút: thêm, sửa, hủy đặt phòng 3. Nhân viên A click vào nút thêm đặt phòng. 4. Giao diện tìm phòng trống hiện ra với các ô nhập: ngày bắt đầu, ngày kết thúc và nút tìm kiếm. 5. Nhân viên A hỏi khách hàng B ngày bắt đầu, kết thúc mong muốn. 6. Khách hàng B nói với nhân viên A ngày bắt đầu, kết thúc. 7. Nhân viên A nhập ngày bắt đầu, kết thúc và click nút tìm kiếm. 25 Viết scenario (15) Scenario chuẩn cho đặt phòng tại chỗ (tt) 8. Giao diện kết quả tìm kiếm phòng trống hiện ra với bảng danh sách các phòng trong trong khoảng ngày đã chọn. Mỗi phòng tương ứng với một dòng với các thông tin: id phòng, tên phòng, kiểu phòng, giá, mô tả, và nút chọn đặt. 9. Nhân viên A thông báo danh sách các phòng trống cho khách hàng B chọn. 10. Khách hàng B chọn phòng thứ 2 trong danh sách. 11. A click vào nút chọn đặt của dòng thứ hai. 12. Giao diện nhập thông tin khách hàng hiện ra, bao gồm các ô nhập thông tin khách hàng: họ tên, số CMND/passport, kiểu giấy id, địa chỉ, mô tả, ghi chú. Một nút thêm, một nút tìm kiếm. 26 Viết scenario (16) Scenario chuẩn cho đặt phòng tại chỗ (tt) 13. Nhân viên A hỏi khách hàng B tên 14. Khách hàng B nói tên mình là B cho nhân viên A. 15. Nhân viên A nhập tên B vào ô họ tên và click nút tìm kiếm. 16. Giao diện kết quả tìm kiếm thông tin khách hàng hiện ra gồm một bảng danh sách các khách hàng có tên B, mỗi khách hàng chứa các thuộc tính tương ứng với các cột: họ tên, số CMND/passport, kiểu giấy id, địa chỉ, mô tả, ghi chú, một nút chọn. Dưới cùng là nút thêm khách hàng mới. 17. Nhân viên A xác nhận các thông tin với khách hàng B 18. Khách hàng B xác nhận thông tin của mình chưa có trong danh sách đã tìm thấy. 27 Viết scenario (17) Scenario chuẩn cho đặt phòng tại chỗ (tt) 19. Nhân viên A click vào nút thêm mới khách hàng ở phía dưới. 20. Giao diện nhập thông tin khách hàng mới hiện ra với các ô nhập: họ tên, số CMND/passport, kiểu giấy id, địa chỉ, mô tả, ghi chú, một nút chọn. Dưới cùng là nút thêm khách hàng mới. 21. Nhân viên A nhập các thông tin khách hàng B và click vào nút thêm mới 22. Giao diện xác nhận đặt phòng hiện lên với đầy đủ các thông tin: phòng đặt, ngày checkin, ngày checkout, giá đặt, khách hàng đặt. Dưới cùng là nút xác nhận và nút hủy bỏ. 23. Nhân viên A click vào nút xác nhận 24. Hệ thống báo đặt chỗ thành công và quay về trang chủ của nhân viên lễ tân 28 Bài tập trên lớp Viết tất cả các scenario ngoại lệ cho:  Sửa thông tin phòng  Xóa thông tin phòng  Đặt chỗ Viết scenario chuẩn và ngoại lệ cho chức năng:  Checkin  Sửa đặt phòng  Trả phòng + thanh toán tại chỗ 29 Bài tập về nhà Với chủ đề bài tập lớn của nhóm:  Chọn một use case trong modul của mình (mà bản thân cho là khó nhất và hay nhất)  Viết lại phần mô tả modul đó trong pha yêu cầu  Vẽ lại sơ đồ use case  Viết 1 scenario chuẩn và tất cả các scenario ngoại lệ cho use case đã chọn 30 Mô hình hóa các lớp (1) Thực hiện:  Trích các lớp thực thể và các thuộc tính của chúng  Xác định quan hệ và tương tác giữa các lớp này  Biểu diễn các thông tin này trên sơ đồ lớp (khởi tạo) 31 Trích lớp thực thể (1) Kĩ thuật trích danh từ để trích các lớp:  Mô tả hoạt động của ứng dụng trong một đoạn văn  Trích các danh từ xuất hiện trong đoạn văn đó, coi như là các ứng cử viên của lớp thực thể  Xét duyệt từng danh từ và đề xuất nó là lớp thực thể hay là thuộc tính của lớp thực thể Lưu ý:  Có thể thay đoạn văn trong bước 1 bằng cách tập hợp các scenario đã viết trong bước trước 32 Trích lớp thực thể (2) Ví dụ mô tả bài toán đặt phòng khách sạn:  Hệ thống phục vụ hoạt động quản lí đặt phòng của một khách sạn. Trong đó, nhân viên quản lí có thể quản lí thông tin phòng và xem các báo cáo. Nhân viên quản trị có thể quản lí các tài khoản người dùng hệ thống. Nhân viên bán hàng có thể đặt phòng, thay đổi và hủy đặt phòng cho khách hàng thông qua điện thoại. Nhân viên tiếp tân có thể đặt phòng, thay đổi đặt phòng, hủy đặt phòng, làm thủ tục checkin, checkout và thanh toán trực tiếp tại chỗ cho khách hàng. Khi thanh toán có thể xuất hóa đơn theo yêu cầu của khách hàng, bao gồm tiền phòng và chi phí các dịch vụ gia tăng của khách sạn mà khách hàng đã dùng. 33 Trích lớp thực thể (3) Ví dụ mô tả bài toán đặt phòng khách sạn:  Hệ thống phục vụ hoạt động quản lí đặt phòng của một khách sạn. Trong đó, nhân viên quản lí có thể quản lí thông tin phòng và xem các báo cáo. Nhân viên quản trị có thể quản lí các tài khoản người dùng hệ thống. Nhân viên bán hàng có thể đặt phòng, thay đổi và hủy đặt phòng cho khách hàng thông qua điện thoại. Nhân viên tiếp tân có thể đặt phòng, thay đổi đặt phòng, hủy đặt phòng, làm thủ tục checkin, checkout và thanh toán trực tiếp tại chỗ cho khách hàng. Khi thanh toán có thể xuất hóa đơn theo yêu cầu của khách hàng, bao gồm tiền phòng và chi phí các dịch vụ gia tăng của khách sạn mà khách hàng đã dùng. 34 Trích lớp thực thể (4) Các danh từ:  Hệ thống, phòng, khách sạn, nhân viên quản lí, báo cáo, nhân viên quản trị, tài khoản người dùng, nhân viên bán hàng, khách hàng, điện thoại, nhân viên tiếp tân, hóa đơn, yêu cầu, tiền phòng, chi phí, dịch vụ gia tăng. Đánh giá:  Điện thoại nằm ngoài phạm vi của phần mềm → loại  Hệ thống, yêu cầu, tiền phòng, chi phí là các danh từ trừu tượng → loại  Báo cáo nên là một lớp biên hơn là lớp thực thể  Nhân viên quản lí, nhân viên quản trị, nhân viên bán hàng, nhân viên tiếp tân đều có thể là các danh từ cụ thể của tài khỏan người dùng 35 Trích lớp thực thể (5) Như vậy chỉ còn các lớp thực thể:  Phòng: Room  Khách sạn: Hotel  Tài khoản người dùng: User  Hóa đơn: Bill  Khách hàng: Client  Dịch vụ gia tăng: Service 36 Trích lớp thực thể (6) Quan hệ giữa các lớp thực thể:  Một Hotel có nhiều Room, một Room phải thuộc vào một Hotel nhất định  Một Room có thể đặt bởi nhiều Client, một Client lại có thể đặt nhiều Room tại nhiều thời điểm khác nhau → Đề xuất thêm một lớp Booking  Một Booking có thể dùng nhiều Service khác nhau, một Service lại có thể được sử dụng bởi nhiều Booking khác nhau → Đề xuất thêm lớp UsedService  Một Booking có thể được thanh toán nhiều lần khác nhau nên có thể có nhiều Bill  Mỗi Bill có tối đa một User lập và nhận thanh toán. 37 Trích lớp thực thể (7) 38 Trích lớp điều khiển (1) Đề xuất các lớp điều khiển:  Toàn bộ hệ thống dùng chung một lớp điều khiển  Mỗi modul dùng riêng một lớp điều khiển 39 Trích lớp điều khiển (2) Đề xuất mỗi modul dùng riêng lớp điều khiển:  Lớp điều khiển cho modul Manager: ManagerCtr  Lớp điều khiển cho modul Admin: AdminCtr  Lớp điều khiển cho modul Seller: SellerCtr  Lớp điều khiển cho modul Receptionist: ReceptCtr 40 Trích lớp biên (1) Đề xuất các lớp biên:  Mỗi giao diện (trang web, form) nên để là một lớp biên  Mỗi báo cáo, biểu mẫu nên để là một lớp biên  Các thông báo, các thông điệp xác nhận có thể xem xét tạo thành một lớp biên hoặc là thành phần của một lớp biên 41 Trích lớp biên (2) Đề xuất các lớp biên cho modul quản lí phòng của Manager:  Giao diện chính: RoomManagerFrm  Chức năng thêm: form thêm (AddRoomFrm)  Chức năng sửa: form tìm kiếm (SearchEditRoomFrm), form kết quả (chung với SearchEditRoomFrm), form sửa (EditRoomFrm)  Chức năng xóa: form tìm kiếm (SearchDeleteRoomFrm), form kết quả dùng chung với SearchDeleteRoomFrm.  Các dialog và cửa sổ con đều là thành phần của các form chính 42 Mô hình hóa các lớp (2) Dùng thẻ CRC để mô hình hóa quan hệ giữa các lớp:  C: class. Biểu diễn tên lớp  R: responsibility. Trách nhiệm của lớp  C: collaboration. Quan hệ của lớp Trong VP: chọn new CRC Card diagram 43 Mô hình hóa các lớp (3) Thẻ CRC cho lớp điều khiển modul Manager: 44 Mô hình hóa các lớp (4) Thẻ CRC cho lớp điểu khiển (tt):  Vì hướng đối tượng che giấu dữ liệu của các lớp nên không thể viết: – Lớp điều khiển hiện giao diện quản lí phòng Mà phải viết theo dạng tương tác giữa các lớp:  Lớp ManagerCtr gửi thông điệp yêu cầu lớp RoomManagerFrm hiển thị giao diện chính 45 Mô hình hóa các lớp (5) Thẻ CRC cho lớp điểu khiển (tt): 46 Mô hình hóa các lớp (6) Sơ đồ lớp cho modul quản lí phòng: 47 Mô hình hoạt động (1) Sử dụng sơ đồ statechart:  Mỗi trạng thái hệ thống được mô tả bằng một hình chữ nhật  Khi có một sự kiện (event) xảy ra, thì trạng thái này sẽ chuyển sang trạng thái kia. Chuyển trạng thái biểu diễn bằng một mũi tên, nhãn là tên của sự kiện  Các sự kiện và hoạt động tương tác được trích ra từ các scenario  Trong VP: chọn new state machine diagram 48 Mô hình hoạt động (2) Modul quản lí phòng: 49 Scenario cuối pha phân tích (1) Trong scenario này:  Các chủ thể hành động nằm trong phần mềm được thay thế bằng tên các lớp đã trích được  Tương tác giữa các chủ thể chuyển thành hành động gửi thông điệp yêu cầu thực hiện hành động nào đó 50 Scenario cuối pha phân tích (2) Manage room: scenario chuẩn cho thêm phòng 1. Nhân viên quản lí A chọn chức năng quản lí phòng sau khi login. A muốn thêm thông tin một phòng mới. 2. Lớp RoomManagerFrm hiện ra với 3 nút: thêm, sửa, xóa phòng 3. Nhân viên A click vào nút thêm phòng. 4. Lớp RoomManagerFrm gọi lớp AddRoomFrm yêu cầu hiển thị 5. Lớp AddRoomFrm hiện ra với các ô nhập: id phòng, tên phòng, kiểu phòng, giá hiển thị, mô tả, và 2 nút: nút thêm phòng, và nút hủy bỏ. 6. Nhân viên A nhập các thông tin phòng mới vào các ô và click nút thêm phòng 7. Lớp AddRoomFrm gọi lớp Room để đóng gói thông tin trên form thành một đối tượng kiểu Room 51 Scenario cuối pha phân tích (3) Manage room: scenario chuẩn cho thêm phòng (tt) 8. Lớp Room đóng gói thông tin và trả lại cho lớp AddRoomFrm một đối tượng kiểu Room 9. Lớp AddRoomFrm chuyể đối tượng Room cho lớp RoomManagerCtr 10. Lớp RoomManagerCtr lưu thông tin phòng vào CSDL 11. Lớp RoomManagerCtr thông báo cho lớp AddRoomFrm đã thêm thành công 12. Lớp AddRoomFrm thông báo thêm phòng thành công. 52 Scenario cuối pha phân tích (4) Sơ đồ tuần tự cho scenario chuẩn cho thêm phòng 53 Scenario cuối pha phân tích (5) Manage room: scenario chuẩn cho sửa phòng 1. Nhân viên quản lí A chọn chức năng quản lí phòng sau khi login. A muốn sửa thông tin phòng 305. 2. Lớp RoomManagerFrm hiện ra với 3 nút: thêm, sửa, xóa phòng 3. Nhân viên A click vào nút sửa phòng. 4. Lớp RoomManagerFrm gọi lớp SearchEditRoomFrm hiển thị 5. Lớp SearchEditRoomFrm hiện ra với một ô nhập tên phòng và một nút tìm kiếm 6. A nhập 305 vào ô tên phòng và click vào nút tìm kiếm 7. Lớp SearchEditRoomFrm gửi thông tin tên phòng 305 cho lớp RoomMaanagerCtr 54 Scenario cuối pha phân tích (6) Manage room: scenario chuẩn cho sửa phòng (tt) 8. Lớp RoomManagerCtr tìm kiếm cấc phòng có tên 305 trong CSDL 9. Lớp RoomManagerCtr gửi kết quả đến lớp Room để đóng gói thành danh sách các đối tượng Room 10. Lớp Room gửi trả cho lớp RoomManagerCtr danh sách các đối tượng Room 11. Lớp RoomManagerCtr gửi danh sách các đối tượng Room cho lớp SearchEditRoomFrm để hiển thị 12. Lớp SearchEditRoomFrm hiện kết quả tìm kiếm gồm một bảng các phòng có tên 305, mỗi dòng có đầy đủ thông tin một phòng với các cột: id phòng, tên phòng, kiểu phòng, giá hiển thị, mô tả, và 1 nút chọn sửa. 55 Scenario cuối pha phân tích (7) Manage room: scenario chuẩn cho sửa phòng (tt) 13. Nhân viên A click chọn sửa vào phòng thứ 2 trong danh sách 14. Lớp SearchEditRoomFrm gọi và truyền đối tượng vừa được chọn cho lớp EditRoomFrm 15. Lớp EditRoomFrm hiện ra với đầy đủ thông tin của đối tượng được chọn sửa: id phòng, tên phòng, kiểu phòng, giá hiển thị, mô tả, 1 nút hủy bỏ và một nút sửa. 16. Nhân viên A sửa một số thông tin về loại phòng, mô tả và giá của phòng và click vầo nút sửa. 17. Lớp EditRoomFrm gửi thông tin trên form đến lớp Room để đóng gói đối tượng Room 18. Lớp Room đóng gói thông tin thành một đối tượng Room 56 Scenario cuối pha phân tích (8) Manage room: scenario chuẩn cho sửa phòng (tt) 19. Lớp EditRoomFrm truyền đối tượng Room cho lớp RoomManagerCtr 20. Lớp RoomManagerCtr cập nhật thông tin phòng vào CSDL. 21. Lớp RoomManagerCtr thông báo cho lớp EditRoomFrm đã cập nhật thành công 22. Lớp EditRoomFrm thông báo cập nhật thành công cho nhân viên A 57 Scenario cuối pha phân tích (9) Sơ đồ tuần tự cho scenario chuẩn cho sửa phòng 58 Bài tập trên lớp Thực hiện các bước sau lần lượt với các modul của Admin, của Seller, và của Receptionist:  Trích các lớp biên, các lớp điều khiển  Viết thẻ CRC cho lớp điều khiển  Vẽ sơ đồ trạng thái cho modul  Vẽ lại sơ đồ lớp cho modul  Viết mỗi UC với một scenario phiên bản 2  Thực tế hóa mỗi scenario này của mỗi UC thành sơ đồ tuần tự 59 Bài tập về nhà Với mỗi modul của cá nhân:  Vẽ lại sơ đồ chi tiết các UC của modul cá nhân  Với mỗi UC, trích các scenario chuẩn và các ngoại lệ tương ứng ( không cần xử lí các ngoại lệ sai kiểu dữ liệu đầu vào)  Trích các lớp thực thể, trích các lớp biên, các lớp điều khiển. Vẽ sơ đồ lớp từ các lớp đã trích được.  Xây dựng thẻ CRC cho các lớp điều khiển  Xây dựng sơ đồ hoạt động (statechart) cho modul  Viết lại các scenario với các lớp đã trích được  Thực tế hóa mỗi scenario của mỗi UC thành sơ đồ tuần tự (hoặc cộng tác) Questions? Công nghệ phần mềm Pha thiết kế Giảng viên: TS. Nguyễn Mạnh Hùng Học viện Công nghệ Bưu chính Viễn thông (PTIT) 3Pha thiết kế (1) Mục đích:  Chuyển tài liệu phân tích dừ dạng đặc tả nghiệp vụ hệ thống, sang dạng có thể cài đặt và kiểm thử được 4Pha thiết kế (2) Thực hiện:  B1: Thiết kế CSDL (nếu có)  B2: Hoàn thiện sơ đồ lớp có được trong pha phân tích → sơ đồ lớp chi tiết  B3: Thiết kế chi tiết hoạt động bên trong của các lớp, các phương thức của lớp 5 Thiết kế CSDL (1) Xây dựng CSDL từ sơ đồ lớp thực thể của hệ thống:  B1: Mỗi lớp thực thể đề xuất thành một bảng tương ứng trong CSDL  B2: Với mỗi lớp thực thể, lấy các thuộc tính kiểu cơ bản (không phải kiểu lớp thực thể khác) làm thuộc tính cho bảng tương ứng với lớp thực thể đó.  B3: Giữa hai lớp có quan hệ thành phần, liên kết, hợp thì giữa hai bảng tương ứng phải có quan hệ n-n, 1-n hoặc 1-1, tùy từng trường hợp.  B4: Định nghĩa khóa chính và khóa ngoài tương ứng với các quan hệ giữa các bảng  B5: Gộp bảng nếu có quan hệ 1-1, tách bảng nếu có quan hệ n-n. 6 Thiết kế CSDL (2) Ví dụ với phần mềm quản lí đặt phòng khách sạn: 7 Thiết kế CSDL (3) B1: Mỗi lớp thực thể đề xuất thành một bảng tương ứng trong CSDL:  Lớp Hotel → bảng tblHotel  Lớp Room → bảng tblRoom  Lớp Client → bảng tblClient  Lớp User → bảng tblUser  Lớp Service → bảng tblService  Lớp UsedService → bảng tblUsedService  Lớp Booking → bảng tblBooking  Lớp Bill → bảng tblBill 8 Thiết kế CSDL (4) 9 Bài tập (1) Xây dựng CSDL cho bài tập nhóm:  Trình bày lại (đã chỉnh sửa theo kết quả pha phân tích) sơ đồ lớp thực thể của toàn hệ thống  Trình bày sơ đồ quan hệ giữa các bảng trong CSDL sau khi áp dụng các bước chuyển đổi trong bài  Cả nhóm nộp chung Thiết kế hệ thống theo mô hình MVC 11 Mô hình MVC (1) [image source: ] 12 Mô hình MVC (2) M - model:  Đóng gói dữ liệu, thông tin  Chức năng biểu diễn, vận chuyển thông tin để trình diễn (view) và xử lí (control) 13 Mô hình MVC (3) C - control:  Định nghĩa các hành vi, hoạt động, xử lí của hệ thống  Đối chiếu hành động của user (nhận từ view), vào tập chức năng để xử lí, đồng thời chọn hành động đưa view ra để show 14 Mô hình MVC (4) V - view:  Giao diện với người dử dụng  Show các kết quả xử lí của tầng control  Thu nhận các hoạt động, yêu cầu của người sử dụng và chuyển cho tầng control xử lí 15 MVC cải tiến (1) [image source: ] 16 MVC cải tiến (2) View Control Model L. giao diện L. điều khiển L. thực thể 17 Các lớp thực thể  Đóng gói dữ liệu, thông tin  Chỉ chứa các thuộc tính và các phương thức truy cập các thuộc tính (javaBean)  Chức năng biểu diễn, vận chuyển thông tin để trình diễn (view) và xử lí (control) 18 Các lớp điều khiển  Cập nhật thông tin vào DB (thông tin chứa trong các thực thể)  Thực hiện các tính toán, xử lí trung gian  Đối chiếu hành động của user (nhận từ view), vào tập chức năng để xử lí, đồng thời chọn hành động đưa view ra để show 19 Các lớp giao diện  Các frame, cửa sổ của ứng dụng (javaSwing)  Các trang giao diện web: html, jsp  Các bảng, mẫu biểu, báo cáo in ra 20 Thiết kế hệ thống theo MVC Có thể áp dụng một số dạng mô hình MVC phổ biến:  Mô hình MVC dùng thực thể thuần (cổ điển)  Mô hình MVC dùng bean  Mô hình MVC cải tiến (hiện đại) Lưu ý: Với bài tập lớn, các nhóm nên chọn thiết kế theo 1 trong 3 dạng kiến trúc trên. Thiết kế theo mô hình MVC với thực thể thuần 22 MVC với thực thể thuần (1) Đặc trưng:  Lớp thực thể chỉ chứa các thuộc tính và các phương thức get/set cho mỗi thuộc tính (còn gọi là các lớp thực thể thuần)  Các thao tác liên quan đến CSDL đều đặt trong lớp điều khiển (dạng lớp DAO – Data Access Object) 23 MVC với thực thể thuần (2) Ví dụ modul quản lí phòng của Manager, sơ đồ lớp cuối pha phân tích của chức năng thêm phòng: 24 MVC với thực thể thuần (3) Ví dụ chức năng thêm phòng của Manager, sơ đồ lớp theo MVC dùng thực thể thuần: 25 Hoàn thiện sơ đồ lớp (1) Thực hiện:  Định nghĩa kiểu thuộc tính cho lớp  Định nghĩa khuôn mẫu các phương thức cho lớp 26 Hoàn thiện sơ đồ lớp (2) Định nghĩa kiểu thuộc tính cho lớp:  Tên thuộc tính đã xác định trong pha phân tích  Chọn kiểu dữ liệu cụ thể cho từng thuộc tính dựa vào giới hạn lưu trữ của thuộc tính  Điền thuộc tính (tên:kiểu) vào sơ đồ lớp 27 Hoàn thiện sơ đồ lớp (3) Ví dụ với chức năng thêm phòng: 28 Hoàn thiện sơ đồ lớp (4) Định nghĩa khuôn mẫu phương thức cho lớp:  Dùng thẻ CRC để xác định phương thức nào nên gán cho lớp nào  Định nghĩa phuôn mẫu cho từng phương thức 29 Hoàn thiện sơ đồ lớp (5) Gán phương thức cho lớp:  Nguyên lí A: Che giấu thông tin. Các thuộc tính của lớp phải để dạng private → cần các phương thức get/set tương ứng cho phép các đối tượng khác truy nhập vào các thuộc tính này  Áp dụng cho các lớp thực thể: các thuộc tính để private, mỗi thuộc tính có một cặp phương thức get/set tương ứng 30 Hoàn thiện sơ đồ lớp (6) Ví dụ với lớp thực thể Room:  Các thuộc tính để chế độ private (có dấu “-” đầu tên thuộc tính  Mỗi thuộc tính có một gặp phương thức get/set tương ứng: ví dụ thuộc tính name có các phương thức: public void setName(String name) public String getName() 31 Hoàn thiện sơ đồ lớp (7) Gán phương thức cho lớp (tt):  Nguyên lí B: Nếu có nhiều đối tượng X gọi đến một hành động k của đối tượng Y, thì phương thức để thực hiện hành động k nên gán cho lớp của đối tượng Y, mà không nên gán cho lớp của đối tượng X 32 Hoàn thiện sơ đồ lớp (8) Gán phương thức cho lớp (tt):  Nguyên lí C: Thiết kế hướng trách nhiệm. Nếu một hành động mà không thể gán thành phương thức cho lớp khác, thì lớp của đối tượng cần thực hiện hành động đó phải chứa phương thức tương ứng hành động đó 33 Hoàn thiện sơ đồ lớp (9) Định nghĩa khuôn mẫu các phương thức:  Kiểu dữ liệu trả về  Số lượng, thứ tự và kiểu dữ liệu truyền vào Ví dụ: Không nên định nghĩa phương thức lưu thông tin một Room với các tham số là các thuộc tính: public void saveRoom(int id, string name...) Mà nên truyền vào là một kiểu đối tượng cửa lớp Room đã đóng gói: public void saveRoom(Room room) 34 Hoàn thiện sơ đồ lớp (10) Ví dụ thẻ CRC của lớp RoomDAO và AddRoomFrm cho chức năng thêm phòng: 35 Hoàn thiện sơ đồ lớp (11) Áp dụng nguyên lí B và C:  Lớp AddRoomFrm phải có các phương thức: hiển thị form (hàm khởi tạo), xứ lí sự kiện nút Add và nút Reset bị click, thông báo thành công  Lớp RoomDAO phải có phương thức lưu thông tin phòng vào CSDL  Lớp Room phải có các phương thức đóng gói thông tin đối tượng (hàm khởi tạo hoặc các phương thức set) 36 Hoàn thiện sơ đồ lớp (12) Kết quả thu được sơ đồ lớp như sau: 37 Sơ đồ tuần tự pha thiết kế (1) Đặc trưng:  Tên các lớp theo đúng sơ đồ lớp đã thiết kế  Nhãn các mũi tên phải là tên các phương thức của các lớp trong sơ đồ lớp đã thiết kế 38 Sơ đồ tuần tự pha thiết kế (2) Ví dụ chức năng thêm phòng của Manager: 39 Bài tập Thiết kế tương tự cho các chức năng và modul:  Sửa thông tin phòng  Xóa thông tin phòng  Khách hàng đặt chỗ tại quầy với nhân viên tiếp tân  Khách hàng checkin tại quầy với nhân viên tiếp tân  Khách hàng trả phòng và thanh toán tại quầy với nhân viên tiếp tân 40 Bài tập về nhà Với mỗi modul cá nhân:  Vẽ lại sơ đồ UC chi tiết của hệ thống và của modul  Vẽ lại sơ đồ các lớp sau pha phân tích  Định nghĩa các thuộc tính và kiểu thuộc tính của mỗi lớp  Dùng kĩ thuật thẻ CRC và 3 nguyên lí thiết kế phương thức để gán các phương thức cho các lớp  Định nghĩa khuôn mẫu cho từng phương thức  Điền tất cả vào sơ đồ lớp để thu được sơ đồ lớp chi tiết (theo mô hình MVC dùng thực thể thuần)  Vẽ lại sơ đồ tuần tự sau pha thiết kế Thiết kế theo mô hình MVC với thực thể bean 42 MVC với thực thể bean (1) Đặc trưng:  Lớp thực thể chứa các thuộc tính và các phương thức get/set cho mỗi thuộc tính, và  Các thao tác liên quan đến CSDL mà liên quan đến lớp thực thể nào thì đều đặt trong lớp điều khiển đó  Các lớp thực thể kiểu này được gọi là lớp bean  Trong nhiều trường hợp, không còn cần đến lớp điều khiển nữa vì lớp bean đã kiêm luôn vai trò của lớp điều khiển 43 MVC với thực thể bean (2) Ví dụ modul quản lí phòng của Manager, sơ đồ lớp cuối pha phân tích của chức năng thêm phòng: 44 MVC với thực thể bean (3) Ví dụ chức năng thêm phòng của Manager, sơ đồ lớp theo MVC dùng thực thể bean: 45 Hoàn thiện sơ đồ lớp Kết quả thu được sơ đồ lớp sau khi áp dụng các nguyên lí A, B, và C như sau: 46 Sơ đồ tuần tự pha thiết kế Sơ đồ tuần tự cho cách thiết kế dùng bean: Thiết kế theo mô hình MVC cải tiến (hiện đại) 48 MVC cải tiến (1) Đặc trưng:  Lớp thực thể thuần  Các thao tác liên quan đến CSDL đều đặt trong lớp điều khiển  Các lớp điều khiển giành quyền điều khiển toàn bộ các lớp view và control 49 MVC cải tiến (2) Ví dụ modul quản lí phòng của Manager, sơ đồ lớp cuối pha phân tích của chức năng thêm phòng: 50 MVC cải tiến (3) Ví dụ chức năng thêm phòng của Manager, sơ đồ lớp theo MVC cải tiến:  Khi nút Add trên form của lớp biên AddRoomFrm bị click thì lớp biên này không được xử lí gì mà phải truyền sự kiện này xuống cho lớp điều khiển  Để làm được việc này, trên lớp biên có phương thức truyền quyền điều khiển cho lớp điều khiển, và  Trong lớp điều khiển có một lớp nội tại (inner class) dùng để nhận sự kiện do lớp biên truyền xuống để xử lí 51 Hoàn thiện sơ đồ lớp Kết quả thu được sơ đồ lớp sau khi áp dụng các nguyên lí A, B, và C như sau: 52 Sơ đồ tuần tự pha thiết kế Sơ đồ tuần tự cho cách thiết kế dùng MVC cải tiến: 53 Bài tập Thiết kế tương tự (dung MVC với thực thể bean và dùng MVC cải tiến) cho các chức năng và modul:  Sửa thông tin phòng  Xóa thông tin phòng  Khách hàng đặt chỗ tại quầy với nhân viên tiếp tân  Khách hàng checkin tại quầy với nhân viên tiếp tân  Khách hàng trả phòng và thanh toán tại quầy với nhân viên tiếp tân 54 Bài tập về nhà Với mỗi modul cá nhân:  Vẽ lại sơ đồ UC chi tiết của hệ thống và của modul  Vẽ lại sơ đồ các lớp sau pha phân tích  Thiết kế hệ thống theo mô hình MVC dùng thực thể bean và theo mô hình MVC cải tiến  Vẽ lại sơ đồ tuần tự sau pha thiết kế (cho mỗi loại) Questions? Công nghệ phần mềm Pha cài đặt Giảng viên: TS. Nguyễn Mạnh Hùng Học viện Công nghệ Bưu chính Viễn thông (PTIT) 3Pha cài đặt (1) Mục đích:  Cài đặt thành chương trình  Kiểm thử chương trình 4Chuẩn bị kiểm thử (1) Thực hiện:  Viết test case cho mỗi phương thức và mỗi lớp trước khi cài đặt chúng  Test case dưới dạng hộp đen (black-box test): – Chỉ rõ đầu vào – Đầu ra mong muốn 5Chuẩn bị kiểm thử (2) Về nguyên tắc:  Phải test hết tất cả các trường hợp có thể có của các kiểu dữ liệu  Tuy nhiên nếu làm vậy số trường hợp phải test là quá lớn  → dùng kĩ thuật test biên 6Chuẩn bị kiểm thử (3) Kĩ thuật test biên:  Nếu một tham số đầu vào có một giới hạn biên x, thì phải test ít nhất 4 trường hợp: • 1: giá trị đầu vào bất kì cách xa x • 2: giá trị đầu vào ngay trên x • 3: giá trị đầu vào ngay dưới x • 4: giá trị đầu vào đúng bằng x Ví dụ:  Nếu phép chia cho số nguyên có điều kiện số bị chia # 0 thì phải test khi số bị chia: -1, 0, 1, và môt số >100 7Chuẩn bị kiểm thử (4) Kĩ thuật test biên (tt):  Nếu một tham số đầu vào có 2 giới hạn biên x1 và x2 thì phải test ít nhất 7 trường hợp: • 1,2: giá trị đầu vào đúng bằng x1, ngay trên x1 • 3,4: giá trị đầu vào ngay dưới x2, đúng bằng x2 • 5: giá trị đầu vào đúng bằng (x1+x2)/2 • 6: giá trị đầu vào nhỏ hơn x1 • 7: giá trị đầu vào lớn hơn x2 8Chuẩn bị kiểm thử (5) Kĩ thuật test chức năng thao tác CSDL:  Nếu chức năng thêm một đối tượng vào CSDL thì phải test ít nhất 3 trường hợp: • 1: thêm một đối tượng chưa có trong CSDL • 2: thêm một đối tượng đã có trong CSDL • 3: thêm liên tục 2 lần một đối tượng chưa có trong CSDL 9Chuẩn bị kiểm thử (6) Kĩ thuật test chức năng thao tác CSDL (tt):  Nếu chức năng sửa một đối tượng trong CSDL thì phải test ít nhất 3 trường hợp: • 1: sửa một đối tượng chưa có trong CSDL • 2: sửa một đối tượng đã có trong CSDL • 3: sửa liên tục 2 lần một thuộc tính của đối tượng đã có trong CSDL 10 Chuẩn bị kiểm thử (7) Kĩ thuật test chức năng thao tác CSDL (tt):  Nếu chức năng xóa một đối tượng trong CSDL thì phải test ít nhất 3 trường hợp: • 1: xóa một đối tượng chưa có trong CSDL • 2: xóa một đối tượng đã có trong CSDL • 3: xóa liên tục 2 lần một đối tượng đã có trong CSDL 11 Chuẩn bị kiểm thử (8) Kĩ thuật test chức năng thao tác CSDL (tt):  Nếu chức năng tìm kiếm một số đối tượng trong CSDL thì phải test ít nhất 2 trường hợp: • 1: tìm kiếm một đối tượng chưa có trong CSDL • 2: tìm kiếm một đối tượng đã có trong CSDL 12 Chuẩn bị kiểm thử (9) Nếu CSDL có 3 bảng: KhachHang lưu thông tin khách hàng, bảng SanPham lưu thông tin sản phẩm, bảng HoaDon lưu thông tin một khác hàng mỗi lần mua một số sản phẩm. Khi đó, chức năng thêm một hóa đơn vào trong CSDL thì phải test ít nhất 2 trường hợp: • 1: thêm một hóa đơn chưa có trong CSDL • 2: thêm một hóa đơn đã có trong CSDL • 3: thêm một hóa đơn mà khách hàng chưa có trong CSDL • 4: thêm một hóa đơn mà sản phẩm chưa có trong CSDL • 5: thêm một hóa đơn mà cả khách hàng và sản phẩm chưa có trong CSDL 13 Chuẩn bị kiểm thử (10) Ví dụ test case cho chức năng thêm một quyển sách vào CSDL:  B1: Dữ liệu hiện thời: 14 Chuẩn bị kiểm thử (11) Ví dụ test case cho chức năng thêm một quyển sách vào CSDL (tt):  B2: Các thao tác, và kết quả mong đợi (có thể dùng requirement diagram/test case trong VP): Các bước thao tác Kết quả mong đợi 1. NV chọn chức năng thêm sách Giao diện thêm sách hiện ra, gồm các ô nhập: id, tên, tác giả, năm xb và nút submit 2. Nhân viên nhập: Id=2, Tên = Data mining Tác giả = Jennings Năm xb = 2012 Và click nút submit 1 lần Thông báo thêm thành công và CSDL sẽ có như sau: 15 Chuẩn bị kiểm thử (12) Ví dụ test case cho chức năng thêm một quyển sách vào CSDL (tt):  B3: kết quả mong đợi trong CSDL: 16 Bài tập Viết test case cho các chức năng sau:  Sửa thông tin phòng  Xóa thông tin phòng  Đặt phòng tại quầy  Checkin  Trả phòng và thanh toán 17 Bài tập về nhà Với mỗi modul cá nhân:  Viết các test case cho từng chức năng của modul 18 Cài đặt (1) Thực hiện theo thứ tự:  Cài đặt các lớp thực thể  Cài đặt các lớp giao diện  Cài đặt các lớp điều khiển 19 Cài đặt (2) Chú thích code:  Chú thích code là cần thiết và quan trọng cho pha bảo trì  Nên chú thích code đầu mỗi lớp và đầu mỗi phương thức 20 Cài đặt (3) Chú thích code cần có các thông tin tối thiểu:  Tên của phần code, mô tả ngắn gọn chức năng và hoạt động của đoạn code  Tên người code và ngày code  Ngày được duyệt và tên người duyệt  Tên các tham số, theo abc, giải thích ngắn gọn ý nghĩa từng tham số  Tên các file truy cập/thay đổi bởi đoạn code  Đầu vào – đầu ra  Khả năng xử lí ngoại lệ  Danh sách các thay đổi, cập nhật từ lần code đầu 21 Cài đặt (4) Đặt tên biến:  Tên biến nên đặt theo cách gợi nhớ, trừ các biến chạy  Bắt đầu bằng chữ thường  Thống nhất với nhau Ví dụ:  Có thể sử dụng: frequencyAverage, frequencyTotal  Có thể sử dụng: averageFrequency, totalFrequency  Nhưng không thể đặt tên cùng nhau: FrequencyAverage, totalFrequency 22 Cài đặt (5) Xét ví dụ với câu lệnh if:  Xác định xem một điểm có tọa độ nằm trong vùng map_square1 hoặc map_square2 hoặc không 23 Cài đặt (6) Cách 1:  Trình bày không chấp nhận được 24 Cài đặt (7) Cách 2:  Khuôn dạng đựơc, nhưng cấu trúc không được 25 Cài đặt (8) Cách 3:  Chấp nhận được 26 Cài đặt (9) Nguyên tắc dùng lệnh if:  Nếu có lện if-if liền nhau dạng If (điều kiện 1) If (điều kiện 2) làm x → thì nên chuyển thành: If (điều kiện 1) && (điều kiện 2) làm x  Nếu câu lệnh if lồng nhau có độ sâu 3 tầng trở lên thì nên xem xét lại dùng cách khác để điều khiển 27 Cài đặt (10) Nguyên tắc phân chia và code modul/ method:  Một method (modul) chỉ nên có tối đa 30-50 câu lệnh  Nếu có nhiều hơn thì nên tách thành các modul con 28 Tích hợp (1) Các kỹ thuật tích hợp:  Top-down: Tích hợp từ trên xuống  Bottom-up: Tích hợp từ dưới lên  Sandwich: Tích hợp theo cả hai chiều trên xuống và dưới lên 29 Tích hợp (2) Top-down:  Thứ tự tích hợp là: a,b,c,d,e,f,g,h,i,j ,k,l,m 30 Tích hợp (3) Top-down (tt):  Để test modul a, phải coi các modul b,c,d là các hằng số (stubs) 31 Tích hợp (4) Bottom-up:  Thứ tự tích hợp là: l,m,h,i,j,k,e,f,g,b ,c,d,a 32 Tích hợp (5) Sandwich:  Các modul logic thì tích hợp top-down  Các modul thực hiện trực tiếp thì tích hợp bottom-up 33 Kiểm thử (1) Với mỗi modul/ method:  Chạy các test case đã viết trong phần đầu, lưu kết quả chạy thành nhật kí chạy test case 34 Kiểm thử (2) Ví dụ với modul thêm một sách:  Chạy các test case đã viết trong phần đầu, lưu kết quả chạy thành nhật kí chạy test case Các test case Kết quả 1. thêm một sách chưa có id trong CSDL passed 2. Thêm một sách đã có id trong CSDL error 3. Thêm liên tục 2 lần một sách chưa có id trong csdl error Ví dụ Cài đặt theo thiết kế MVC thuần Tham khảo chi tiết tại: mvc-model.html 36 Sơ đồ lớp pha thiết kế Với chức năng thêm phòng: 37 Các bảng CSDL liên quan Bảng chứa thông tin phòng: 38 Lớp Room (1) package mvcPure; public class Room { private String id; private String name; private String type; private float displayPrice; private String description; public Room() { super(); } public Room(String id, String name, String type, float displayPrice, String description) { super(); this.id = id; this.name = name; this.type = type; this.displayPrice = displayPrice; this.description = description; } 39 Lớp Room (2) public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public float getDisplayPrice() { return displayPrice; } public void setDisplayPrice(float displayPrice) { this.displayPrice = displayPrice; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } 40 Lớp RoomDAO (1) package mvcPure; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class RoomDAO { private Connection con; public RoomDAO(){ String dbUrl = "jdbc:mysql://localhost:3306/hotel"; String dbClass = "com.mysql.jdbc.Driver"; try { Class.forName(dbClass); con = DriverManager.getConnection (dbUrl, "root", "12345678"); }catch(Exception e) { e.printStackTrace(); } } 41 Lớp RoomDAO (2) public void addRoom(Room room){ String sql = "INSERT INTO tblRoom(id, name, type, displayPrice, description) VALUES(?,?,?,?,?)"; try{ PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, room.getId()); ps.setString(2, room.getName()); ps.setString(3, room.getType()); ps.setFloat(4, room.getDisplayPrice()); ps.setString(5, room.getDescription()); ps.executeUpdate(); }catch(Exception e){ e.printStackTrace(); } } } 42 Lớp AddRoomFrm (1) package mvcPure; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class AddRoomFrm extends JFrame implements ActionListener{ private JTextField txtID; private JTextField txtName; private JTextField txtType; private JTextField txtDisplayPrice; private JTextField txtDescription; private JButton btnSubmit; private JButton btnReset; 43 Lớp AddRoomFrm (2) public AddRoomFrm(){ super("Room management pure-MVC"); txtID = new JTextField(15); txtName = new JTextField(15); txtType = new JTextField(15); txtDisplayPrice = new JTextField(15); txtDescription = new JTextField(15); btnSubmit = new JButton("Submit"); btnReset = new JButton("Reset"); JPanel content = new JPanel(); content.setLayout(new GridLayout(6,2)); content.add(new JLabel("ID:")); content.add(txtID); content.add(new JLabel("Name:")); content.add(txtName); content.add(new JLabel("Type:")); content.add(txtType); content.add(new JLabel("Display price:"));content.add(txtDisplayPrice); content.add(new Jlabel("Description:")); content.add(txtDescription); content.add(btnReset); content.add(btnSubmit); btnSubmit.addActionListener(this); btnReset.addActionListener(this); this.setContentPane(content); this.pack(); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } 44 Lớp AddRoomFrm (3) public void actionPerformed(ActionEvent e) { JButton btn = (JButton) e.getSource(); if(btn.equals(btnSubmit)){ btnSubmit_actionperformed(); }else if(btn.equals(btnReset)){ btnReset_actionperformed(); } } public void btnSubmit_actionperformed() { Room room = new Room(); room.setId(txtID.getText()); room.setName(txtName.getText()); room.setType(txtType.getText()); room.setDisplayPrice(Float.parseFloat(txtDisplayPrice.getText())); room.setDescription(txtDescription.getText()); RoomDAO rd = new RoomDAO(); rd.addRoom(room); JOptionPane.showMessageDialog(this, "Add room successfullly!"); } public void btnReset_actionperformed() { txtID.setText(""); txtName.setText(""); txtType.setText("");txtDisplayPrice.setText(""); txtDescription.setText(""); } } 45 Lớp Test package mvcPure; public class Test { public static void main(String[] args) { AddRoomFrm arf = new AddRoomFrm(); arf.setVisible(true); } } Lưu ý trước khi chạy, phải: - Cài đặt CSDL và bật server MySQL - Add driver của Jdbc mysql vào library của project Ví dụ Cài đặt theo thiết kế MVC bean Tham khảo chi tiết tại: mvc-model.html 47 Sơ đồ lớp pha thiết kế Với chức năng thêm phòng: 48 Lớp RoomBean (1) package mvcBean; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class RoomBean { private String id; private String name; private String type; private float displayPrice; private String description; public RoomBean() { super(); } public RoomBean(String id, String name, String type, float DisplayPrice, String description) { super(); this.id = id; this.name = name; this.type = type; this.displayPrice = displayPrice; this.description = description; } 49 Lớp RoomBean (2) public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public float getDisplayPrice() { return displayPrice; } public void setDisplayPrice(float displayPrice) { this.displayPrice = displayPrice; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } 50 Lớp RoomBean (3) public void addRoom(){ String dbUrl = "jdbc:mysql://localhost:3306/hotel"; String dbClass = "com.mysql.jdbc.Driver"; String sql = "INSERT INTO tblRoom(id, name, type, displayPrice, description) VALUES(?,?,?,?,?)"; try{ Class.forName(dbClass); Connection con = DriverManager.getConnection ( dbUrl, "root", "12345678"); PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, getId()); ps.setString(2, getName()); ps.setString(3, getType()); ps.setFloat(4, getDisplayPrice()); ps.setString(5, getDescription()); ps.executeUpdate(); con.close(); }catch(Exception e){ e.printStackTrace(); } } } 51 Lớp AddRoomFrm (1) package mvcBean; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class AddRoomFrm extends JFrame implements ActionListener{ private JTextField txtID; private JTextField txtName; private JTextField txtType; private JTextField txtDisplayPrice; private JTextField txtDescription; private JButton btnSubmit; private JButton btnReset; 52 Lớp AddRoomFrm (2) public AddRoomFrm(){ super("Room management pure-MVC"); txtID = new JTextField(15); txtName = new JTextField(15); txtType = new JTextField(15); txtDisplayPrice = new JTextField(15); txtDescription = new JTextField(15); btnSubmit = new JButton("Submit"); btnReset = new JButton("Reset"); JPanel content = new JPanel(); content.setLayout(new GridLayout(6,2)); content.add(new JLabel("ID:")); content.add(txtID); content.add(new JLabel("Name:")); content.add(txtName); content.add(new JLabel("Type:")); content.add(txtType); content.add(new JLabel("Display price:"));content.add(txtDisplayPrice); content.add(new Jlabel("Description:")); content.add(txtDescription); content.add(btnReset); content.add(btnSubmit); btnSubmit.addActionListener(this); btnReset.addActionListener(this); this.setContentPane(content); this.pack(); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } 53 Lớp AddRoomFrm (3) public void actionPerformed(ActionEvent e) { JButton btn = (JButton) e.getSource(); if(btn.equals(btnSubmit)){ btnSubmit_actionperformed(); }else if(btn.equals(btnReset)){ btnReset_actionperformed(); } } public void btnSubmit_actionperformed() { RoomBean room = new RoomBean(); room.setId(txtID.getText()); room.setName(txtName.getText()); room.setType(txtType.getText()); room.setDisplayPrice(Float.parseFloat(txtDisplayPrice.getText())); room.setDescription(txtDescription.getText()); room.addRoom(); JOptionPane.showMessageDialog(this, "Add room successfullly!"); } public void btnReset_actionperformed() { txtID.setText(""); txtName.setText(""); txtType.setText("");txtDisplayPrice.setText(""); txtDescription.setText(""); } } 54 Lớp Test package mvcBean; public class Test { public static void main(String[] args) { AddRoomFrm arf = new AddRoomFrm(); arf.setVisible(true); } } Lưu ý trước khi chạy, phải: - Cài đặt CSDL và bật server MySQL - Add driver của Jdbc mysql vào library của project Ví dụ Cài đặt theo thiết kế MVC cải tiến Tham khảo chi tiết tại: mvc-model.html 56 Sơ đồ lớp pha thiết kế Với chức năng thêm phòng: 57 Lớp Room (1) package mvcNew; public class Room { private String id; private String name; private String type; private float displayPrice; private String description; public Room() { super(); } public Room(String id, String name, String type, float displayPrice, String description) { super(); this.id = id; this.name = name; this.type = type; this.displayPrice = displayPrice; this.description = description; } 58 Lớp Room (2) public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public float getDisplayPrice() { return displayPrice; } public void setDisplayPrice(float displayPrice) { this.displayPrice = displayPrice; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } 59 Lớp AddRoomFrm (1) package mvcNew; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class AddRoomFrm extends JFrame implements ActionListener{ private JTextField txtID; private JTextField txtName; private JTextField txtType; private JTextField txtDisplayPrice; private JTextField txtDescription; private JButton btnSubmit; private JButton btnReset; 60 Lớp AddRoomFrm (2) public AddRoomFrm(){ super("Room management pure-MVC"); txtID = new JTextField(15); txtName = new JTextField(15); txtType = new JTextField(15); txtDisplayPrice = new JTextField(15); txtDescription = new JTextField(15); btnSubmit = new JButton("Submit"); btnReset = new JButton("Reset"); JPanel content = new JPanel(); content.setLayout(new GridLayout(6,2)); content.add(new JLabel("ID:")); content.add(txtID); content.add(new JLabel("Name:")); content.add(txtName); content.add(new JLabel("Type:")); content.add(txtType); content.add(new JLabel("Display price:"));content.add(txtDisplayPrice); content.add(new Jlabel("Description:")); content.add(txtDescription); content.add(btnReset); content.add(btnSubmit); btnSubmit.addActionListener(this); btnReset.addActionListener(this); this.setContentPane(content); this.pack(); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } 61 Lớp AddRoomFrm (3) public void actionPerformed(ActionEvent e) { JButton btn = (JButton) e.getSource(); if(btn.equals(btnReset)){ btnReset_actionperformed(); } } public void btnReset_actionperformed() { txtID.setText(""); txtName.setText(""); txtType.setText(""); txtDisplayPrice.setText(""); txtDescription.setText(""); } 62 Lớp AddRoomFrm (4) public Room getRoom(){ Room room = new Room(); room.setId(txtID.getText()); room.setName(txtName.getText()); room.setType(txtType.getText()); room.setDisplayPrice( Float.parseFloat(txtDisplayPrice.getText())); room.setDescription(txtDescription.getText()); return room; } public void showMessage(String msg){ JOptionPane.showMessageDialog(this, msg); } public void addSubmitListener(ActionListener log) { btnSubmit.addActionListener(log); } 63 Lớp RoomControl (1) package mvcNew; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class RoomControl { private Connection con; private Room room; private AddRoomFrm arf; public RoomControl(){ String dbUrl = "jdbc:mysql://localhost:3306/hotel"; String dbClass = "com.mysql.jdbc.Driver"; try { Class.forName(dbClass); con = DriverManager.getConnection (dbUrl, "root", "12345678"); }catch(Exception e) { e.printStackTrace(); } arf = new AddRoomFrm(); arf.addSubmitListener(new AddRoomListener()); arf.setVisible(true); } 64 Lớp RoomControl (2) public void addRoom(Room room){ String sql = "INSERT INTO tblRoom(id, name, type, displayPrice, description) VALUES(?,?,?,?,?)"; try{ PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, room.getId()); ps.setString(2, room.getName()); ps.setString(3, room.getType()); ps.setFloat(4, room.getDisplayPrice()); ps.setString(5, room.getDescription()); ps.executeUpdate(); }catch(Exception e){ e.printStackTrace(); } } class AddRoomListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { room = arf.getRoom(); addRoom(room); arf.showMessage("Add room successfullly!"); } catch (Exception ex) { ex.printStackTrace(); } } } } 65 Lớp Test package mvcNew; public class Test { public static void main(String[] args) { RoomControl rc = new RoomControl(); } } Lưu ý trước khi chạy, phải: - Cài đặt CSDL và bật server MySQL - Add driver của Jdbc mysql vào library của project 66 Bài tập Cài đặt theo kiến trúc đã thiết kế các modul sau:  Chức năng sửa thông tin phòng  Chức năng xóa thông tin phòng  Chức năng đặt phòng  Chức năng checkin  Chức năng trả phòng và thanh toán 67 Bài tập về nhà Cài đặt modul cá nhân theo kiến trúc đã thiết kế:  Trình bày sơ đồ lớp đã thiết kế  Trình bày sơ đồ cơ sở dữ liệu đã thiết kế  Cài đặt các lớp theo đúng thiết kế  Demo chương trình Questions?

Các file đính kèm theo tài liệu này:

  • pdfnhap_mon_cong_nghe_phan_mem_ptit_giang_vien_nguyen_manh_hung_0857.pdf