Mô hình hóa cấu trúc Modeling structure Trong VDM, mô hình bao gồm việc mô tả dữ liệu trên các phương thức và chức năng của hệ thống mà nó được thực thi.. Ngôn ngữ VDM++ mở rộng của VDM
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Trang 2TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS NGUYỄN VĂN TĂNG
Hà Nội – 2015
Trang 4LỜI CAM ĐOAN
Tôi xin cam đoan những kết quả trong luận văn này là do tôi nghiên cứu, tổng hợp và thực hiện Toàn bộ những nội dung trong luận văn là kết quả của chính cá nhân tôi hoặc được tổng hợp từ những nguồn tài liệu khác nhau Tất cả các nguồn tài liệu đều có nguồn gốc rõ ràng và trích dẫn đầy đủ
Tôi xin hoàn toàn chịu trách nhiệm với lời cam đoan của mình Nếu có gì sai trái, tôi xin chịu mọi hình thức kỷ luật theo quy định
Hà Nội, 15 tháng 10 năm 2015
Học viên
Nguyễn Xuân Tùng
Trang 5MỤC LỤC
LỜI CẢM ƠN 1
LỜI CAM ĐOAN 2
MỤC LỤC 3
DANH MỤC CÁC KÝ HIỆU, TỪ VIẾT TẮT 5
MỞ ĐẦU 9
CHƯƠNG 1 – GIỚI THIỆU CHUNG 10
1.1 Giới thiệu về VDM 10
1.1.1 Khái niệm 10
1.1.2 Các loại VDM 11
1.1.3 VDM ++ 11
1.1.3.1 Cấu trúc class 11
1.1.3.3 Hàm khởi tạo (Constuctors) 13
1.1.3.4 Biến thể hiện (Instance Variables) 13
1.1.3.6 Hàm và Phương thức 20
1.1.3.7 Tính đồng thời (Concurrency) 23
1.2 Công cụ hỗ trợ VDM++ 23
1.2.1 Giới thiệu 23
1.2.2 Modelio 24
1.2.3 Overture 27
CHƯƠNG 2 – TỔNG QUAN VỀ DỰ ÁN 40
2.1 Giới thiệu về dự án 40
2.1.1 Hiện trạng nghiệp vụ 40
2.1.2 Mục đích xây dựng hệ thống IMP 40
2.2 Hệ thống IMP 41
2.2.1 Nền tảng hệ thống 41
2.2.2 Luồng nghiệp vụ hệ thống 43
2.3 Quy trình phát triển dự án 45
2.3.1 Quy trình phát triển hiện tại 45
2.3.2 Đánh giá vấn đề của dự án 46
2.3.3 Giải pháp tổng thể 47
CHƯƠNG 3 – ÁP DỤNG QUY TRÌNH MỚI VÀO DỰ ÁN IMP 52
Trang 63.1 Mô hình hóa thực thể dữ liệu 52
3.1.1 Mô hình hóa kiểu dữ liệu SQL 52
3.1.2 Mô hình hóa cấu trúc bảng 53
3.1.3 Mô hình hóa bảng dữ liệu 55
3.1.4 Mô hình hóa cơ sở dữ liệu 56
3.2 Mô hình hóa đặc tả hệ thống 56
3.2.1 Đặc tả kiến trúc 56
3.2.2 Đặc tả nghiệp vụ 57
3.3 Kiểm thử mô hình hóa 61
3.4 Kết quả thực nghiệm 63
3.5 Kinh nghiệm thực tiễn 66
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 68
TÀI LIỆU THAM KHẢO 69
Trang 7DANH MỤC CÁC KÝ HIỆU, TỪ VIẾT TẮT
Method
Phương thức phát triển Vienna
5 ERD Entity-Relation Diagram Lực đồ quan hệ thực thể
6 IDE Integrated Development
Environment
Môi trường phát triển tích hợp
7 RD Requirement Definition Đặc tả yêu cầu
12 MVC Model View Controller Một mẫu kiến trúc phần
mềm trong kỹ thuật kỹ sư phần mềm
13 IMP Industrial Maintenance
15 CT Combinatorial Testing Kiểm tra tổ hợp
Trang 8DANH MỤC HÌNH VẼ
Hình 1 1 Cấu trúc class trong VDM++ 12
Hình 1 2 Cú pháp khai báo lớp thừa kế 13
Hình 1 3 Cú pháp khai báo biến thể hiện 13
Hình 1 4 Cú pháp khai báo tính bất biến 14
Hình 1 5 Ví dụ khai báo rằng buộc biến thể hiện bằng biểu thức INV 14
Hình 1 6 Ví dụ cài đặt hàm truy cập biến cục bộ 15
Hình 1 7 Khai báo kiểu Union 17
Hình 1 8 Cấu trúc khai báo kiểu product 17
Hình 1 9 Khởi tạo kiểu product 17
Hình 1 10 Cấu trúc khai báo kiểu dữ liệu bản ghi 18
Hình 1 11 Khởi tạo kiểu dữ liệu bản ghi 18
Hình 1 12 Cấu trúc lớp trong VDM++ 21
Hình 1 13 Cấu trúc khai báo hàm tường minh 21
Hình 1 14 Cấu trúc khai báo hàm không tường minh 21
Hình 1 15 Cấu trúc khai báo phương thức tường minh 22
Hình 1 16 Cấu trúc khai báo phương thức không tường minh 22
Hình 1 17 Cấu trúc khai báo phương thức ở mức trừu tượng 22
Hình 1 18 Cấu trúc khai báo phương thức dạng uỷ thác 23
Hình 1 19 Cú pháp khai báo đồng bộ đối tượng chia sẻ 23
Hình 1 20 Xuất biểu đồ UML sang định dạng UML trong Modelio 24
Hình 1 21 Lựa chọn xuất file trong Modelio 25
Hình 1 22 Kết quả xuất file UML 25
Hình 1 23 Menu chuyển đổi từ UML sang VDM 26
Hình 1 24 Danh sách các class sau khi import 26
Hình 1 25 Tạo mới dự án VDM++ trong Overture 29
Hình 1 26 Chọn loại dự án VDM 30
Hình 1 27 Nhập tên dự án VDM++ 31
Hình 1 28 Chọn các dự án cần tham chiếu 31
Hình 1 29 Danh sách thư viện Overture hỗ trợ 32
Hình 1 30 Hộp thoại cấu hình thực thi và gỡ lỗi 33
Hình 1 31 Hộp thoại cấu hình thực thi và gỡ lỗi 33
Hình 1 32 Giao diện gỡ lỗi 34
Hình 1 33 Khung nhìn gỡ lỗi 35
Hình 1 34 Khung nhìn biến thể hiện 36
Hình 1 35 Khung nhìn kiểm thử tổ hợp 36
Hình 1 36 Lựa chọn sinh mã Java 37
Hình 1 37 Menu xuất VDM++ sang UML 38
Hình 1 38 Kết quả xuất file uml 38
Trang 9Hình 1 39 Import file uml vào Modelio 39
Hình 2 1 Luồng nghiệp vụ hiện tại 40
Hình 2 2 Tổng quan yêu cầu chức năng của hệ thống 41
Hình 2 3 Chuyển đổi từ mô hình hệ thống độc lập sang mô hình tích hợp intrarmart 42 Hình 2 4 Các thành phần trong intramart 42
Hình 2 5 Kiến trúc MVC của struts 43
Hình 2 6 Luồng nghiệp vụ hệ thống 43
Hình 2 7 Luồng nghiệp vụ phê duyệt kế hoạch năm 44
Hình 2 8 Màn hình tạo kế hoạch tháng/chi tiết 44
Hình 2 9 Mô hình chữ V gồm 4 bước 45
Hình 2 10 Chi tiết công việc cần thực hiện trong từng công đoạn 45
Hình 2 11 Nguyên nhân của vấn đề tốn nhiều thời gian phát triển lại 46
Hình 2 12 Mô hình chữ V thêm giai đoạn mô hình hóa VDM++ 47
Hình 2 13 Chi tiết công việc bao gồm việc mô hình hóa bằng VDM++ 48
Hình 2 14 Phạm vi công việc của các nhóm vai trò trong dự án 50
Hình 3 1 Mô hình hóa kiểu dữ liệu SQL server 53
Hình 3 2 Mô hình hóa cấu trúc dữ liệu bảng Imp_Schedule_Annual 54
Hình 3 3 Mô hình hóa cấu trúc dữ liệu bảng Imp_Schedule_Annual_Pln_Detail 55
Hình 3 4 Mô hình hóa bảng Imp_Schedule_Annual và Imp_Schedule_Annual_Pln_Detail 55
Hình 3 5 Mô hình hóa cơ sở dữ liệu Imp 56
Hình 3 6 Lược đồ lớp trừu tượng trong Modelio 57
Hình 3 7 Lược đồ luồng nghiệp vụ xử lý tạo mới kế hoạch 58
Hình 3 8 Mô hình hóa lớp trừu tượng ScheduleAnnualModel 59
Hình 3 9 Mô hình hóa lớp cài đặt ScheduleAnnualModelImpl 60
Hình 3 10 Mô hình hóa lớp xử lý yêu cầu B0102ServiceController 61
Hình 3 11 Cài đặt unit test thiết kế lớp ScheduleAnnualModelImpl 62
Hình 3 12 Màn hình kiểm thử và kết quả kiểm thử lớp ScheduleAnnualModelImpl 63
Hình 3 13 Timeline của dự án trước và sau khi áp dụng quy trình mới 64
Hình 3 14 Lỗi có độ ưu tiên cao phát hiện khi thực hiện Modelling Test 65
Hình 3 15 Lỗi có độ ưu tiên trung bình phát hiện khi thực hiện Modelling Test 65
Hình 3 16 Lỗi có độ ưu tiên thấp phát hiện khi thực hiện Modelling Test 66
Trang 10DANH MỤC BẢNG
Bảng 1 1 Kiểu dữ liệu cơ bản của VDM 15
Bảng 1 2 Danh sách các phép toán trên kiểu dữ liệu cơ bản 16
Bảng 1 3 Các phép toán của kiểu Union 17
Bảng 1 4 Các phép toán của kiểu product 18
Bảng 1 5 Các phép toán của kiểu bản ghi 18
Bảng 1 6 Các phương thức kiểu dữ liệu tập hợp 19
Bảng 1 7 Các phương thức kiểu dữ liệu map 19
Bảng 1 8 Các phương thức kiểu dữ liệu map 20
Bảng 1 9 Danh sách cộng đồng người dùng Overture 27
Bảng 2 1 Định nghĩa mục đích của hành động 48
Bảng 2 2 Định nghĩa vai trò và trách nhiệm 50
Bảng 3 1 Kiểu dữ liệu SQL và kiểu dữ liệu VDM tương ứng 52
Bảng 3 2 Tổng hợp lỗi tài liệu thiết kế 64
Bảng 3 3 Phạm vi và quy mô dự án 64
Trang 11MỞ ĐẦU
Trong quy trình phát triển phần mềm, những giai đoạn đầu của dự án đóng vai trò quyết định sự thành công của dự án Thành công của dự án có nghĩa là đúng yêu cầu khách hàng, đúng thời gian và không vượt quá ngân sách Một trong những giai đoạn đó là giai đoạn thiết kế chi tiết hệ thống sau khi thống nhất yêu cầu của khách hàng Đầu ra của giai đoạn này là các tài liệu thiết kế chi tiết (thiết kế chi tiết chức năng, thiết kế cơ sở dữ liệu, thiết kế luồng xử lý dữ liệu, ), là đầu vào cho giai đoạn viết mã chương trình, hay nói cách khác là dựa vào tài liệu thiết kế, người lập trình sẽ xây dựng, phát triển hệ thống theo yêu cầu khách hàng, đảm bảo chất lượng (tính đúng đắn) thiết kế giúp cho dự án có thể đúng tiến độ, đúng yêu cầu và không làm phát sinh ngân sách Hiện tại, việc đảm bảo chất lượng tài liệu thiết kế chi tiết chủ yếu dựa vào trực quan, bằng cách sử dụng checklist đã được định nghĩa trước Điều này đôi lúc không phát hiện được hết những lỗi đặc tả tiềm ẩn và lỗi thời gian thực trong tài liệu thiết kế
Luận văn sẽ nghiên cứu về phương pháp đặc tả hình thức sử dụng VDM++, giúp phát hiện các vấn đề tiềm ẩn, các lỗi thời gian thực và phát hiện các lỗi thiết kế sớm khi áp dụng vào dự án cụ thể IMP Luận văn được cấu trúc như sau:
- Chương 1: Giới thiệu tổng quan về VDM và VDM++, cộng đồng phát triển
VDM Cung cấp thông tin về các công cụ hỗ trợ phát triển mô hình hóa bằng VDM++, với những tính năng nổi bật mà công cụ hỗ trợ
- Chương 2: Giới thiệu về yêu cầu hệ thống IMP, quy trình phát triển dự án hiện
tại, đánh giá những vấn đề của dự án và đưa ra những cải tiến trong quy trình với việc
sử dụng VDM++ trong quá trình thiết kế chi tiết
- Chương 3: Áp dụng quy trình mới với sự kết hợp sử dụng Overture và Modelio
vào việc thiết kế, mô hình hóa hệ thống IMP và đưa ra đánh giá kết quả, tổng hợp những nghiên cứu đạt được sau luận văn và đưa ra hướng phát triển tiếp theo
Trang 12CHƯƠNG 1 – GIỚI THIỆU CHUNG
1.1 Giới thiệu về VDM
1.1.1 Khái niệm
Phương pháp phát triển Vienna (Vienna Development Method) là một trong những phương pháp mô hình hóa hướng đối tượng lâu đời nhất cho việc phát triển phần mềm Nó bao gồm một nhóm các ngôn ngữ trên nền tảng toán học và các công
cụ hỗ trợ việc mô tả và phân tích mô hình hệ thống tại bước thiết kế Việc xây dựng và phân tích mô hình giúp cho việc nhận biết những đặc tả của hệ thống còn thiếu sót hoặc chưa rõ ràng, và đảm bảo một mức độ tin tưởng trong quá trình phát triển, đặc biệt là vấn đề an toàn và bảo mật VDM đã được ứng dụng nhiều trong công nghiệp, trong một số trường hợp, người sử dụng không phải là những chuyên gia trong các lĩnh vực chuyên nghiệp và logic Theo kinh nghiệm cho thấy, việc mô hình hóa sẽ làm tăng chi phí ở giai đoạn thiết kế, nhưng nó có thể giúp rút ngắn giai đoạn phát triển nhờ việc hạn chế công sức làm lại do những lỗi trong giai đoạn thiết kế [6]
Mô hình hóa cấu trúc (Modeling structure)
Trong VDM, mô hình bao gồm việc mô tả dữ liệu trên các phương thức và chức năng của hệ thống mà nó được thực thi Dữ liệu bao gồm việc nhập/xuất từ bên ngoài
và dữ liệu trạng thái bên trong Chức năng bao gồm các hoạt động có thể được gọi tại giao diện hệ thống cũng như các chức năng phụ, hỗ trợ việc thực hiện các hoạt động Trong chuẩn ISO, có một thông tin bổ sung về framework cho việc mô hình hóa – VDM-SL
Ngôn ngữ VDM++ mở rộng của VDM-SL, được dùng để hỗ trợ đặc tả hệ thống hướng đối tượng, và mô hình cấu trúc trong những định nghĩa class, mỗi class có những thành phần tương tự một đặc tả VDM-SL, với các biến trạng thái đóng vai trò của biến thể hiện và các hoạt động đóng vai trò là một phần của các phương thức
Mô hình hóa dữ liệu (Modeling data)
Các mô hình dữ liệu trong VDM được thành lập dựa trên các kiểu dữ liệu trừu tượng cơ bản cùng với một tập hợp các kiểu khởi tạo Các kiểu dữ liệu cơ bản bao gồm kiểu số (tự nhiên, số nguyên, số hữu tỉ và số thực) và kiểu ký tự Chú ý, trong nguyên tắc trừu tượng của VDM thì không xác định giá trị lớn nhất cho kiểu số hoặc kiểu số thực Nếu người dùng muốn xác định bởi yêu cầu của việc mô hình hóa, thì có thể xác định điều này bằng việc quy định tính bất biến (invariant) Bất biến là các biểu thức logic đại diện cho các điều kiện được tôn trọng bởi các tất cả các thành phần kiểu dữ liệu mà chúng đính kèm [6]
Trang 131.1.2 Các loại VDM
Phương thức phát triển Vienna (Vienna Development Method - VDM) được phát triển đầu tiên bởi IBM vào năm 1970, là một trong những phương pháp hình thức được thành lập lâu nhất VDM có 3 loại: VDM-SL (VDM Specification Language) một chuẩn ISO; VDM++ một mở rộng hướng đối tượng của VDM-SL; và mới đây thêm VDM-RT, một mở rộng của VDM++ để mô hình hóa những hệ thống nhúng phân tán thời gian thực VDM-RT là một ngôn ngữ mô hình hóa với những tập con có thể thực thi được sử dụng để miêu tả những hệ thống nhúng thời gian thực phân tán [9,1]
- VDM-SL: Đặc tả VDM-SL có cấu trúc rất đơn giản, đó là Module, mang tính
diễn tả bài toán bằng Structure Một module bao gồm một tập của types, constants, functions, operations và state (trạng thái) Diễn tả bài toán dạng module, một module bao gồm một tập của types, constants, functions, operations và state (trạng thái) Phù hợp với bài toán phân tích theo cấu trúc, theo module và cài đặt ngôn ngữ lập trình kiểu cấu trúc
- VDM++: Đặc tả VDM++ là mở rộng của VDM-SL có cấu trúc dựa trên class,
làm việc với diễn tả bài toán thông qua Class, hướng đối tượng Một class bao gồm một tập hợp của types, constants, functions, operations và state Phù hợp phân tích hướng đối tượng
- VDM-RT: Đặc tả VDM-RT là VDM++ với hệ thống có môi trường rằng buộc,
áp dụng vào hệ thống nhúng thời gian thực và hệ thống phân tán
Điểm khác biệt chính giữa VDM-SL và VDM++ là cách thức mà cấu trúc được
xử lý VDM-SL có một phần mở rộng mô-đun thông thường, trong khi đó VDM++ có một cơ chế cấu trúc hướng đối tượng truyền thống với các class và sự thừa kế [10]
1.1.3 VDM ++
Một mô hình VDM++ bao gồm một tập các class Một class mô tả một tập các đối tượng có các thành phần dùng chung như thuộc tính hoặc phương thức Mô tả class cung cấp một khuôn mẫu cho các đối tượng được tạo ra từ class đó Một số thành phần
sẽ được nhìn thấy bởi các đối tượng khác và một số thành phần chỉ được sử dụng bởi chính đối tượng đó, điều này được khai báo bằng cách sử dụng phạm vi truy cập [12]
1.1.3.1 Cấu trúc class
Cấu trúc của một class được mô tả như dưới đây Trong một class bao gồm nhiều khối, mỗi khối được bắt đầu bởi một từ khóa chỉ ra loại các thành phần trong khối đó Mọi thành phần được định nghĩa trong một khối được coi như một thành phần của class Các khối được mô tả như sau:
Biến thể hiện (Instance variables): mô hình trạng thái của một đối tượng.
Kiểu (Types): định nghĩa các kiểu dữ liệu dùng cho đối tượng.
Giá trị (Values): định nghĩa các hằng số.
Trang 14 Hàm (Functions): định nghĩa các hàm mà không tác động đến các biến.
Phương thức (Operations): định nghĩa các phương thức có thể thay đổi giá trị
các biến
Luồng (Threads): Đối tượng trong VDM++ có thể là chủ động (active) hoặc
thụ động (passive) Khi một đối tượng là chủ động, nó có 1 luồng để khai báo tính chủ động, đối tượng này sẽ được gọi khi bắt đầu một luồng xử lý
Ràng buộc đồng bộ (Synchronisation constraints): VDM++ hỗ trợ mô hình hóa
một hệ thống phần mềm đồng thời (concurrent software system), điều này có nghĩa là một đối tượng có thể tồn tại đồng thời và hoạt động song song Khối này xác định sự ràng buộc trong việc trao đổi giữa những đối tượng đồng thời được ràng buộc
Hình 1 1 Cấu trúc class trong VDM++
Giữa các lớp có những mối quan hệ kế thừa, lớp kế thừa được gọi là subclass và lớp được kế thừa được gọi là superclass Định nghĩa lớp kế thừa sẽ được mở rộng với các thành phần của lớp cha (được kế thừa) mà cho phép kế thừa bằng cách khai báo là public hoặc protected Một class có thể kế thừa một hoặc nhiều lớp Có một giới hạn trọng việc đa thừa kế là chỉ duy nhất một lớp cha có khai báo luồng Cấu trúc một lớp thừa kế như dưới đây:
Trang 15Hình 1 2 Cú pháp khai báo lớp thừa kế
1.1.3.2 Phạm vi truy cập (Access Modifier)
Mỗi khai báo thành phần bên trong một class có thể có một phạm vi truy cập Trong VDM++ có 3 loại phạm vi truy cập là: private, protected và public Phạm vi truy cập mặc định của tất cả các thành phần là private
Phạm vi truy cập không thể được giới hạn lại ở các lớp kế thừa Ví dụ, một lớp
kế thừa không thể ghi đè phạm vi truy cập của một phương thức ở lớp cha được khai báo public thành private
Static có thể được sử dụng để khai báo các biến độc lập với một thể hiện cụ thể của lớp Biến static có thể được truy cập thông qua tên class thay vì thông qua một thể hiện của class Một thành phần static (tĩnh) của class không cho phép các thành phần không phải static truy cập Trong VDM++ thì khối value và type mặc định là static
1.1.3.3 Hàm khởi tạo (Constuctors)
Mỗi class có thể có một số hàm khởi tạo Hàm khởi tạo được phân biệt với các hàm khác bằng tên class và kiểu trả về tương tự Việc trả về kết quả không cần phải rõ ràng và hàm khởi tạo sẽ được gọi khi một thể hiện của lớp được tạo mới
1.1.3.4 Biến thể hiện (Instance Variables)
Trạng thái của một đối tượng được mô hình hóa bằng ý nghĩa của các biến thể hiện Khối định nghĩa các biến thể hiện trong một class có định dạng như sau:
Hình 1 3 Cú pháp khai báo biến thể hiện
class class name
instance variables
instance variable definition 1;
instance variable definition 2;
instance variable definition n
end class name
class class name is subclass of sc1, sc2, , scn
end class name
Trang 16Tính đồng nhất của các thuộc tính được mô hình hòa là bất biến (invariant) trong VMD++ Trong trường hợp cần giới hạn giá trị cho các biến thể hiện hoặc quy định mối liên hệ giữa chúng thì VDM++ hỗ trợ việc khai báo rằng buộc đối với các giá trị của biến thể hiện Một định nghĩa bất biến theo ngay sau khai báo biến thể hiện, có cấu trúc như sau:
Hình 1 4 Cú pháp khai báo tính bất biến
Ví dụ, ta định nghĩa một class mô hình hóa một đối tượng người, với các thuộc tính là tên và tuổi Trong đó, tuổi phải đảm bảo rằng buộc là lớn hoặc bằng không tuổi
và không lớn hơn 99 tuổi Điều này có thể được định nghĩa như sau:
Hình 1 5 Ví dụ khai báo rằng buộc biến thể hiện bằng biểu thức INV
Thuộc tính bất biến này có hiệu lực tại mọi thời điểm đối với các thể hiện của lớp Mọi việc gán giá trị mới cho biến điều phải được kiểm tra thỏa mãn rằng buộc đã khai báo Bằng việc khai báo tính bất biến của các biến thể hiện, VDM++ đã cho phép
mô hình hóa các rằng buộc của các thuộc tính của hệ thống phần mềm trong quá trình thiết kế hệ thống
class class name
instance variables
instance variable definition 1;
instance variable definition 2;
instance variable definition n;
inv expression using the instance variables end class name
Trang 17Biến thể hiện chỉ có thể được truy cập bởi các thành phần trong class nó khai báo Để đọc hoặc thay đổi giá trị của biến thể hiện từ bên ngoài class, cần phải khai báo các phương thức truy cập Ví dụ, để lấy tên của một người, ta khai báo hàm GetName như sau:
Hình 1 6 Ví dụ cài đặt hàm truy cập biến cục bộ
1.1.3.5 Kiểu dữ liệu và định nghĩa kiểu
Trong VMD++ có 2 loại kiểu dữ liệu là: Kiểu dữ cơ bản và kiểu khởi tạo.
Kiểu cơ bản
Các kiểu cơ bản được liệt kê như bảng dưới đây:
Bảng 1 1 Kiểu dữ liệu cơ bản của VDM
Trang 18token mk_token ( )
Các phép toán trên kiểu dữ liệu cơ bản được liệt kê như bảng dưới đây:
Bảng 1 2 Danh sách các phép toán trên kiểu dữ liệu cơ bản
Trang 19Kiểu được khởi tạo (Constructed Types)
Các kiểu dữ liệu cơ bản có những hạn chế Điều này có thể gây khó khăn trong việc mô hình hóa mọi hệ thống mà không có khả năng miêu tả dữ liệu có cấu trúc, như: bản ghi, dữ liệu tập hợp hay sequences Các kiểu mô tả dữ liệu cấu trúc và tập hợp được xây dựng từ các kiểu cơ bản được gọi là kiểu khởi tạo Các kiểu khởi tạo
được sử dụng trong VDM ++ bao gồm: unions, products, bản ghi (records), kiểu tùy biến và kiểu tham chiếu.
Kiểu Union
Một kiểu union được hình thành từ nhiều kiểu thành phần khác nhau và chứa tất
cả giá trị của mỗi thành phần đó Một kiểu union được mô tả như sau:
Hình 1 7 Khai báo kiểu Union Các phương thức đối với kiểu union được mô tả trong bảng sau, “A” đại diện cho
mọi kiểu union
Bảng 1 3 Các phép toán của kiểu Union
Hình 1 8 Cấu trúc khai báo kiểu product Khởi tạo tuple sử dụng từ khóa mk_, cùng với một tập hợp các giá trị khác nhau trong dấu ngoặc đơn Khai báo như sau:
Hình 1 9 Khởi tạo kiểu product
type 1 | type 2 | type 3 | | type n
type 1 * type 2 * type 3 * * type n
mk_(value 1, value 2, value 3, , value n)
Trang 20Các phương thức của kiểu product T=T1* *Ti* *Tn
Bảng 1 4 Các phép toán của kiểu product
Kiểu bản ghi (Record)
Giống với kiểu product, kiểu record bao gồm các bộ dữ liệu của các kiểu dữ liệu khác nhau Tuy nhiên, một thành phần của record có thể được đặt tên Định nghĩa một kiểu record như sau:
Hình 1 10 Cấu trúc khai báo kiểu dữ liệu bản ghi Trong đó tag là tên kiểu, field là các phần tử của kiểu Và cũng giống như kiểu product, kiểu record được khởi tạo giá trị như sau:
Hình 1 11 Khởi tạo kiểu dữ liệu bản ghi
Các phương thức kiểu bản ghi (Record)
Bảng 1 5 Các phép toán của kiểu bản ghi
Trang 21Bảng 1 6 Các phương thức kiểu dữ liệu tập hợp
e not in set s1 Not membership A*setofA->bool
s1 union s2 Union set of A * set of A -> set of A s1 inter s2 Intersection set of A * set of A -> set of A s1\s2 Difference set of A * set of A -> set of A
s1 psubset s2 Proper subset setofA*setofA->bool
s1 <> s2 Inequality setofA*setofA->bool
d union s1 Distr union set of set of A -> set of A
d inter s1 Distr intersection set of set of A -> set of A
power s1 Finite power set set of A -> set of set of A
Các phương thức của kiểu Map
Bảng 1 7 Các phương thức kiểu dữ liệu map
m1 munion m2 Merge (map A to B) * (map A to B) -> map A to B m1 ++ m2 Override (map A to B) * (map A to B) -> map A to B merge ms Distr merge set of(map A to B)-> map A to B s<:m Dom restr to Set of A*(map A to B) -> map A to B s<-:m Dom restr by Set ofA*(map A to B)-> map A to B m:>s Rng restr to (map A to B)*set of A -> map A to B m:->s Rng restr by (map A to B)*set of A -> map A to B
inverse m Map inverse Inmap A to B -> inmap B to A
Trang 22m1=m2 Equality (map A to B) * (map A to B) -> bool m1 <> m2 Inequality (map A to B) * (map A to B) -> bool
Các phương thức của kiểu tuần tự (Sequence)
Bảng 1 8 Các phương thức kiểu dữ liệu map
l1^l2 Concatenation seq of A*seq of A -> seq of A
conc ll Distr conc seq of seq of A -> seq of A
l(i) Seq application seq1ofA*nat1->A
l++m Seq modification
seq1of A*map nat1 to A ->
seq1 of A l1=l2 Equality seq of A * seq of A -> bool
l1 <> l2 Inequality seq of A * seq of A -> bool
1.1.3.6 Hàm và Phương thức
Trong VDM++, việc thực hiện tính toán trên dữ liệu được mô hình hóa thông qua hàm hoặc phương thức khai báo trong các đối tượng Hàm sẽ nhận dữ liệu đầu vào và tính toán ra kết quả mà không tham chiếu tới bất kì biến thể hiện nào của đối tượng Trong khi đó, phương thức cũng nhận dữ liều đầu vào và tính toán trả về kết quả, tuy nhiên nó có thể đọc hoặc thay đổi giá trị của các biến thể hiện của đối tượng Chính vì thế, hàm luôn trả về kết quả tương ứng với dữ liệu đầu vào, còn phương thức thì có thể trả về kết quả tùy vào từng thể hiện của đối tượng, vì nó phụ thuộc vào giá trị của các tham số lúc khởi tạo đối tượng
Trang 23Hình 1 12 Cấu trúc lớp trong VDM++
Trong VDM++, hàm và phương thức được khai báo sau các từ khóa định nghĩa khối operations và functions Có cấu trúc như sau:
Hàm
Khai báo hàm tường minh (Explicit Function)
Hình 1 13 Cấu trúc khai báo hàm tường minh
Khai báo hàm không tường minh (Implicit Function)
Hình 1 14 Cấu trúc khai báo hàm không tường minh
class class name
end class name
function name (parameters) result name and type
Trang 24Phương thức
Khai báo phương thức tường minh (Explicit Operation)
Hình 1 15 Cấu trúc khai báo phương thức tường minh
Khai báo phương thức không tường minh (Implicit Operation)
Hình 1 16 Cấu trúc khai báo phương thức không tường minh
Khai báo phương thức ở mức trừu tượng
Hình 1 17 Cấu trúc khai báo phương thức ở mức trừu tượng
operation name: parameter types ==> result type
post predicatepost expr
operation name: parameter types ==> result type
operation name(parameters) ==
is not yet specified
pre predicate
post predicate
Trang 25Khai báo phương thức dạng ủy thác
Hình 1 18 Cấu trúc khai báo phương thức dạng uỷ thác
1.1.3.7 Tính đồng thời (Concurrency)
Một đối tượng có thể là
Thụ động (passive): chỉ có thể thay đổi trạng thái thông qua các yêu cầu Như
là một lời gọi, một phương thức Đối tượng thụ động sẽ phản hồi yêu cầu từ một đối tượng chủ động Nó cung cấp một giao diện cho các máy khách, không có luồng xử lý
và có thể phục vụ nhiều máy khách khác nhau
Hoặc chủ động (active): có thể thay đổi trạng thái của nó mà không cần sự tác
động của bất cứ đối tượng nào khác Các đối tượng chủ động có một luồng điều khiển riêng của nó
Trong VMD++, hệ thống đồng thời có thể được mô hình hóa bằng cách sử dụng thread Đa luồng có thể tồn tại và được thực thi trong một mô hình tại cùng một thời điểm Thread chia sẻ cùng không gian tên và giao tiếp với nhau thông qua các đối tượng chia sẻ Để duy trì tính toàn vẹn của đối tượng chia sẻ, cần đảm bảo rằng việc truy cập đồng thời tới các đối tượng này là được đồng bộ Việc đồng bộ cho các đối tượng chia sẻ bằng cách sử dụng từ khóa sync Cú pháp khai báo như sau:
Hình 1 19 Cú pháp khai báo đồng bộ đối tượng chia sẻ
1.2 Công cụ hỗ trợ VDM++
1.2.1 Giới thiệu
Việc kết hợp giữa VDM++ và UML (biểu đồ lớp và biểu đồ tuần tự) giúp cho việc sử dụng phần mềm vào hỗ trợ phân tích mô hình hóa Một trong những giới hạn của UML là chỉ cho phép xem xét được cấu trúc của các class Bằng việc sử dụng Overture và Modelio, người phân tích thiết kế có thể thực hiện mô hình UML trong
operation name: parameter types ==> result type
Trang 26Modelio, sau đó chuyển sang VDM++ bằng cách import mô hình UML từ Modelio vào Overture và export lại UML
1.2.2 Modelio
Modelio là công cụ hỗ trợ vẽ UML diagrams, import/export biểu đồ UML, được
sử dụng kết hợp với Overture để mô hình hóa một hệ thống phần mềm Modelio được cung cấp bởi công ty Softeam, có 2 phiên bản: thương mại và mã nguồn mở Cũng tương tự như Overture, Modelio được phát triển trên nền tảng Eclipse Tải về tại địa chỉ https://www.modelio.org/
Bắt đầu việc mô hình hóa bằng việc tạo biểu đồ lớp UML trong Modelio Sau đó,
để chuyển đổi sang VDM++, chúng ta cần phải xuất biểu đồ lớp UML sang file định dạng uml theo các như sau:
Bước 1 Chọn dự án cần xuất click chuột phải chọn [XMI] chọn [export XMI]
Hình 1 20 Xuất biểu đồ UML sang định dạng UML trong Modelio
Bước 2 Chọn đường dẫn xuất file và định dạng xuất (.xmi hoặc uml)
Trang 27Hình 1 21 Lựa chọn xuất file trong Modelio Bước 3 File xuất thành công
Hình 1 22 Kết quả xuất file UML Bước 4 Sao chép file uml vào dự án cần chuyển đổi sang VDM
Bước 5 Click chuột phải lên file uml UML Transformation Convert to VDM
Trang 28Hình 1 23 Menu chuyển đổi từ UML sang VDM Bước 6 Kết quả chuyển đổi nằm trong thư mục uml_import
Hình 1 24 Danh sách các class sau khi import
Trang 291.2.3 Overture
Đây là một IDE miễn phí hỗ trợ việc phát triển và phân tích mô hình hóa bằng VDM++, được phát triển bởi cộng đồng tình nguyện viên từ các nhà khoa học nghiên cứu và sinh viên từ Đan Mạch, Anh, Hà Lan và Nhật Bản Công cụ phát triển trên nền tảng Eclipse Dự án phát triển Overture được quản lý trên GitHub, tại địa chỉ https://github.com/overturetool/overture Phiên bản hiện tại của Overture là 2.2.6 được phát hành vào tháng 6/2015 Tải về tại địa chỉ http://overturetool.org/
Bảng 1 9 Danh sách cộng đồng người dùng Overture
Institute of Technology
Institute for System
Research Associates, Inc
Trang 30Lomonosov Moscow State
National Institute of
Technical University of
Universität der
University of Twente The Netherlands Val Jones
Trang 31West Consulting The Netherlands Nico Plat
Bộ công cụ Overture hỗ trợ cả ba loại VDM: VDM-SL, VDM++ và VDM-RT Các bước để tạo một dự án mới trong Overture:
Bước 1 Tạo mới project bằng cách chọn: File -> New -> Project -> Overture
Hình 1 25 Tạo mới dự án VDM++ trong Overture Bước 2 Trong hộp thoại chọn loại VMD mà cần tạo sử dụng (VMD-SL, VDM-
PP hoặc VMD-RT), ở đây chọn VDM-PP
Trang 32Hình 1 26 Chọn loại dự án VDM Bước 3 Click [Next]
Bước 4 Nhập tên dự án vào [Project name]
Trang 34Bước 7 Click [Next], chọn thư viện chuẩn cần sử dụng (bỏ qua nếu không cần)
Hình 1 29 Danh sách thư viện Overture hỗ trợ
Ý nghĩa các thư viện như sau:
IO: thư viện cung cấp các hàm để thao tác file
Math: thư viện cung cấp các hàm toán học
VDM-Util: thư viện cung cấp các hàm chuyển đổi các loại khác nhau của VDM
từ String, file
CSV: thư viện cung cấp các hàm thao tác với CSV
VMD-Unit: thư viện cung cấp các hàm cho unit test của VDM giống như thư
viện Junit
Bước 8 Click [Finish] để hoàn thành việc tạo mới dự án
Các tính năng nổi bật Overture hỗ trợ việc mô hình hóa
Do được phát triển trên nền tảng eclipse, nên nó bao gồm đầy đủ các tính năng được eclipse hỗ trợ Để thực thi hoặc gỡ lỗi mô hình VDM, trước tiên ta phải cài đặt cấu hình thực thi Thực hiện điều này bằng cách chọn “Run” menu và chọn Run Run Configurations Màn hình cấu hình hiện ra như dưới đây, và bạn nhập các giá trị mong muốn thực thi hoặc gỡ lỗi
Trang 35Hình 1 30 Hộp thoại cấu hình thực thi và gỡ lỗi Bên cạnh đó, khi thực thi hoặc gỡ lỗi Overture còn thực hiện một số kiểm tra lỗi chương trình Các kiểu kiểm tra này mặc định được chọn khi cài đặt Tuy nhiên, ta có thể bỏ qua việc kiểm tra này bằng cách bỏ chọn trong khi cấu hình
Hình 1 31 Hộp thoại cấu hình thực thi và gỡ lỗi