Bài toán xếp thời khóa biểu là một trường hợp riêng của bài toán lập lịch trong đó đưa ra một chuỗi các sự kiện thông thường là các môn học, bài giảng, môn thi và bao gồm các giáo viên v
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Đỗ Huy Thịnh
ỨNG DỤNG FRAMEWORK VÀ LẬP TRÌNH RÀNG BUỘC CHO BÀI TOÁN LẬP THỜI KHÓA BIỂU
KHÓA LUẬN TỐT NGHIỆP HỆ ĐẠI HỌC CHÍNH QUY
Ngành: Công nghệ thông tin
HÀ NỘI – 2006
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Đỗ Huy Thịnh
ỨNG DỤNG FRAMEWORK VÀ LẬP TRÌNH RÀNG BUỘC CHO BÀI TOÁN LẬP THỜI KHÓA BIỂU
KHÓA LUẬN TỐT NGHIỆP HỆ ĐẠI HỌC CHÍNH QUY
Ngành: Công nghệ thông tin
Cán bộ hướng dẫn: PGS.Ts Nguyễn Văn Vỵ
HÀ NỘI – 2006
Trang 3Lời đầu tiên em xin bày tỏ lòng biết ơn sâu sắc tới thầy giáo PGS.TS.Nguyễn Văn Vỵ, thầy đã tận tình hướng dẫn giúp em hoàn thành khóa luận
Em xin bày tỏ lòng biết ơn tới các thầy cô giáo trong khoa Công nghệ thông tin
- Trường Đại học Công nghệ - ĐHQGHN Các thầy cô đã dạy bảo và luôn tạo điều kiện tốt nhất cho chúng em học tập trong suốt quá trình học đại học đặc biệt là trong thời gian làm khóa luận tốt nghiệp
Tôi xin cảm ơn các bạn sinh viên lớp K47CA trường Đại học Công nghệ, những người bạn luôn bên cạnh ủng hộ tôi trong suốt những năm học đại học
Cuối cùng con xin gửi tới Bố Mẹ và gia đình tình thương yêu và lòng biết ơn
Bố mẹ luôn là nguồn động viên và là chỗ dựa vững chắc cho con
Hà Nội, ngày 20 tháng 5 năm 2006
Sinh viên
Đỗ Huy Thịnh
Trang 4Bài toán sắp xếp thời khóa biểu từ lâu luôn thu hút được sự quan tâm của nhiều nhà nghiên cứu và nhiều chuyên gia trong lĩnh vực liên quan Sự nổi tiếng của bài toán không chỉ ở độ phức tạp mà còn ở tính thực tiễn, khả năng áp dụng trong thực
tế
Khóa luận tốt nghiệp “Ứng dụng framework và lập trình ràng buộc cho bài toán lập thời khóa biểu” hướng tới xây dựng hệ thống nhằm giải quyết bài toán xếp thời khóa biểu học kỳ vận dụng các công nghệ framework ( khung làm việc) và lập trình ràng buộc đối tượng
Khóa luận được tổ chức thành bốn phần với nội dung như sau:
♦ Chương I: Giới thiệu bài toán lập thời khóa biểu nói chung và bài toán lập thời khóa biểu học kỳ mà khóa luận giải quyết
♦ Chương II: Giới thiệu tổng quan và trình bày các thành phần của ngôn ngữ ràng buộc đối tượng
♦ Chương III: Giới thiệu tổng quan và cấu trúc khung làm việc thông qua một số ví dụ
♦ Chương IV: Phân tích, thiết kế và cài đặt hệ thống cho bài toán xếp thời khóa biểu học kỳ
Trang 5LỜI CẢM ƠN ii
TÓM TẮT NỘI DUNG iii
MỤC LỤC iv
DANH MỤC BẢNG BIỂU vi
DANH MỤC HÌNH VẼ vii
MỞ ĐẦU 1
Chương 1 .2
Bài toán lập Thời khóa biểu 2
1.1 Giới thiệu chung bài toán lập thời khóa biểu 2
1.1.1 Bài toán xếp thời khóa biểu nhà trường 2
1.1.2 Phân loại bài toán xếp thời khóa biểu .2
1.1.3 Các đối tượng liên quan đến Thời khóa biểu 3
1.2 Bài toán lập thời khóa biểu giải quyết trong khóa luận 4
1.2.1 Hoạt động nghiệp vụ 5
1.2.2 Bảng tổng hợp các chức năng của hệ thống “Lập thời khóa biểu học kỳ” 6
1.2.3 Từ điển dữ liệu và mô hình lĩnh vực nghiệp vụ 7
Chương 2 .9
Ngôn ngữ ràng buộc đối tượng 9
2.1 Giới thiệu chung 9
2.2 Đặc điểm OCL 10
2.2.1 Cả truy vấn và ngôn ngữ ràng buộc 10
2.2.2 Ngôn ngữ dựa trên cơ sở toán học nhưng không có các ký hiệu toán học 10
2.2.3 Ngôn ngữ định nghĩa kiểu 11
2.2.4 Ngôn ngữ khai báo 11
2.3 Bài toán L&R 11
2.4 Ngữ cảnh của các biểu thức OCL 13
2.4.1 Mô hình kết hợp 13
2.4.2 Các lớp và các kiểu khác 15
2.4.3 Các thuộc tính và các đầu mút của liên kết 16
2.4.4 Các phương thức 17
2.4.5 Các biểu thức trong các biểu đồ hành vi 18
2.4.6 Các ca sử dụng 18
2.4.7 Các ràng buộc và thừa kế 18
2.5 Các thành phần OCL cơ bản 20
2.5.1 Các biểu thức, kiểu và giá trị 20
2.5.2 Các kiểu cơ sở và các toán tử 21
2.5.3 Các quy tắc ưu tiên 24
2.5.4 Chú thích 24
2.6 Các kiểu người dùng định nghĩa 24
Trang 62.6.3 Các kiểu liệt kê 27
2.7 Kiểu tập hợp 28
2.7.1 Các kiểu tập hợp 28
2.7.2 Các phép toán trên các kiểu tập hợp 30
2.7.3 Các phép toán lặp và duyệt 34
2.8 Các cấu trúc nâng cao 35
2.8.1 Các cấu trúc cho các điều kiện sau 35
Chương 3 .37
Giới thiệu khung làm việc 37
3.1 Sự ra đời của khung làm việc 37
3.1.1 Một số khái niệm hướng đối tượng 37
3.1.2 Sử dụng lại phần mềm 39
3.2 Ví dụ khung làm việc 43
3.2.1 Khung làm việc cộng tác 45
3.2.2 Làm mịn khung làm việc 51
Chương 4 .56
Xây dựng hệ thống cho bài toán lập Thời khóa biểu 56
4.1 Mô hình ca sử dụng 56
4.1.1 Xác định tác nhân 56
4.1.2 Các ca sử dụng 56
4.2 Phân tích 60
4.2.1 Phân tích kiến trúc 60
4.2.2 Phân tích ca sử dụng 61
4.3 Thiết kế 69
4.3.1 Thiết kế lớp 69
4.3.2 Cấu trúc dữ liệu và thuật toán 73
4.4 Cài đặt 77
4.4.1 Công cụ 77
4.4.2 Môi trường triển khai 77
4.4.3 Giao diện chính 78
4.4.4 Kết quả 86
KẾT LUẬN 89
TÀI LIỆU THAM KHẢO 90
Trang 7Bảng 1 Tổng hợp các chức năng hệ thống "Lập thời khóa biểu học kỳ" 6
Bảng 2 Từ điển dữ liệu 7
Bảng 3 Các phép toán định nghĩa trên kiểu dữ liệu boolean 21
Bảng 4 Các toán tử chuẩn kiểu số nguyên và số thực 22
Bảng 5 Các toán tử kiểu dữ liệu xâu ký tự 23
Bảng 6 Độ ưu tiên các toán tử 24
Bảng 7 Các phép toán trên kiểu tập hợp 30
Bảng 8 Các phép toán biến đổi trên kiểu tập hợp 31
Bảng 9 Các phép toán duyệt định nghĩa trên kiểu tập hợp 34
Bảng 10 Bảng luồng sự kiện ca sử dụng lập danh sách lớp học 57
Bảng 11 Bảng luồng sự kiện ca sử dụng lập danh sách môn học 57
Bảng 12 Bảng luồng sự kiện ca sử dụng lập danh sách giáo viên giảng dạy 58
Bảng 13 Bảng luồng sự kiện ca sử dụng xác định giáo viên dạy môn học cho lớp 59
Bảng 14 Bảng luồng sự kiện ca sử dụng lập danh sách ràng buộc 59
Bảng 15 Bảng luồng sự kiện ca sử dụng lập thời khóa biểu 60
Bảng 16 Các thuộc tính lớp thiết kế Spciality 69
Bảng 17 Các thuộc tính lớp thiết kế Teacher 69
Bảng 18 Các thuộc tính thêm lớp con Tie_Teacher 70
Bảng 19 Các thuộc tính lớp thiết kế Subject 70
Bảng 20 Các thuộc tính thêm lớp con Subject- Class 71
Bảng 21 Các thuộc tính lớp thiết kế Class 71
Bảng 22 Thuộc tính thêm lớp con Tie_Class 72
Bảng 23 Các thuộc tính lớp thiết kế Timeable 72
Bảng 24 Bảng chia môn học các ca học dựa trên số tiết học 75
Bảng 25 Kết quả chương trình trên một số bộ dữ liệu 87
Trang 8Hình 1 Mô hình lĩnh vực nghiệp vụ bài toán xếp thời khóa biểu 8
Hình 2 Ví dụ mô hình UML không biểu diễn hết đặc tả 9
Hình 3 Mô hình hệ thống chương trình Loyalty 12
Hình 4 Định nghĩa ngữ cảnh trong mô hình UML 14
Hình 5 Cây thừa kế của ví dụ minh họa 19
Hình 6 Ví dụ điều hướng trong kết hợp ( kết tập) 25
Hình 7 Ví dụ lớp kết hợp 26
Hình 8 Ví dụ kiểu liệt kê 27
Hình 9 Ví dụ liên kết động và đa hình 38
Hình 10 Sự khác nhau trong điều khiển giữa khung làm việc và thư viện lớp 40
Hình 11 Ví dụ về áp dụng một mô hình khung làm việc 44
Hình 12 Sự cộng tác giữa các đối tượng 46
Hình 13 Khuôn mẫu cộng tác 48
Hình 14 Mô hình kiểu đích cho việc sử dụng sự quan sát 49
Hình 15 Ví dụ ứng dụng khung làm việc và sự thay thế 49
Hình 16 Kết quả mở của ứng dụng khung làm việc 50
Hình 17 Khung làm việc cho việc thương mại: duy trì kho hàng 52
Hình 18 Sự cộng tác Trade Supply 54
Hình 19 Làm tài liệu sự làm mịn khung làm việc 55
Hình 20 Mô hình ca sử dụng 56
Hình 21 Biểu đồ cộng tác ca sử dụng lập danh sách lớp học 61
Hình 22 Biểu đồ cộng tác ca sử dụng lập danh sách môn học trong học kỳ 62
Hình 23 Biểu đồ cộng tác ca sử dụng lập Danh sách giáo viên trong học kỳ 63
Hình 24 Biểu đồ cộng tác ca sử dụng lập danh sách lớp- môn học 65
Hình 25 Biểu đồ cộng tác ca sử dụng lập danh sách lớp- môn- giáo viên 66
Hình 26 Biểu đồ cộng tác ca sử dụng lập danh sách các ràng buộc 67
Hình 27 Biểu đồ cộng tác ca sử dụng lập thời khóa biểu 68
Hình 28 Biểu đồ lớp thiết kế 73
Hình 29 Ma trận đánh dấu trạng thái lớp 75
Hình 30 Giao diện menu Sửa dữ liệu 78
Hình 31 Giao diện chỉnh sửa danh sách chuyên ngành 79
Hình 32 Giao diện chỉnh sửa danh sách lớp học 79
Hình 33 Giao diện chỉnh sửa danh sách môn học .80
Hình 34 Giao diện chỉnh sửa danh sách giáo viên 80
Hình 35 Giao diện menu Chọn dữ liệu 81
Hình 36 Giao diện nhập học kỳ - năm học 81
Hình 37 Giao diện chọn lớp học cho học kỳ 82
Hình 38 Giao diện chọn môn học cho học kỳ 82
Hình 39 Giao diện chọn giáo viên giảng dạy cho học kỳ 83
Trang 9Hình 42 Giao diện nhập ngày nghỉ giáo viên 84
Hình 43 Giao diện thông báo xếp xong thời khóa biểu 85
Hình 44 Xác nhận hủy lập thời khóa biểu 85
Hình 45 Giao diện menu Xem TKB 85
Hình 46 Giao diện xem thời khóa biểu theo lớp 86
Hình 47 Giao diện xem thời lịch dạy giáo viên 86
Hình 48 Ví dụ kết quả thời khóa biểu lớp 87
Hình 49 Ví dụ kết quả lịch dạy giáo viên 1 88
Hình 50 Ví dụ kết quả lịch dạy giáo viên 2 88
Trang 10Bài toán lập thời khóa biểu từ lâu luôn thu hút được sự quan tâm của nhiều tổ chức giáo dục và các nhà nghiên cứu bởi tính ứng dụng cao và độ phức tạp Các bài toán lập thời khóa biểu rất phong phú và đa dạng bởi các ràng buộc và yêu cầu của từng tổ chức Bài toán đặc trưng bởi các ràng buộc và các ràng buộc có thể được thêm vào với nhiều mức khác nhau Rất nhiều chương trình đã được lập và đưa vào sử dụng Phần lớn các chương trình đó được phát triển dựa trên cơ sở một mô hình toán học chặt chẽ và thuật toán xây dựng là dành riêng cho mô hình đó Vì vậy khi áp dụng, nó chỉ thích hợp với một phạm vi hẹp mà ở đó bài toán đặt ra đúng với mô hình đã xây dựng Ngay trong phạm vi đó, khi xuất hiện thêm một vài ràng buộc mới thì kết quả đã không hiệu quả, thậm chí không cho lời giải
Một vấn đề đặt ra là, cần phát triển một hệ thống thời khóa biểu có thể thích nghi được với nhiều lớp bài toán lập thời khóa biểu khác nhau về ràng buộc với sự cải biên sửa đổi không nhiều và tiến hành là dễ dàng nhanh chóng Chỉ có một hệ thống như vậy mới thực sự đáp ứng được yêu cầu thực tế cao và hiệu quả
Khóa luận hướng đến giải quyết bài toán này dựa trên hai cơ sở sau:
♦ Tìm một thuật toán kiểu heuristic đủ đơn giản để giải bài toán Do đó dễ cải biên mỗi khi thêm ràng buộc
♦ Sử dụng hai công nghệ tiên tiến là Framework và lập trình ràng buộc Vì lớp bài toán thời khóa biểu có phần lõi chung, nên Framework trợ giúp thiết kế xây dựng ứng dụng cho lớp này dễ dàng thay đổi ràng buộc bổ sung Còn lập trình ràng buộc trợ giúp việc lâp trình có ràng buộc tiện lợi, nhanh chóng
Trang 11Chương 1
Bài toán lập Thời khóa biểu 1.1 Giới thiệu chung bài toán lập thời khóa biểu
1.1.1 Bài toán xếp thời khóa biểu nhà trường
Bài toán sắp xếp thời khóa biểu từ lâu luôn thu hút được sự quan tâm của nhiều nhà nghiên cứu và nhiều chuyên gia trong lĩnh vực liên quan Sự nổi tiếng của bài toán không chỉ ở độ phức tạp mà còn ở tính thực tiễn, khả năng áp dụng trong thực tế Bất
cứ một cơ sở đào tạo nào, thời khóa biểu học tập của học viên ( học sinh, sinh viên) và giảng dạy của giáo viên giảng dạy luôn có vai trò quan trọng kết nối hầu như toàn bộ các hoạt động
Bài toán xếp thời khóa biểu là một trường hợp riêng của bài toán lập lịch trong
đó đưa ra một chuỗi các sự kiện (thông thường là các môn học, bài giảng, môn thi) và bao gồm các giáo viên và học viên trong một khoảng thời gian định trước và thoả mãn một tập hợp các ràng buộc của từng loại thời khoá biểu khác nhau Các ràng buộc bao gồm khả năng học tập của học viên và khả năng giảng dạy của giáo viên, số lượng và sức chứa của phòng học, hạn định về thời gian và yêu cầu đáp ứng của các sự kiện
1.1.2 Phân loại bài toán xếp thời khóa biểu
a Theo loại khuôn dạng thời gian Thời khóa biểu
Phân loại theo mẫu biểu của thời khóa biểu được in ra Trên thực tế có rất nhiều loại thời khóa biểu khác nhau, rất đa dạng và tùy thuộc vào hoàn cảnh, điều kiện của từng trường Có thể liệt kê một số loại tiêu biểu:
♦ Thời khóa biểu TUẦN
Là mẫu dạng thời khóa biểu cho một tuần và được dùng làm chuẩn cho tất cả các tuần của học kỳ ( năm học) Đa số các trường học của Việt Nam đều sử dụng khuôn mẫu này
♦ Thời khóa biểu HỌC KỲ
Là mẫu khuôn dạng thời khóa biểu được biểu diễn đến từng ngày trong suốt học
kỳ ( năm học)
♦ Thời khóa biểu 2 ( nhiều) TUẦN / HỌC KỲ
Trang 12Là loại thời khóa biểu khuôn dạng tuần, tuy nhiên thời gian phân bố cho thời khóa biểu được chia làm nhiều khoảng trong một học kỳ hay năm học Với mô hình này các môn học được sắp xêp không dàn đều trong một học kỳ mà thường co dãn trong những khoảng thời gian nhỏ hơn
♦ Thời khóa biểu THÁNG ( NĂM HỌC)
Là loại thời khóa biểu được thiết kế chi tiết từng tháng ( năm học)
b Phân loại theo đơn vị xếp Thời khóa biểu
Phân loại theo các đối tượng trực tiếp liên quan đến dữ liệu thời khóa biểu Các đối tượng chính của Thời khóa biểu bao gồm:
♦ Giáo viên giảng dạy: người trực tiếp giảng dạy theo các học phần môn học
được quy định chặt chẽ về thời lượng kiến thức và hình thức học
♦ Phòng học: địa điểm học các môn và bài giảng do giáo viên đảm nhận
♦ Học sinh: đối tượng học tập trực tiếp của giáo viên giảng dạy Học sinh được
phân công vào các lớp học Do có hai kiểu lớp học khác nhau tạo nên sự khác biệt của mô hình Thời khóa biểu:
♦ Mô hình lớp học niên chế: học sinh nhập học và phân cố định vào lớp
theo năm học Mô hình lớp này đơn giản về mặt tổ chức, quản lý nhưng lại phức tạp trong việc xếp Thời khóa biểu
♦ Mô hình lớp học tín chỉ: học sinh tự do đăng ký vào các bài giảng đã
chuẩn bị trước của thời khóa biểu Các lớp học thực chất là các bài giảng được thiết kế thời khóa biểu giảng dạy chi tiết Thường thì sau khi thời khóa biểu các lớp được lên kế hoạch thì học sinh mới căn cứ vào thời khóa biểu cụ thể để đăng ký lớp học Việc tổ chức Thời khóa biểu theo lớp tín chỉ sẽ đơn giản hơn cho việc xếp Thời khóa biểu nhưng lại phức tạp cho công việc quản lý chuyên môn đào tạo nhà trường
1.1.3 Các đối tượng liên quan đến Thời khóa biểu
Các đối tượng liên quan trực tiếp đến Thời khóa biểu bao gồm: Giáo viên giảng dạy, Phòng học và Môn học ( học phần giảng dạy):
Trang 13♦ Giáo viên: trong mô hình bài toán xếp Thời khóa biểu vai trò các giáo viên là
ngang nhau Mỗi giáo viên về nguyên tắc thuộc một Khoa hay Bộ môn và sẽ có một Thời khóa biểu lịch giảng dạy riêng của mình trong học kỳ hay năm học hiện thời
♦ Môn học: môn học hay học phần là một đơn vị quản lý chính của chương trình
đào tạo và là đối tượng chính của cả hai mô hình lớp niên chế và tín chỉ Chính
vì vậy môn học có vai trò quan trọng trong mô hình bài toán xếp Thời khóa biểu Mỗi môn học thuộc khoa hay bộ môn trực tiếp phụ trách và đặc trưng bởi
số đơn vị học trình ( thời lượng học)
♦ Phòng học: phòng học cũng đóng vai trò quan trọng trong bài toán xếp thời
khóa biểu Phòng học đặc trưng bởi loại hình thức học ( lý thuyết, thực hành) hay sức chứa và căn cứ vào đó phân công cho các lớp
1.2 Bài toán lập thời khóa biểu giải quyết trong khóa luận
Trong khóa luận này chỉ xét bài toán lập thời khoá biểu cho trường đại học ở Việt Nam mà cụ thể là trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội ( có thể tổng quát cho các trường vẫn giảng dạy theo hệ lớp- môn- giáo viên giảng dạy)
Bài toán được phát biểu như sau:
Có một danh sách các lớp học học trong học kỳ, danh sách các môn học tương ứng cho từng lớp học và danh sách giảng viên tương ứng với mỗi môn cho từng lớp Giảng đường cho mỗi lớp đã được xếp trước
Một lời giải hay một thời khoá biểu chấp nhận được là tất cả các môn học được chia vào các tiết học trong một tuần thoả mãn các điều kiện ngặt sau:
♦ Các lớp học không có tiết trống ở giữa
♦ Giảng viên không dạy hai lớp khác nhau ở cùng một thời điểm
♦ Tại một thời điểm mỗi lớp học chỉ học một môn
Thêm vào đó, một thời khoá biểu chấp nhận được sẽ được đánh giá bằng số vi phạm các ràng buộc mềm được cho như sau:
♦ Số buổi lên lớp của giáo viên giảng dạy là ít nhất
♦ Giáo viên giảng dạy có không quá một tiết trống ở giữa các ca dạy trong ngày
Trang 14♦ Giáo viên giảng dạy có thể không dạy vào buổi nào đó
♦ Lớp học có một ngày nghỉ ( ngoài chủ nhật) trong tuần
1.2.1 Hoạt động nghiệp vụ
1.2.1.1 Lên danh sách các lớp sẽ được học trong học kỳ
Vào đầu năm học, nhân viên phòng Đào Tạo phụ trách phần quản lí giảng dạy
và học tập phải ra kế hoạch lập thời khóa biểu Trước tiên nhân viên phòng Đào Tạo sẽ lập danh sách các lớp sẽ học trong học kỳ đó Đồng thời gửi số lớp học về phòng Hành Chính Tổng Hợp đề nghị chuẩn bị lớp Phòng Hành Chính Tổng Hợp gửi lại danh sách và qui mô phòng học cho phòng Đào Tạo
1.2.1.2 Xác định môn học cho mỗi lớp ( lớp- môn)
Với mỗi lớp học trong danh sách ở trên, nhân viên phòng Đào Tạo đối chiếu với chương trình đào tạo đã được áp dụng để đưa ra danh sách môn học của từng lớp
Từ danh sách các môn học, nhân viên phòng Đào Tạo trích ra các môn học cho mỗi bộ môn và số trình phải dạy và gửi về các bộ môn để bộ môn đăng kí hay phân công giáo viên giảng dạy Đồng thời gửi danh sách này cho lãnh đạo khoa để lấy ý kiến đánh giá giúp cho việc chỉnh sửa bổ sung chương trình đào tạo được khoa học hơn
1.2.1.3 Phân công giảng dạy ( lớp- môn- giáo viên)
Sau khi nhận danh sách các giáo viên đăng kí giảng dạy từ các bộ môn, phòng Đào Tạo tiến hành lập danh sách giáo viên giảng dạy tương ứng với mỗi môn học của lớp
1.2.1.4 Lên danh sách các phòng học
Dựa vào danh sách các phòng học và qui mô của từng lớp do phòng Hành Chính Tổng Hợp gửi lại, nhân viên phòng Đào Tạo lên danh sách các giảng đường có thể đưa vào sử dụng
1.2.1.5 Lập thời khóa biểu
Từ danh sách các lớp và các môn học tương ứng, danh sách các giáo viên giảng dạy đăng kí dạy và ý kiến của lãnh đạo khoa về chương trình đào tạo đưa ra, nhân viên phòng Đào Tạo lập ra thời khóa biểu dự kiến và gửi đi các đơn vị liên quan lấy ý kiến phản hồi Căn cứ vào ý kiến phản hồi, nhân viên phòng đào tạo xếp thời khóa biểu chính thức và gửi cho các đơn vị, bộ môn và các lớp
Trang 151.2.2 Bảng tổng hợp các chức năng của hệ thống “Lập thời khóa biểu
học kỳ”
Bảng 1 Tổng hợp các chức năng hệ thống "Lập thời khóa biểu học kỳ"
Số chức năng Chức năng
R1 Lập danh sách các lớp học sẽ học trong học kỳ
R2 Lập danh sách các môn học cho các lớp
R3 Lập danh sách các giáo viên giảng dạy
R4 Xác định giáo viên giảng dạy cho các môn học của các lớp
R5 Xác định các ràng buộc, ưu tiên
R6 Lập thời khóa biểu dự kiến, chính thức
Trang 161.2.3 Từ điển dữ liệu và mô hình lĩnh vực nghiệp vụ
4 Teacher-subject Giao viên – môn học
Giáo viên dạy tương ứng với môn học
5 Curriculum
Chương trình đào tạo(CTĐT)
Bao gồm hệ chính qui, tại chức, tập trung hay từ xa…
Lịch học cho các lớp trong trường, khoa
Người phụ trách quản lí giảng dạy và học tập
11 Training bureau Phòng Đào Tạo
Phụ trách các vấn đề về giảng dạy và học tập
12
Bureau of
administration
Phòng hành chính tổng hợp
Yêu cầu đặt ra khi lập thời khóa biểu
Trang 171.2.3.2 Mô hình lĩnh vực nghiệp vụ
Hình 1 Mô hình lĩnh vực nghiệp vụ bài toán xếp thời khóa biểu
Trang 18Các biểu thức viết trong OCL thêm các thông tin quan trọng cho các mô hình hướng đối tượng Các thông tin này thường không thể biểu diễn trong biểu đồ Trong UML phiên bản 1.1 các thông tin này được giới hạn bởi các ràng buộc, mỗi ràng buộc được định nghĩa như một hạn chế về giá trị nhận được ( một hay nhiều) của một hệ thống hay mô hình hướng đối tượng Trong UML phiên bản 2, một mô hình có thể chứa nhiều thông tin thêm hơn là chỉ có ràng buộc Tất cả các công việc như: định nghĩa truy vấn, các giá trị tham chiếu, các quy tắc nghiệp vụ hay các điều kiện trạng thái được viết bằng các biểu thức trong một mô hình OCL là ngôn ngữ chuẩn trong đó các biểu thức được viết một cách rõ ràng và dễ hiểu
Một mô hình thường có những thiếu sót do những hạn chế của các biểu đồ Một biểu đồ đơn giản không thể biểu diễn các phát biểu đặc tả Ví dụ trong mô hình UML sau:
Hình 2 Ví dụ mô hình UML không biểu diễn hết đặc tả
Trong mô hình, quan hệ giữa lớp Flight ( chuyến bay) và lớp Person ( khách hàng), phía lớp Person có bản số là 0…* tức là số khách hàng là không giới hạn Trong thực tế số khách hàng bị giới hạn bởi số ghế mà máy bay có, và giới hạn này
Trang 19không thể biểu diễn trong biểu đồ Trong ví dụ này có một cách chỉ định ràng buộc về bản số thể hiện là thêm vào biểu đồ ràng buộc OCL sau:
context Flight
inv: passengers-> size () <= plane.numberOfSeats
2.2 Đặc điểm OCL
OCL thêm các thông tin làm mô hình nhất quán, hoàn thiện và rõ ràng Nếu chỉ
có biểu đồ trong mô hình UML, hệ thống sẽ không đảm bảo tính chính xác, đúng đắn OCL là ngôn ngữ quan trọng giúp xây dựng mô hình tốt hơn
2.2.1 Cả truy vấn và ngôn ngữ ràng buộc
Trong UML phiên bản 1.1 OCL là ngôn ngữ biểu diễn các ràng buộc trên các thành phần trong các biểu đồ của mô hình Một ràng buộc là một hạn chế trên một hay nhiều giá trị của một phần hay cả hệ thống mô hình hướng đối tượng Dù các biểu đồ trong mô hình biểu diễn các đối tượng hay các giá trị dữ liệu nhưng những giá trị đó chỉ hợp lệ nếu điều kiện xác định bởi ràng buộc thỏa mãn
Đến UML phiên bản 2, OCL viết không chỉ ràng buộc, mà bất kỳ biểu thức nào trên các thành phần của biểu đồ Mọi biểu thức OCL biểu thị một giá trị hay một đối tượng bên trong hệ thống
Các biểu thức OCL được dùng ở bất kỳ nơi nào trong mô hình để biểu thị một giá trị Một giá trị có thể là một giá trị kiểu cơ sở ( số nguyên,…) hay một tham chiếu tới một đối tượng, một tập các giá trị, hay tập các tham chiếu tới các đối tượng Một biểu thức OCL có thể biểu diễn , ví dụ một giá trị logic được dùng như điều kiện trong biểu đồ trạng thái, hay một thông điệp (message) trong biểu đồ tương tác Một biểu thức OCL cũng có thể dùng để chỉ một đối tượng cụ thể trong biểu đồ đối tượng hay biểu đồ tương tác
2.2.2 Ngôn ngữ dựa trên cơ sở toán học nhưng không có các ký hiệu
toán học
Đặc điểm nổi bật của OCL là xây dựng dựa trên cơ sở toán học Nó dựa trên lý thuyết tập hợp và logic vị từ Tuy nhiên OCL lại không dùng các ký hiệu toán học Một ngôn ngữ mô hình cần sự chặt chẽ và chính xác của toán học nhưng lại đòi hỏi đặc điểm dễ hiểu của ngôn ngữ tự nhiên OCL dùng các khái niệm toán học nhưng bỏ qua các ký hiệu khó hiểu của toán học Thay vì dùng ký hiệu toán học để biểu diễn cùng một khái niệm, OCL dùng các từ khóa dễ hiểu
Trang 202.2.3 Ngôn ngữ định nghĩa kiểu
Đặc trưng quan trọng của OCL là một ngôn ngữ định nghĩa kiểu Các biểu thức OCL được dùng cho các mục đích mô hình hóa và đặc tả Do hầu hết các mô hình không được thực thi trực tiếp, các biểu thức OCL được viết trên những phiên bản không thực thi được của hệ thống Tuy nhiên có thể kiểm tra một biểu thức OCL mà không cần đưa ra phiên bản thực thi được của mô hình Như một ngôn ngữ định nghĩa kiểu, các biểu thức OCL có thể được kiểm tra trong mô hình trước khi thực thi Nhờ
đó mà lỗi của mô hình có thể sớm được loại bỏ
2.2.4 Ngôn ngữ khai báo
Một đặc tính dễ phân biệt khác của OCL là ngôn ngữ khai báo Trong các ngôn ngữ thủ tục giống như các ngôn ngữ lập trình, các biểu thức là các mô tả về các hành động phải thực hiện Trong một ngôn ngữ khai báo, một biểu thức phát biểu đơn giản điều được thực hiện nhưng không chỉ ra cách làm như thế nào Để đảm bảo điều này, các biểu thức OCL không có ảnh hưởng tới hệ thống, có nghĩa là việc đánh giá một biểu thức OCL không thay đổi trạng thái của hệ thống
2.3 Bài toán L&R
Để tiện minh họa khi giới thiệu OCL xét một ví dụ mô hình một hệ thống của một công ty Royal & Loyal ( R& L) R & L nghiên cứu về các chương trình cho các công ty khuyến khích khách hàng thường xuyên bằng nhiều khoản tiền thưởng ( gọi là chương trình Loyalty)
Trang 21Hình 3 Mô hình hệ thống chương trình Loyalty
Lớp trung tâm của mô hình là LoyaltyProgram Một hệ thống mà quản lý chỉ một chương trình Loyalty đơn chứa chỉ một thể hiện của lớp này Trong trường hợp
R& L, nhiều thể hiện của lớp này được biểu diễn trong hệ thống Một công ty tham dự
chương trình mà cấp cho khách hàng thẻ thành viên trong chương trình Loyalty được gọi là ProgramPartner Có thể có nhiều công ty đăng ký cùng chương trình Trong
Trang 22trường hợp đó các khách hàng đăng ký chương trình Loyalty có thể thu lợi từ các dịch
vụ đưa ra do bất kỳ công ty tham dự nào
Mọi khách hàng thành viên của chương trình có thể đăng ký chương trình
Loyalty bằng cách điền vào một form và nhận được một thẻ hội viên Các đối tượng
của lớp Customer biểu diễn cho những người đã đăng ký chương trình Thẻ thành viên, biểu diễn bởi lớp CustomerCard, thuộc về một người Một thẻ có thể dùng cho
cả gia đình hay cửa hàng Hầu hết các chương trình Loyalty cho phép các khách hàng
tích lũy điểm thưởng Mỗi công ty tham dự chương trình quyết định khi nào và bao nhiều điểm thưởng sẽ chuyển khi khách hàng trả giá Những điểm thưởng tích lũy được có thể dùng để mua các dịch vụ cụ thể từ một trong các công ty tham gia chương trình
Để ghi lại điểm thưởng một khách hàng có được, mọi khách hàng thành viên
được kết hợp với một tài khoản LoyaltyAccount Có 2 loại giao dịch đối với tài khoản
này Thứ nhất là các giao dịch trong đó khách hàng nhận được điểm thưởng Trong mô
hình các giao dịch này được biểu diễn bằng một lớp con Earning của lớp Transaction
Thứ hai là các giao dịch trong đó khách hàng tiêu tốn điểm thưởng Trong mô hình các
giao dịch loại này được biểu diễn bằng lớp con Burning
Ngoài ra, căn cứ vào các dịch vụ đã sử dụng và lượng tiền chi trả mà khách hàng có thể được xét lên khách hàng “vàng” Khi đó khách hàng sẽ được sử dụng ưu đãi các dịch vụ mức độ cao hơn Để quản lý các cấp độ dịch vụ khác nhau dùng lớp
ServiceLevel Một ServiceLevel được chương trình Loyalty định nghĩa và mỗi khách
2.4 Ngữ cảnh của các biểu thức OCL
2.4.1 Mô hình kết hợp
OCL dựa trên các kiểu ( lớp, loại dữ liệu,…) được định nghĩa trong một mô hình UML Do đó sử dụng OCL bao gồm việc sử dụng một số thành phần của UML Các biểu thức OCL có thể bao gồm một số biểu đồ UML, thông thường chỉ biểu đồ lớp được dùng
Một mô hình phải là một thực thể nhất quán Trong một mô hình, quan hệ giữa các thực thể trong hai biểu đồ phải dễ hiểu Tương tự với quan hệ giữa các biểu thức (
Trang 23trong OCL) mà không gắn với các biểu đồ hay các thực thể trong biểu đồ Có thể biểu diễn quan hệ này bằng hai cách Một là các biểu thức gắn với các thực thể cụ thể chỉ
có các hàm cụ thể Ví dụ: một biểu thức định nghĩa một thuộc tính mới gắn với một lớp, giao diện hay kiểu dữ liệu Hai là thực thể mô hình UML mà có một biểu thức được gắn vào xác định rõ các thực thể khác và có thể được tham chiếu Ví dụ: một biểu thức gắn với một lớp, tất cả các thuộc tính, kết hợp và phép toán truy vấn của lớp
đó được dùng
Liên kết giữa một thực thể trong mô hình UML và một biểu thức OCL được gọi
là định nghĩa ngữ cảnh của biểu thức OCL đó
2.4.1.1 Ngữ cảnh của một biểu thức OCL
Ngữ cảnh một biểu thức OCL chỉ ra thực thể trong đó biểu thức OCL được định nghĩa Thông thường ngữ cảnh là một lớp, giao diện, kiểu dữ liệu hay thành phần của biểu đồ Hoặc đôi khi có thể là một thao tác và hiếm khi là một thể hiện Ngữ cảnh luôn là một thành phần cụ thể được định nghĩa trong biểu đồ UML
Các biểu thức OCL có thể đi kèm trong trong các biểu đồ trong mô hình, cũng
có thể được viết trong các file text riêng
Trong mô hình định nghĩa ngữ cảnh được chỉ ra bởi một đường nhiều dấu chấm liên kết thành phần mô hình và biểu thức OCL :
Hình 4 Định nghĩa ngữ cảnh trong mô hình UML
Trang 24Khi biểu thức OCL được viết trong một file text riêng, định nghĩa ngữ cảnh
được viết theo khuôn dạng: từ khóa context theo sau là tên của kiểu VD:
inv: participants.cards.Membership.includes( self )
Có thể có hơn một biểu thức với mỗi ngữ cảnh và tùy theo ngữ cảnh mà biểu thức OCL có các chức năng khác nhau
2.4.2 Các lớp và các kiểu khác
Khi ngữ cảnh là một kiểu, ví dụ một lớp, giao diện, kiểu dữ liệu hay thành phần ( thuộc tính, thao tác truy vấn, trạng thái, kết hợp) các biểu thức thuộc một trong các dạng:
2.4.2.1 Các bất biến
Bất biến là một ràng buộc luôn đúng cho một đối tượng trong toàn bộ thời gian tồn tại của đối tượng đó Các bất biến thường biểu diễn các quy tắc gán cho các đối tượng thực sau khi các đối tượng phần mềm được mô hình hóa Một bất biến được gắn với một mô hình có nghĩa là khi bất biến bị phá vỡ thì mô hình sẽ lỗi
Để chỉ một biểu thức là một bất biến, sau khai báo ngữ cảnh là từ khóa inv, tên
tùy chọn, dấu : và biểu thức Ví dụ :
context Customer
inv myInvariant23: self.name = 'Edward'
Trong ví dụ trên bất biến được đặt tên là myInvariant23, chỉ ra ràng buộc tất cả thể hiện của lớp Customer có tên là Edward
2.4.2.2 Định nghĩa các thuộc tính hay phương thức
Các thuộc tính hay phương thức có thể được định nghĩa bằng một biểu thức OCL Định nghĩa một thuộc tính hay phương thức có nghĩa là mọi thể hiện của ngữ cảnh nhận thuộc tính hay phương thức được định nghĩa
Trang 25Để chỉ ra biểu thức là định nghĩa, sau khai báo ngữ cảnh là từ khóa def , dấu hai
chấm: và biểu thức Ví dụ :
context Customer
def: initial : String = name.substring(1,1)
context CustomerCard
def: getTotalPoints( d: Date ) : Integer =
transactions->select( date.isAfter(d) ).points->sum()
Trong trường hợp định nghĩa thuộc tính, tên và loại của thuộc tính phải được chỉ ra, theo sau là dấu = và giá trị gán cho thuộc tính
Tất cả các phương thức định nghĩa trong OCL là các thao tác truy vấn Tên, các tham số ( gồm cả kiểu dữ liệu) và giá trị trả lại phải được đưa ra
2.4.3 Các thuộc tính và các đầu mút của liên kết
2.4.3.1 Các quy tắc dẫn xuất
Một biểu thức có ngữ cảnh là một thuộc tính hay một quy tắc kết hợp có thể được dùng như một quy tắc dẫn xuất Một quy tắc dẫn xuất chỉ ra giá trị của một thành phần của ngữ cảnh phải luôn bằng một giá trị được đưa ra bởi quy tắc
Để chỉ ra biểu thức là một quy tắc dẫn xuất, khai báo ngữ cảnh bao gồm tên của
thuộc tính hay đầu kết hợp, từ khóa derive, dấu hai chấm : như ví dụ sau Mức dịch vụ
trên thẻ của khách hàng luôn bằng cấp độ hiện tại của khách hàng đó :
context CustomerCard::myLevel : ServiceLevel
derive: Membership.currentLevel
2.4.3.2 Giá trị khởi tạo
Giá trị khởi tạo của một thuộc tính hay quy tắc kết hợp có thể đưa ra bởi một biểu thức OCL Một giá trị khởi tạo là giá trị mà thuộc tính hay quy tắc kết hợp nhận được ngay khi thể hiện của ngữ cảnh được tạo ra Sau khai báo ngữ cảnh dùng từ khóa
init, tên thuộc tính và biểu thức đưa ra giá trị khởi tạo Ví dụ:
context CustomerCard::transactions : Set( Transaction )
Trang 26ra Một giá trị khởi tạo chỉ nhận ngay tại thời điểm tạo thể hiện ngữ cảnh Sau đó, thuộc tính có thể nhận giá trị khác tại các thời điểm khác
2.4.4 Các phương thức
2.4.4.1 Các điều kiện trước và điều kiện sau
Có hai cách trong đó các biểu thức được dùng cho các phương thức là các điều kiện trước và sau ( 2 dạng của các ràng buộc) Một điều kiện trước là một biểu thức logic phải đúng tại thời điểm khi phương thức bắt đầu thực thi Một điều kiện sau là một biểu thức logic phải đúng tại thời điểm phương thức kết thúc thực thi Một điều kiện trước chỉ rõ biểu thức phải nhận đúng, nếu không thao tác sẽ không được thực hiện Ý nghĩa của điều kiện sau là chỉ biểu thức phải đúng, nếu không thao tác đã thực hiện không chính xác
Ngữ cảnh được định nghĩa bởi từ khóa context, tiếp đến là tên của kiểu chứa
thao tác, dấu hai chấm :, toàn bộ phép toán ( gồm tên, tất cả tham số và kiểu tham số, giá trị trả về) Thường thì toàn bộ phép toán được định nghĩa trong biểu đồ lớp UML
Tiếp sau định nghĩa ngữ cảnh là các dòng- gán nhãn với từ khóa pre và post-
bao gồm các điều kiện trước và sau Cú pháp chung:
context Type1::operation(arg : Type2) : ReturnType
2.4.4.2 Phần thân của các phép toán truy vấn
Các phép toán truy vấn có thể được định nghĩa đầy đủ bằng cách chỉ ra kết quả của phép toán trong một biểu thức đơn Sau khi định nghĩa các phép toán truy vấn chưa có hiệu lực cho đến khi các phép toán được thực hiện
Ngữ cảnh khai báo tương tự đối với trường hợp điều kiện trước và sau Thay vì
dùng từ khóa pre hay post, từ khóa body được dùng, tiếp là đến biểu thức Ví dụ :
context CustomerCard::getTransactions(from : Date, until: Date ) : Set(Transaction)
body: transactions->select( date.isAfter( from ) and
date.isBefore( until ) )
Trang 272.4.5 Các biểu thức trong các biểu đồ hành vi
2.4.5.1 Các thể hiện
Một biểu đồ tương tác chỉ ra chu kỳ sống của các thể hiện Trong một biểu đồ hoạt động, số các hoạt động có thể được thực hiện bởi một thể hiện cụ thể Các biểu thức OCL có thể được dùng để mô tả các thể hiện và quan hệ của chúng Ngữ cảnh của các biểu thức đó chính là biểu đồ thực hiện các biểu thức
2.4.5.2 Các điều kiện
Một thông điệp trong một biểu đồ tuần tự hay cộng tác có thể có một điều kiện đính kèm để quyết định việc thông điệp được gửi đi Điều kiện này có thể viết như một biểu thức OCL Trong trường hợp này, biểu thức OCL được gắn với một thể hiện, không gắn với một kiểu
Các điều kiện cũng có thể là một phần của các biểu đồ hoạt động Khi đó ngữ cảnh là các điểm quyết định
2.4.5.3 Các giá trị tham số thực
Các thông điệp trong các biểu đồ cộng tác và tuần tự có thể có các tham số Do một thông điệp mô tả một phương thức có các tham số là các giá trị thực Có thể chỉ ra giá trị thực của tham số bằng một biểu thức OCL Ngữ cảnh của biểu thức khi đó là thông điệp Một thông điệp tới một đối tượng trong một biểu đồ tương tác tương ứng với một phương thức trong kiểu của đối tượng đích
Các hành động trong biểu đồ trạng thái và biểu đồ hoạt động cũng có thể có các tham số giá trị thực
Trang 28(có tên gọi Liskov's Substitution) được phát biểu: bất cứ một thể hiện của một lớp được
tạo ra, nó luôn có thể thay thế một thể hiện của bất kỳ lớp con của nó Các biểu thức OCL tuân theo nguyên tắc này
2.4.7.1 Hệ quả cho các bất biến
Các bất biến trong các lớp cha phải luôn áp dụng cho các lớp con Các lớp con
có thể làm chặt bất biến hơn Quy tắc tổng quát cho các bất biến được phát biểu: Một bất biến cho một lớp cha được bởi các lớp con của nó thừa kế Một lớp con có thể làm chặt bất biến hơn nhưng không được làm bất biến yếu đi
Hình 5 Cây thừa kế của ví dụ minh họa
Trong mô hình trên có thể định nghĩa lớp cha Stove một bất biến : nhiệt độ của
nó không được lớn hơn 200 độ C
context Stove
inv: temperature <= 200
Sẽ rất nguy hiểm nếu một lớp con ElectricStove có thể vượt giới hạn nhiệt độ
đó Ví dụ , giả sử ElectricStove có thể có nhiệt độ không vượt quá 300 độ C:
context ElectricStove
inv: temperature <= 300
Khi đó việc dùng ElectricStove sẽ không đảm bảo an toàn ở nơi nào mà Stove
được dùng Nếu tại một nơi mà nhiệt độ an toàn báo động hoản hoạn là 250 độ C, có
thể đặt một Stove ở đó Nhưng nếu đặt một Stove tại đó và Stove trở thành
ElectricStove, nơi đó có thể bị đặt báo động có hỏa hoạn
Trong một số trường hợp, nguyên tắc Liskov’s Substitution cũng có những hạn
chế Các lớp con có thể thay đối các phương thức lớp cha và thêm vào các phương thức hay thuộc tính, khi đó các bất biến của lớp cha có thể được thay đổi để phù hợp
Trang 29với sự biến đổi đó Việc một bất biến trên một lớp cha có cần phải thay đối hay không khi một lớp con được thêm vào phụ thuộc vào nội dung của bất biến
2.4.7.2 Các hệ quả cho các điều kiện trước và sau
Khi một phương thức được định nghĩa lại trong một lớp con, một điều kiện trước có thể bị làm yếu đi nhưng không được làm chặt hơn Ngược lại, một điều kiện
sau có thể chặt hơn, không được yếu đi Ví dụ: định nghĩa phương thức open() cho lớp
Stove:
context Stove::open()
pre : status = StoveState::off
post: status = StoveState::off and isOpen
Biểu thức trên có nghĩa là có thể mở một Stove khi trạng thái của nó là off Sau khi đã mở, trạng thái mong muốn là off và biến isOpen có giá trị true Giả sử lớp con
ElectricStove định nghĩa lại phương thức open() với các điều kiện trước và sau khác:
mà Stove có thể mở Để đảm bảo một ElectricStove có thể thay thế một Stove tiền điều
kiện khi định nghĩa lại open() không được chặt hơn
Điều kiện sau của open() khi định nghĩa lại bị yếu đi vì điều kiện status=
StoveState::off bị loại bỏ Kết quả là ElectricStove không thực hiện như một Stove (
sau khi mở Stove ở trạng thái off)
2.5 Các thành phần OCL cơ bản
Các thành phần cơ bản được dùng để viết các ràng buộc và không tham chiếu tới các thành phần trong mô hình UML
2.5.1 Các biểu thức, kiểu và giá trị
Trong OCL, mỗi giá trị, là một đối tượng, một thể hiện thành phần hay một giá trị dữ liệu có một kiểu nhất định, định nghĩa các phương thức có thể áp dụng cho đối tượng Các kiểu trong OCL được chia làm các nhóm:
2.5.1.1 Các kiểu định nghĩa trước
Được định nghĩa trong thư viện chuẩn bao gồm :
Trang 30♦ Các kiểu cơ bản:gồm các kiểu dữ liệu số nguyên, số thực, xâu ký tự và logic ( tương tự các ngôn ngữ lập trình.)
♦ Các kiểu tập hợp
2.5.1.2 Các kiểu do người dùng định nghĩa
OCL phân biệt giữa kiểu đối tượng và kiểu giá trị Kiểu giá trị định nghĩa các thể hiện không bao giờ thay đổi VD số nguyên 1 có giá trị không đổi Ngược lại kiểu đối tượng định nghĩa các thể hiện có thể thay đối giá trị VD một thể hiện của lớp
Person có thể thay đổi giá trị thuộc tính name Kiểu định nghĩa trước là kiểu giá trị còn
kiểu người dùng định nghĩa là kiểu đối tượng Các kiểu dữ liệu của UML, gồm các kiểu liệt kế cũng là kiểu giá trị Các giao diện, thành phần, lớp của UML là kiểu đối tượng
2.5.2 Các kiểu cơ sở và các toán tử
2.5.2.1 Kiểu boolean
Biến kiểu logic nhận một trong hai giá trị: true hay false Các phép toán định
nghĩa trên kiểu dữ liệu:
Bảng 3 Các phép toán định nghĩa trên kiểu dữ liệu boolean
Các toán tử trong OCL đều phổ biến trong các ngôn ngữ lập trình trừ toán tử
implies Phép toán này trả lại kết quả true nếu toán hạng thứ nhất có giá trị true và
toán hạng thứ hai cũng có giá trị true hoặc toán hạng thứ nhất có giá trị false
Trang 31Xét một VD của lớp Service từ ví dụ R & L ở trên Kết quả của biểu thức sau có giá trị true nếu một dịch vụ cung cấp điểm thưởng thì khách hàng không thể dùng
điểm thưởng để trả cho dịch vụ đó:
context Service
inv: self.pointsEarned > 0 implies not (self.pointsBurned = 0)
Một toán tử khác của kiểu boolean là if-then-else, có dạng:
if < biểu thức logic OCL>
then < biểu thức OCL>
else < biểu thức OCL>
endif
2.5.2.2 Kiểu số nguyên và số thực
Kiểu số nguyên và số thực trong OCL cũng giống như trong các ngôn ngữ lập trình Các toán tử chuẩn :
Bảng 4 Các toán tử chuẩn kiểu số nguyên và số thực
Trang 32giá trị lớn nhất a và b a.max(b) số nguyên hay số thực
giá trị nhỏ nhất a và b a.min(b) số nguyên hay số thực
2.5.2.3 Kiểu dữ liệu xâu ký tự
Cũng giống như các ngôn ngữ lập trình, kiểu dữ liệu xâu ký tự được viết trong
cặp dấu nháy ‘’ Các toán tử gồm có: toUpper, toLower, size, substring, concat:
Bảng 5 Các toán tử kiểu dữ liệu xâu ký tự
Toán tử Biểu thức Kiểu kết quả
VD:
'Anneke'.size() = 6
('Anneke' = 'Jos') = false
'Anneke '.concat('and Jos') = 'Anneke and Jos'
'Anneke'.toUpper() = 'ANNEKE'
'Anneke'.toLower() = 'anneke'
'Anneke and Jos'.substring(12, 14) = 'Jos'
Trang 332.5.3 Các quy tắc ưu tiên
Trong trường hợp nhiều toán tử đi với nhau cần có quy tắc qui định độ ưu tiên của các toán tử Bảng các toán tử sau từ trên xuống dưới sắp theo thứ tự giảm dần độ
ưu tiên toán tử Để an toàn, có thể dùng cặp dấu ngoặc () để chỉ định độ ưu tiên một cách rõ ràng:
Bảng 6 Độ ưu tiên các toán tử
::
@pre , ->, ^ -, not
thuộc tính nowOfDate là một thuộc tính của lớp:
context CustomerCard
inv: goodThru.isAfter( Date::now )
Trang 34Trường hợp các phương thức hay thuộc tính không thuộc lớp trong biểu thức OCL trước tên phương thức hay thuộc tính là dấu chấm ( ) Tuy nhiên có một hạn chế trong OCL: các phương thức có thể trả lại giá trị nhưng không được thay đổi trạng thái của bất kỳ đối tượng nào ( hay còn gọi là phương thức truy vấn) Theo các đặc tả
UML, mỗi phép toán có nhãn logic isQuery Nếu nhãn có giá trị true, phép toán không
có tác dụng thay đổi đối tượng và có thể dùng trong các biểu thức OCL
2.6.2 Các kết hợp và kết tập
Một đặc điểm khác của kiểu người dùng định nghĩa là có thể dùng bên trong OCL dẫn xuất từ các kết hợp ( hoặc kết tập) trong mô hình lớp Các kết hợp có một số đầu mút, mỗi đầu có một bản số, có thể có tên ( tên vai trò) gắn với lớp tham gia kết hợp ( kết tập)
Các đầu mút kết hợp ( kết tập) có thể được dùng để điều hướng từ một đối tượng trong hệ thống đến một đối tượng khác Nếu tên của đầu kết hợp ( kết tập) thiếu,
có thể dùng tên của kiểu kết nối thay thế Nếu dùng tên kiểu mà nhập nhằng thì bắt buộc phải có mô tả của tên vai trò
Xét trong ví dụ R & L:
Hình 6 Ví dụ điều hướng trong kết hợp ( kết tập)
Lớp Customer có hai điều hướng programs và cards Lớp CustomerCard có một điều hướng tên owner, lớp LoyaltyProgram có một điều hướng tên customer
Các điều hướng trong OCL được coi như các thuộc tính Dấu chấm (.) dùng để tham chiếu tới các thuộc tính cũng được dùng để tham chiếu tới các điều hướng Trong một kiểu, tất cả tên ( của thuộc tính hay điều hướng) đều phải duy nhất, tránh sự nhập nhằng giữa tên các thuộc tính và điều hướng
Kiểu của một điều hướng có thể là kiểu người dùng định nghĩa hoặc là một tập các kiểu người dùng định nghĩa Nếu bản số ở đầu kết hợp là 1, kiểu kết quả là kiểu người dùng định nghĩa nối với đầu kết hợp Nếu bản số lớn hơn 1, kết quả có kiểu là một tập hợp Các thành phần trong tập hợp phải tuân theo kiểu người dùng định nghĩa
Trang 35nối với đầu kết hợp Trong ví dụ trên kiểu kết quả của điều hướng owner từ
CustomerCard là một kiểu người dùng định nghĩa Customer Kiểu kết quả của cả programs và cards từ Customer là các tập hợp
Trong ví dụ hình trên có thể định nghĩa một bất biến dùng điều hướng owner từ ngữ cảnh CustomerCard Vì biểu thức OCL này cho kết quả một giá trị của kiểu
Customer, tất cả các thuộc tính và phương thức trong Customer có thể xuất hiện trong
Hình 7 Ví dụ lớp kết hợp
Trong hình MemberShip là một lớp kết hợp Lớp này có ba điều hướng:
programs của kiểu LoyaltyProgram, participants của kiểu Customer, và currentLevel
của kiểu ServiceLevel Bất biến sau phát biểu một mức dịch vụ thực sự của một thành viên phải luôn là một mức dịch vụ của chương trình Loyalty chứa thành viên đó:
Trang 36context Membership
inv: programs.levels->includes( currentLevel )
Cũng có thể điều hướng từ lớp kết hợp Customer và LoyaltyProgram tới
Membership Do lớp kết hợp không có tên vai trò, tên của điều hướng là tên của lớp
kết hợp
Bản số tại các đầu mút kết hợp sẽ quyết định kiểu của biểu thức Nếu một ngữ cảnh nào đó bản số lớn hơn 1, điều hướng tới lớp kết hợp sẽ cho kết quả một tập hợp các thể hiện lớp kết hợp Ngược lại, điều hướng sẽ cho kết quả một thể hiện lớp kết
hợp Ví dụ, điều hướng từ Customer tới MemberShip sẽ cho kết quả là giá trị kiểu tập hợp Set(LoyaltyProgram)
Bất biến sau cũng phát biểu tương tự bất biến ở trên, nhưng là từ ngữ cảnh của
LoyaltyProgram: tập các mức dịch vụ phải chứa tất cả các mức của tất cả các thành
viên Chú ý rằng từ ngữ cảnh LoyaltyProgram, Membership.currentLevel là một kiểu
Bag(ServiceLevel) Do đó dùng phép toán includesAll thay cho includes:
context LoyaltyProgram
inv: levels->includesAll( Membership.currentLevel )
2.6.3 Các kiểu liệt kê
Một kiểu liệt kê là một kiểu người dùng định nghĩa đặc biệt thường được dùng như một kiểu cho các thuộc tính Nó được định nghĩa bên trong biểu đồ lớp UML, dùng kiểu nguyên mẫu liệt kê, như trong hình sau:
Hình 8 Ví dụ kiểu liệt kê
Các giá trị được định nghĩa trong <<enumeration>> có thể được dùng như các
giá trị trong một biểu thức OCL
Ở VD trên lớp Customer thuộc tính isMale được thay đối thành gender Bất
biến sau phát biểu các khách hàng nam tên phải bắt đầu bằng ‘Mr.’ :
context Customer
inv: gender = Gender::male implies title = 'Mr.'
Chỉ có hai toán tử dùng cho các giá trị liệt kê là toán tử = và <>
Trang 372.7 Kiểu tập hợp
2.7.1 Các kiểu tập hợp
Các hệ thống hướng đối tượng thường thao tác trên các tập đối tượng Vì bản số các kết hợp hiếm khi là 1-1, hầu hết các kết hợp định nghĩa một quan hệ giữa một đối tượng và một tập các đối tượng khác Để thao tác với các tập đó, OCL định nghĩa trước một số các kiểu tương ứng với các tập hợp
Trong OCL, có 5 kiểu tập hợp Có 4 kiểu cụ thể: Set, OrderedSet, Bag,
Sequence Kiểu còn lại là kiểu trìu tượng- Collection, là kiểu cha của bốn kiểu kia dùng
để định nghĩa các toán tử phổ biến cho tất cả các kiểu tập hợp
♦ Set: một tập các thể hiện của một kiểu của OCL Các phần tử trong Set không
có sự lặp lại và không có tính thứ tự
♦ OrderedSet: một tập các phần tử có tính thứ tự
♦ Bag: tập các phần tử không có thứ tự và cho phép lặp lại
♦ Sequence: tập các phần tử có thứ tự và cho phép lặp lại
Chú ý rằng thứ tự ở đây là thứ tự mà các phần tử được lưu chứ không phải thứ
Set { 'apple' , 'orange', 'strawberry' }
OrderedSet { 'apple' , 'orange', 'strawberry', 'pear' }
Trang 382.7.1.2 Các biểu thức kiểu tập hợp
Khi một kiểu của một phần tử là một tập hợp, biểu diễn bằng cách dùng các từ
Set, OrderedSet, Bag, Sequence và kiểu của các phần tử của tập hợp giữa cặp dấu
Tất cả các kiểu tập hợp được định nghĩa là các kiểu giá trị, do đó giá trị của một thể hiện không thể thay đổi Các phép toán tập hợp không thay đổi một tập hợp, nhưng
có thể cho kết quả là một tập hợp mới
Bất biến sau từ mô hình R & L, dùng phép toán chuẩn size(), phát biểu rằng số người tham dự vào chương trình Loyalty phải nhỏ hơn hoặc bằng 10.000:
context LoyaltyProgram
inv: self.participants->size() < 10000
2.7.1.4 Các thể hiện được đối xử như là các tập hợp
Do cú pháp của các phép toán tập hợp khác với các phép toán kiểu người dùng định nghĩa nên có thể dùng một thể hiện đơn như một tập hợp Tập hợp này được xem như một tập thể hiện chỉ có một phần tử Ví dụ , trong mô hình R & L, các ràng buộc
sau cho kết quả là giá trị của phép toán người dùng định nghĩa isEmpty() và một thể hiện của LoyaltyAccount:
Trang 39Biểu thức có giá trị true nếu liên kết từ thể hiện của MemberShip tới một thể hiện của LoyaltyAccount rỗng, có nghĩa là MemberShip không gắn với
LoyaltyAccount
2.7.1.5 Tập hợp các tập hợp
Các tập hợp trong OCL là phẳng, nghĩa là nếu đặt một tập hợp vào bên trong một tập hợp khác, các phần tử sẽ được đưa ra ngoài để thành một tập hợp kết quả Ví
dụ, {set{1,2}, set{3,4}} trở thành set{1,2,3,4}
2.7.2 Các phép toán trên các kiểu tập hợp
Các phép toán thường gặp trên các kiểu tập hợp được liệt kê trong bảng sau
Các phép toán đó được định nghĩa bởi kiểu cha trìu tượng Collection:
Bảng 7 Các phép toán trên kiểu tập hợp
count( đối tượng ) Trả lại số các sự kiện của đối tượng trong tập hợp
excludes( đối tượng) Có giá trị true nếu đối tượng không là một phần tử của
tập hợp excludesAll( tập hợp) Có giá trị true nếu tất cả phần tử của tập hợp ( tham
số) không ở trong tập hợp hiện tại includes( đối tượng ) Có giá trị true nếu đối tượng là một phần từ của tập
hợp includeAll( tập hợp ) Có giá trị true nếu tất cả các phần tử của tập hợp (
tham số) có trong tập hợp hiện tại isEmpty() Có giá trị true nếu tập hợp không chứa phần tử nào
notEmpty() Có giá trị true nếu tập hợp chứa ít nhất một phần tử
size() Trả lại số các phần tử trong tập hợp
sum() Cộng tổng tất cả các phần tử trong tập hợp Các thành
phần phải là một kiểu hỗ trợ phép cộng ( như số nguyên hay số thực)
Các ví dụ sau dùng các phép toán includes và includesAll Bất biến phát biểu
mức dịch vụ của mỗi thành viên phải là một trong các mức của chương trình mà thành viên đó tham dự:
Trang 40context Membership
inv: programs.levels ->includes(currentLevel)
Bất biến sau ràng buộc các dịch vụ có sẵn cho một mức dịch vụ được cung cấp
bởi một đối tác của chương trình Loyalty:
context ServiceLevel
inv: program.partners
->includesAll(self.availableServices.partner)
2.7.2.1 Các phép toán biến đổi
Một số phép toán định nghĩa trên tất cả các kiểu tập hợp nhưng có một số chỉ áp
dụng cho một hay một số kiểu Bảng sau chỉ ra khái quát về các phép toán biến đổi
trên bốn kiểu tập hợp Dấu X có nghĩa là phép toán đó được định nghĩa cho kiểu tương
ứng, dấu nối – chỉ ra phép toán không được định nghĩa cho kiểu đó:
Bảng 8 Các phép toán biến đổi trên kiểu tập hợp
intersection ( 2 đối tượng cộng
tác)