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
395 trang |
Chia sẻ: huyhoang44 | Lượt xem: 1083 | Lượt tải: 0
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:
- nhap_mon_cong_nghe_phan_mem_ptit_giang_vien_nguyen_manh_hung_0857.pdf