Khóa luận Kiểm chứng đặt tả UML cho tác tử phần mềm

Mục lục

Chương 1. Mở đầu . 1

1.1 Đặt vấn đề . 1

1.2 Nội dung bài toán . 2

1.3 Tổng quan phương pháp “Kiểm chứng đặc tả UML cho tác tử phần mềm” . 3

1.4 Cấu trúc khóa luận . 4

Chương 2. Giới thiệu lập trình hướng khía cạnh (Aspect-Oriented Programming)

và AspectJ . 6

2.1 Phương pháp lập trình hướng khía cạnh . 6

2.1.1 Sự hạn chế của lập trình hướng đối tượng (OOP) . 6

2.1.2 Lập trình hướng khía cạnh (AOP) . 9

2.2 AspectJ . 12

2.2.1 Join point . 12

2.2.2 Pointcut . 12

2.2.3 Advice . 13

2.2.4 Aspect . 14

2.2.5 Cơ chế họa động của AspectJ . 15

2.3 Sử dụng AOP Phát triển ứng dụng và phương pháp kiểm chứng dựa trên AOP . 15

2.4 Kết luận . 17

Chương 3. Agent UML và JADE framework . 18

3.1 Ngôn ngữ mô hình hóa UML . 18

3.1.1 Khái niệm . 18

3.1.2 Biểu đồ trạng thái (State Diagram) . 18

3.1.3 Biểu đồ trình tự (Sequence Diagram) . 19

3.2 XML (eXtensible Markup Language) . 20

3.2.1 Cơ bản về XML . 20

3.2.2 XML DOM . 22

3.3 XMI (XML Metadata Interchange) . 24

3.4 AUML (Agent UML) . 25

3.4.1 Tác tử phần mềm là gì? . 25

3.4.2 Phần mềm hướng Agent . 26

3.4.3 AUML (Agent Unified Modeling Language) . 28

3.5 Java Agent DEvelopment Framework (JADE) . 31

3.5.1 Khái niệm về JADE . 31

3.5.2 Cấu trúc của JADE platform . 32

3.5.3 Một số lớp quan trọng trong thư viện JADE . 33

3.6 Kết luận . 34

Chương 4. Xây dựng máy trạng thái từ biểu đồ UML . 35

4.1 Biểu đồ trạng thái . 35

4.1.1 Quy tắc biểu diễn giao thức bằng biểu đồ trạng thái . 35

4.1.2 Xây dựng cấu trúc dữ liệu mô tả biểu đồ trạng thái UML . 36

4.1.3 Xây dựng FSM mô tả biểu đồ trạng thái UML . 40

4.2 Biểu đồ trình tự UML . 42

4.2.1 Cách biểu diễn giao thức giữa nhiều đối tượng bằng biểu đồ trình tựUML . 42

4.2.2 Xây dựng cấu trúc dữ liệu mô tả biểu đồ trình tự UML . 43

4.2.3 Xây dựng FSM mô tả biểu đồ trình tự UML . 46

4.3 Kết luận . 47

Chương 5. Xây dựng công cụ tự động sinh aspect từ máy trạng thái. 48

5.1 Đặt vấn đề . 48

5.2 Sinh aspect từ FSM mô tả biểu đồ trạng thái UML . 49

5.3 Sinh aspect từ FSM mô tả biểu đồ trình tự UML . 50

5.4 Mở rộng . 51

5.5 Sinh mã aspect kiểm chứng giao thức (AB)n. 52

5.5.1 Giao thức (AB)nlà gì? . 52

5.5.2 Thuật toán kiểm chứng giao thức (AB)n. 53

5.5.3 Sinh mã aspect kiểm chứng giao thức (AB)n. 54

5.6 Kết luận . 54

Chương 6. Thực nghiệm . 55

6.1 Xây dựng công cụ PVG . 55

6.2 Kiểm chứng một số giao thức thực tế . 56

6.2.1 Giao thức của các ứng dụng Applet . 56

6.2.2 Kiểm chứng giao thức biểu diễn giao thức ghi nợ ở một máy ATM 60

6.2.3 Kiểm chứng giao thức [A*B] n. 64

6.2.4 Kiểm chứng giao thức tương tác tác tử . 66

6.3 Kết luận . 70

Chương 7. Kết luận . 71

7.1 Kết luận về khóa luận . 71

7.2 Hướng phát triển trong tương lai . 72

Phụ lục . 73

Phụ lục A: Tài liệu XMI mô tả biểu đồ trạng thái UML . 73

Phụ lục B: Tài liệu XMI mô tả biểu đồ trình tự UML . 75

Phụ lục C: Agent Customer (Customer.java) . 78

Phụ lục D: Agent ShoppingCart (ShoppingCart.java) . 81

Phụ lục E: Aspect Template . 83

pdf93 trang | Chia sẻ: maiphuongdc | Lượt xem: 1922 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Khóa luận Kiểm chứng đặt tả UML cho tác tử phần mềm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
h (a) biểu diễn các luồng được gửi đi song song (phép AND). Hình (b) bao gồm một hộp quyết định xác định xem luồng nào sẽ được gửi đi tiếp (phép OR). Hình (c) xác định trong một thời điểm chỉ có một luồng được phép gửi đi (phép XOR). 31 3.4.3.3 Mức 3 – biểu diễn xử lý bên trong Agent Tại mức thấp nhất, đặc tả về một giao thức. Agent yêu cầu giải thích rõ ràng những xử lý chi tiết bên trong agent để tiến hành giao thức. Các mô hình mức cao hơn (gọi là holon) bao gồm tập các agent ở mức thấp hơn. Các hành vi bên trong có thể được biểu diễn bằng việc sử dụng đệ quy các cách biểu diễn ở mức 2. Ví dụ: Hình 3.9: Các hành vi bên trong của agent Initiator (a) và Participant(b) 3.5 Java Agent DEvelopment Framework (JADE) 3.5.1 Khái niệm về JADE “JADE (Java Agent DEvelopment Framework) is a software Framework fully implemented in Java language. It simplifies the implementation of multi-agent systems through a middle-ware that complies with the FIPA specifications and through a set of graphical tools that supports the debugging and deployment phases” [3]. Ta có thể tóm tắt lại định nghĩ trên như sau: - JADE là phần mềm dạng middle-ware phục vụ cho việc phát triển hệ đa tác tử. Nó hỗ trợ việc xây dựng từng agent trong hệ đa agent. Cung cấp các dịch vụ cho từng hoạt động của agent, các công cụ phục vụ cho việc debug và agent xây dựng dựa trên chuẩn FIFA. - JADE là một hệ thống mã nguồn mở, được xây dựng trên ngôn ngữ Java. 32 3.5.2 Cấu trúc của JADE platform Platform JADE là môi trường hỗ trợ agent hoạt động, trao đổi thông tin. Platform JADE chứa nhiều container, các container có thể hoạt động độc lập trên các host khác nhau. Có hai loại container chính: - JADE main-container: Mỗi platform chỉ có một main-container. Container này được khở tạo và hủy cùng với platform. Nó chứa một số agent quan trọng của JADE platform như: o RMA (Remote Management Agent): Hoạt động như màn hình đi ều khiển, phục vụ việc quản lý platform. o DF (Directory Facilitator): Là một agent cung cấp dịch vụ trang vàng (yellow-page) trong platform.  Trang vàng (Yellow-page): Là một dịch vụ cung cấp chức năng quản lý việc giao tiếp giữa các agent, đối chiếu thông tin trao đổi. o AMS (Agent Management System): Là agent theo dõi quản lý sự truy cập và sử dụng agent platform. Cung cấp dịch vụ trang trắng (white- page).  Trang trắng (White-page) cung cấp chức năng quản lý việc đăng ký của agent, quản lý ID của các agent đã đăng ký và quản lý vòng đời của agent. - JADE agent-container: Chứa các agent của người sử dụng, nó có thể nằm trên các host khác nhau. Hình 3.10: Cấu trúc phân tán của JADE 33 3.5.3 Một số lớp quan trọng trong thư viện JADE - Gói jade.core: Cài đặt các thành phần cơ bản của hệ thống. Nó chứa lớp Agent, các agent được tạo ra bắt buộc phải kế thừa từ lớp này. Ngoài ra nó còn chứa gói jade.core.behavior: cung cấp các hàm cài đặt nhiệm vụ cho agent. o Lớp jade.core.Agent: cung cấp các phương thức đăng ký với platform, các phương thức xác định trạng thái của agent, quản lý trạng thái và các phương thức hoạt động của agent. Cách tạo agent: public class MyAgent extends Agent { // some attributes public void setup() { // registry with AMS.. // other activities addBehaviour(myBehaviour) } // other methods } o Gói jade.core.behavior: Chứa các lớp cho phép tạo ra các hoạt động của agent từ đơn giản đến phức tạp. Ta có thể tạo ra các hành động cho agent bằng việc kế thừa từ các lớp này. Cách tạo behavior: public class MyBehaviour extends Behaviour { // some attributes public MyBehaviour(Agent agent){super(agent)} public void action() { // agent action } // other methods } - Gói jade.lang.acl: cung cấp các phương thức xử lý giao tiếp giữa các agent theo chuẩn FIFA. - Gói jade.domain: mô tả các thực thể quản lý agent theo chuẩn FIFA. Nó cung cấp một số dịch vụ như: life-cycle, yellow-page, white-page. Ngoài ra còn một số gói khác như: jade.wrapper, jade.content, jade.tools… Hoạt động của một agent: 34 Hình 3.11: Hoạt động của agent 3.6 Kết luận Các kiến thức về UML, XML, XMI, AUML mà tôi trình bày trong chương này không phải quá mới mẻ và cũng không thật sự đầy đủ. Nhưng đó là những nền tảng kiến thức cơ bản tôi sử dụng trong khóa luận để xây dựng công cụ tự động sinh mô- đun aspect kiểm chứng. Để giải quyết bài toán “kiểm chứng đặc tả UML cho tác tử phần mềm”, tôi chia bài toán ra làm hai bước nhỏ: Bước thứ nhất là xây dựng FSM từ tài liệu XMI mô tả các biểu đồ UML. Bước thứ hai là xây dựng bộ sinh aspect tự động từ FSM. Hai bước này sẽ được trình bày cụ thể ở các chương sau. 35 Chương 4. Xây dựng máy trạng thái từ biểu đồ UML Trong chương 2 và 3 tôi đã trình bày các ki ến thức nền tảng cơ bản để xây dựng công cụ Protocol Verification Generator(PVG). Trong chương này, tôi sẽ trình bày bước thứ nhất trong phương pháp xây dựng công cụ tự động sinh mô-đun aspect, đó là phân tích tài liệu XMI được xuất ra từ một biểu đồ UML, từ đó xây dựng máy trạng thái. Như vậy, trong bước này ta có: - Input: Một tài liệu XMI mô tả biểu đồ trạng thái hoặc biểu đồ trình tự UML. - Output: Máy trạng thái nếu xây dựng được, nếu không sẽ báo lỗi. Để xây dựng được máy trạng thái, trước tiên tôi sẽ xây dựng các cấu trúc dữ liệu để đặc tả các thành phần của biểu đồ UML bằng các đối tượng trong Java, cấu trúc dữ liệu của máy trạng thái mà tôi sử dụng. Tiếp theo, tôi sẽ trình bày cách thức tạo ra máy trạng thái từ tài liệu XMI và các cấu trúc dữ liệu đã xây dựng trước đó. 4.1 Biểu đồ trạng thái 4.1.1 Quy tắc biểu diễn giao thức bằng biểu đồ trạng thái Ngoài cách vẽ biểu đồ trạng thái như trong UML đề cập, tôi xin đưa ra thêm một số quy tắc dùng biểu đồ trạng thái để biểu diễn giao thức. Công cụ PVG mà tôi xây dựng sẽ sử dụng các quy tắc này như là một chuẩn để nó có thể hiểu được giao thức mà người dùng đặc tả bằng UML. Nếu người dùng không tuân thủ các quy tắc này, chương trình sẽ không đưa ra được kết quả như ý. Một số quy tắc: - Trong một tài liệu UML, chỉ có một biểu đồ trạng thái thể hiện giao thức cần kiểm tra. - Biểu đồ trạng thái bắt buộc phải có trạng thái bắt đầu và trạng thái kết thúc. - Trạng thái bắt đẩu có tên bắt đầu bằng “Initial”, và chỉ có các cạnh đi ra chứ không có cạnh đi vào trạng thái này. - Trạng thái kết thúc có tên bắt đầu bằng “FinalState” và chỉ có cạnh đi vào, không có cạnh đi ra từ trạng thái này. 36 - Các trạng thái khác phải có ít nhất một cạnh đi vào và một cạnh đi ra. Tên của các trạng thái này không bắt đầu bằng “Initial” hoặc “FinalState”. - Các cạnh là chữ ký (signature) của các hàm, phương thức sẽ được gọi dùng để thay đổi trạng thái. Chữ ký này được định nghĩa gi ống như tên hàm trong mã nguồn của chương trình cần kiểm chứng, bao gồm cả kiểu giá trị trả về, tên hàm, danh sách các tham số truyền vào. Ví dụ: o Trong mã nguồn, ta gọi hàm init() không có tham số truyền vào, kiểu trả về là void thì tên của cạnh trong biểu đồ UML sẽ là: void init(). o Hàm int setAge(int age) được gọi trong mã nguồn thì tên của cạnh tương ứng sẽ là: int setAge(int age). Đối số age là không bỏ được. - Chú ý rằng tên của tham số truyền vào phải giống với tên biến đã khai báo trong mã nguồn của chương trình cần kiểm chứng. - Điều kiện tiên quyết (precondition) để hàm được gọi sẽ được mô tả trong “GuardCondition” của cạnh. Điều kiện này cũng phải giống với điều kiện trong mã nguồn của chương trình. Hoặc nó là đoạn code trả về giá trị boolean (ví dụ như một phương thức tĩnh (static) boolean isTrue()) Sau đây là ví dụ mô tả một cạnh trong biểu đồ trạng thái UML: - Đoạn mã trong chương trình: if(temp.isTrue()) { init(); ..... } - Ta sẽ mô tả cạnh của biểu đồ trạng thái UML như sau: Hình 4.1: UMLTransition o Tên của cạnh (Name): void init(). o Điều kiện tiên quyết (GủadCondition): temp.isTrue() 4.1.2 Xây dựng cấu trúc dữ liệu mô tả biểu đồ trạng thái UML Ta có thể thấy một biểu đồ trạng thái UML gồm hai thành phần chính: Các trạng thái (State) và các cạnh (Transition). Tôi sẽ xây dựng hai lớp để mô tả hai thành này phần của biểu đồ trạng thái UML. 37 4.1.2.1 Lớp State – mô tả các trạng thái (các đỉnh) Trong biểu đồ trạng thái UML, đỉnh được mô tả gồm có tên của đỉnh, các cạnh đi vào đỉnh và các cạnh đi ra từ đỉnh. Trạng thái bắt đầu chỉ có cạnh đi ra, không có cạnh đi vào. Trạng thái kết thúc, chỉ có các cạnh đi vào đỉnh, không có các cạnh đi ra từ đỉnh. Như vậy, để mô tả một trạng thái ít nhất ta cần mô tả ba dữ liệu: tên đỉnh, các cạnh đi vào và các cạnh đi ra. Để xét xem còn dữ liệu nào cần mô tả nữa không, ta xem cách tài liệu XMI mô tả một trạng thái của biểu đồ trạng thái UML (Phụ lục A). <UML:SimpleState xmi.id="UMLCompositeState.17" name="State1" visibility="public" isSpecification="false" container="UMLCompositeState.15" outgoing="UMLTransition.22" incoming="UMLTransition.21" 4.1.2.2 Lớp Transition – mô tả các cạnh của biểu đồ trạng thái UML /> Nhìn vào cách tài liệu XMI mô tả một trạng thái, ta thấy cần mô tả thêm một dữ liệu nữa về một trạng thái, đó là id của trạng thái (xmi.id). Tài liệu XMI dùng id của trạng thái để đại diện cho một trạng thái bất kỳ trong các liên kết của trạng thái đó với các thành phần khác của biểu dồ, vì vậy dữ liệu về id của trạng thái là rất quan trọng, không thể bỏ qua. Tóm lại, ta cần bốn dữ liệu để mô tả một trạng thái: id của trạng thái, tên trạng thái, các cạnh đi vào và các cạnh đi ra. Và lớp State mô tả trạng thái được xây dựng cơ bản như sau: public class State { private String xmiId; private String name; private String[] incoming; private String[] outgoing; // các phương thức khác. } Một cạnh được mô tả gồm có tên của cạnh và là một đường liên kết giữa hai đỉnh trong biểu đồ trạng thái UML, bắt đầu từ một đỉnh (trạng thái) của biểu đồ và kết thúc ở một đỉnh khác. Vì vậy, để mô tả một cạnh của biểu đồ, ta phải mô tả tên của cạnh, đỉnh bắt đầu của cạnh và đỉnh kết thúc của cạnh. Ngoài ra, tài liệu XMI dùng id để mô tả các thành phần của biểu đồ, như vậy đỉnh bắt đầu và đỉnh kết thúc của cạnh sẽ là id của đỉnh bắt đầu và kết thúc. Mặt khác ta cũng cần thêm id để mô tả id của cạnh. Như vậy, ta đã có 4 dữ liệu cần thiết phải mô tả một cạnh, đó là: id của cạnh, tên của cạnh, 38 id của đỉnh bắt đầu, id của đỉnh kết thúc. Ta xét xem XMI mô tả biểu cạnh của biểu đồ trạng thái như thế nào: <UML:Transition xmi.id="UMLTransition.11" name="void init()" visibility="public" isSpecification="false" stateMachine="UMLStateMachine.4" source="UMLPseudostate.6" target="UMLCompositeState.7"> <UML:BooleanExpression xmi.id="X.17" body="a >= b" - Id của cạnh: xmi.id /> Như vậy sau khi xét tài liệu XMI, ta thấy: Ngoài bốn dữ liệu cần thiết đã chỉ ra ở trên, tài liệu XMI còn mô tả điều kiện tiên quyết để phương thức được thực hiện trong phần tử là phần tử con của . Tóm lại, để mô tả một cạnh, ta cần năm dữ liệu sau: - Tên cạnh: name - Id của đỉnh mà từ đó cạnh đi ra: source - Id của đỉnh mà cạnh đi vào: target - Điều kiện tiên quyết: guard.expression. Lớp Transition được xây dựng như sau: public class Transition { private String xmiId; // ID của cạnh private String name; // Tên cạnh private String source; // ID của đỉnh mà cạnh đi ra private String target; // ID của đỉnh mà cạnh đi vào private String preCondition; // điều kiện để chuyển trạng thái ..... } 4.1.2.3 Mô tả biểu đồ trạng thái bằng các đối tượng trong Java Hai lớp State và Transition mô tả hai thành phần chính của biểu đồ trạng thái UML. Tuy nhiên, một biểu đồ trạng thái thường có nhiều State và nhiều Transition, vì vậy để tiện cho việc truy xuất dữ liệu về các thành phần này tôi xây dựng thêm hai lớp nữa mô tả danh sách các State (ListStates) và danh sách các Transition (ListTransitions) có trong biểu đồ trạng thái UML. Hai lớp này 39 có nhiệm vụ duyệt tài liệu XMI và lấy dữ liệu về các State, các Transition. Sơ đồ lớp mô tả các đối tượng được minh họa như hình vẽ dưới đây: Hình 4.2: Sơ đồ lớp biểu diễn biểu đồ trạng thái bằng các đối tượng trong Java Trong hai lớp ListStates và ListTransitions, tôi xây dựng thêm một số phương thức khác để lấy các thành phần dữ liệu của một State và Transition một cách dễ dàng như: lấy dữ liệu về một State khi biết id của State hay lấy dữ liệu về một Transition khi biết id của Transition đó. Cách xây dựng các hàm này hết sức đơn giản, khi ta đã có m ột danh sách các State và Transition, ta chỉ việc duyệt trong danh sách này, so sánh id của State hoặc Transition với tham số id truyền vào, nếu đúng thì ta xuất dữ liệu ra theo ý muốn. Như đã trình bày ở chương 3, tôi sử dụng thư viện XML DOM trong Java để đọc thông tin từ tài liệu XMI. Cấu trúc của tài liệu XMI này tôi chỉ rõ ở phụ lục A; Ở đây, tôi sẽ chỉ ra các node (thẻ XML) cần đọc để lấy dữ liệu. - Các trạng thái: o Trạng thái bắt đầu: : . o Trạng thái kết thúc: . o Trạng thái trung gian: . o Với mỗi trạng thái, các thuộc tính (attribute) cần đọc để lấy dữ liệu là:  xmi.id  name  incoming  outgoing 40  điều kiện sẽ được lấy thông qua thuộc tính body của phần tử con: . - Các cạnh (Transition) o Các node cần duyệt: . o Các thuộc tính cần đọc để lấy dữ liệu:  xmi.id  name  source  target Khi đã xác đ ịnh được các node, các thuộc tính cần đọc để lấy dữ liệu, công việc còn lại là đọc tài liệu XMI và tạo ra danh sách các trạng thái và danh sách các Transition là hết sức đơn giản như sau: - Khởi tạo ListState, ListTransition - Lấy danh sách các node (NodeList) của Transition và State. - Duyệt từng node trong NodeList - Tạo ra một Transition và một State mới, thêm vào danh sách. Sau bước này, ta sẽ có một danh sách mô tả các State và Transition có trong biểu đồ UML. Bước tiếp theo, tôi sẽ trình bày cách tạo ra FSM từ hai danh sách này. 4.1.3 Xây dựng FSM mô tả biểu đồ trạng thái UML Như ta đã bi ết, để chuyển từ trạng thái này, sang trạng thái kia thì cần có hàm chuyển trạng thái. Trong nghiên cứu của tôi, hàm chuyển trạng thái được mô tả trong các cạnh của biểu đồ trạng thái. Tập hợp các hàm chuyển trạng thái sẽ tạo thành giao thức mô tả hoạt động của đối tượng. FSM được xây dựng cần phải mô tả được giao thức này. Mặt khác, trong mã nguồn của chương trình, các tr ạng thái hầu như không có ý nghĩa, các đoạn mã chỉ mô tả các phương thức được thực hiện – chính là các cạnh của biểu đồ, và mục đích của việc kiểm chứng ở đây chính là kiểm tra xem các phương thức trong mã nguồn của chương trình có được gọi theo đúng giao thức đã được chỉ ra hay không. Để kiểm tra việc này, công cụ tự sinh aspect cần phải biết phương thức nào được gọi trước, phương thức nào được gọi sau từ đó sẽ kiểm tra được các vi phạm các giao thức ràng buộc đối tượng. FSM được xây dựng cần phải mô tả được điều này. Dựa vào bài báo [5] tôi xây dựng FSM gồm các thành phần dữ liệu sau: HashMap> fsm = null; HashSet entrySigs, exitSigs; 41 HashMap> stateMap = null; Trong đó: - entrySigs: Mô tả các cạnh đi ra từ trạng thái bắt đầu. - exitSigs: Mô tả các cạnh đi vào trạng thái kết thúc. - fsm: Là một HashMap, với key chính là một cạnh đi ra từ một trạng thái trung gian. Value chính là các cạnh đi vào trạng thái này. - stateMap: Biểu diễn các trạng thái và các cạnh đi vào trạng thái. Hashmap này sẽ được dùng để đánh số các trạng thái của biểu đồ. Thuật toán xây dựng FSM như sau: - Input: tài liệu XMI mô tả biểu đồ trạng thái UML - Output: FSM nếu xây dựng được, nếu không sẽ báo lỗi. - Các bước thực hiện: o Khởi tạo fsm, entrySigs, exitSigs, stateMap. o Đọc file XMI, lấy ListStates và ListTransitions. o Duyệt từng State trong ListStates  Tạo giá trị cho stateMap: • Nếu nó là trạng thái bắt đầu: thêm một phần tử mới với key là “START”, value = null. • Ngược lại thêm vào stateMap một phần tử với với key là tên trạng thái hiện tại, value là tên của các cạnh đi vào đỉnh.  Nếu nó là trạng thái bắt đầu, lấy tên + precondition cho vào entrySigs và cho vào fsm (biến fsm) với key là tên + precondition còn value là: “START”.  Nếu nó là trạng thái kết thúc, lấy tên + precondition cho vào exitSigs.  Nếu nó là trạng thái trung gian. • Lấy tên của tất cả các cạnh đi vào trạng thái cho vào cấu trúc dữ liệu dạng “Set” trong Java. • Duyệt từng cạnh đi ra từ trạng thái. Lấy tên + precondition. Thêm vào fsm key là tên + precondition của cạnh đi ra và value là “Set” chứa các cạnh đi vào ở trên. 42 4.2 Biểu đồ trình tự UML 4.2.1 Cách biểu diễn giao thức giữa nhiều đối tượng bằng biểu đồ trình tự UML Một biểu đồ trình tự bao gồm hai thành phần chính, đó là các đối tượng và các thông điệp trao đổi giữa các đối tượng. Các đối tượng ở đây, chính là tên của các lớp trong mã nguồn của chương trình. Các thông điệp trao đổi giữa các đối tượng chính là các phương thức của các lớp trong mã nguồn mà ta cần kiểm chứng. Khi mô tả giao thức giữa các lớp bằng biểu đồ trình tự UML, ta sẽ mô tả như sau: - Tên của lớp trong mã nguồn – cũng chính là tên của đối tượng (UMLObject) trong biểu đồ. Và đối với lớp, ta chỉ cần mô tả tên của lớp đó. - Các thông điệp trao đổi giữa các đối tượng được (UMLStimulus) mô tả đầy đủ các thành phần giống như mô tả phương thức của các lớp trong mã nguồn. Cũng gồm có tên phương thức, các tham số truyền vào, kiểu giá trị trả về và thông điệp là phương thức của lớp nào thì nó đư ợc bắt đầu đi ra từ lớp đó. o Tên phương thức mô tả thông qua thuộc tính name. o Các tham số truyền vào được mô tả thông qua thuộc tính Arguments. Các tham số truyền vào, được mô tả bao gồm cả kiểu dữ liệu và tên của tham số. Tên tham số giống như tên của tham số truyền vào trong lời gọi phương thức ở mã nguồn chính của chương trình. o Kiểu giá trị trả về được mô tả bằng thuộc tính Return. Cụ thể các thành phần này được mô tả chi tiết như hình dưới đây: 43 Hình 4.3: StarUML mô tả các thành phần trong biểu đồ trình tự Hoàn toàn tương tự cách xây dựng FSM từ biểu đồ trạng thái, FSM mô tả biểu đồ trình tự UML cũng được xây dựng hoàn toàn tương tự như vậy. Cũng gồm hai bước nhỏ: Thứ nhất là xây dựng cấu trúc dữ liệu mô tả các thành phần của biểu đồ, cách mô tả biểu đồ bằng các thành phần này. Thứ hai là xây dựng FSM từ các thành phần dữ liệu đã được cấu trúc hóa thành các đối tượng được định nghĩa ở bước thứ nhất. Biểu đồ trình tự UML gồm hai thành phần chính: Các đối tượng (Object) và các thông điệp trao đổi giữa các đối tượng (Stimulus). Tôi cũng xây dựng cấu trúc dữ liệu mô tả hai thành phần này như sau: 4.2.2 Xây dựng cấu trúc dữ liệu mô tả biểu đồ trình tự UML Phương pháp xây dựng cấu trúc dữ liệu mô tả biểu đồ trình tự UML hoàn toàn tương tự với cách xây dựng cấu trúc dữ liệu mô tả biểu đồ trạng thái mà tôi đã trình bày ở phần trước. Đầu tiên là tôi xem xét các thành phần chính của biểu đồ, ta sẽ mô tả dữ liệu gì thông qua các thành phần này. Tiếp theo là phân tích tài liệu XMI được xuất ra từ một biểu đồ trình tự UML, xem xét xem tài liệu XMI dùng các thẻ gì để mô tả các thành phần chính này, các thành phần dữ liệu trong thẻ (thuộc tính) gồm những gì. Cuối cùng, tôi sẽ lọc ra các dữ liệu cần thiết nhất và xây dựng các lớp Java để mô tả các thành phần chính của biểu đồ. Đây cũng chính là phương pháp phân tích tài li ệu XMI mà tôi sử dụng trong khóa luận. Áp dụng phương pháp phân tích tài liệu XMI ở trên, tôi xây dựng các lớp mô tả biểu đồ trình tự UML theo như biểu đồ lớp được mô tả trong hình vẽ dưới đây: 44 Hình 4.4: Sơ đồ lớp biểu diễn các thành phần của biểu đồ trình tự UML 4.2.2.1 Lớp ClassifierRole mô tả các đối tượng Mô tả các lớp trong biểu đồ trạng thái, ta chỉ mô tả tên của lớp, ngoài ra XMI mô tả thêm id của lớp, như vậy để mô tả một ClassifierRole, ta chỉ cần mô tả hai thành phần dữ liệu, đó là: id của lớp và tên của lớp: public class ClassifierRole { private String id; // ID cua lop private String name; // Ten lop } Tài liệu XMI, mô tả các lớp thông qua thành phần (thẻ) <UML: ClassifierRole>, trong đó: - xmi.id: Mô tả id của ClassifierRole. - name: Mô tả tên của ClassifierRole. Đây cũng chính là tên thẻ và tên các thuộc tính của thẻ khi ta duyệt tài liệu UML và lấy dữ liệu mô tả các ClassifierRole. 4.2.2.2 Lớp Message mô tả thông điệp trao đổi giữa các đối tượng Thông điệp – hay chính là tên của phương thức được gọi trong mã nguồn. Mà như ta đã biết, một phương thức được mô tả bởi các thành phần như: tên phương thức, các tham số truyền vào, kiểu giá trị trả về của phương thức và một thành phần quan trọng không kém là ta cần xác định xem phương thức đó thuộc lớp (class) nào. Nhưng khi phân tích tài liệu XMI ta thấy: Không giống như các thành phần khác của biểu đồ UML, các dữ liệu mô tả một thành phần đều là các thuộc tính của một loại thẻ nào đó. Ví dụ như thẻ mô tả các cạnh của biểu đồ trạng thái, thẻ <UML: 45 ClassifierRole> mô tả các đối tượng của biểu đồ trình tự. Dữ liệu mô tả về một thông điệp của biểu đồ trình tự UML được thể hiện qua hai loại thẻ khác nhau: - Thẻ chứa các dữ liệu mô tả tên phương thức, lớp chứa phương thức đó. - Thẻ mô tả các tham số, kiểu giá trị trả về của phương thức. Vì vậy, tôi xây dựng hai lớp độc lập nhau để lưu trữ những thành phần dữ liệu khác nhau của một thông điệp được mô tả trên hai loại thẻ XML khác nhau. Đó là lớp Message và lớp TaggedValue. Lớp Message mô tả hai dữ liệu về thông điệp được mô tả trong thẻ đó là tên phương thức và id của lớp chứa phương thức đó. Lớp TaggedValue đại diện cho thẻ mô tả về tên các tham số và kiểu giá trị trả về của phương thức: - Class Message: public class Message { private String id; //ID cua message private String name; // Ten cua message private String sender; // ID cua lop } - Class TaggedValue: public class TaggedValue { private String value; // gia tri cua TaggedValue private String ID; // ID cua Message } Một thông điệp sẽ là sự kết hợp của Message và TagedValue. Thông qua thuộc tính id của thông điệp. 4.2.2.3 Mô tả biểu đồ trình tự UML bằng các đối tượng trong Java Ta đã có ba lớp cơ bản: ClassifierRole, Message, TagedValue để mô tả hai thành phần quan trọng của biểu đồ trạng thái UML, đó là đối tượng và thông điệp trao đổi giữa các đối tượng. Trong một biểu đồ trình tự, không chỉ có một đối tượng hay một thông điệp, mà nó chứa mỗi chuỗi các đối tượng và các thông điệp trao đổi giữa các đối tượng, tạo nên giao thức trao đổi thông điệp giữa các đối tượng. Do đó, cũng giống như mô tả biểu đồ trình tự, để mô tả các thành phần có trong biểu đồ trình tự, tôi cũng dùng một danh sách các ClassifierRole để lưu trữ tất cả các đối tượng có trong biểu đồ. Danh sách các Message và danh sách các TagedValue để lưu trữ tất cả các thông điệp trao đổi giữa các đối tượng trong biểu đồ. Các lớp này được mô tả trong hình 4.3. 46 Ngoài ra tôi cũng xây dựng thêm các phương thức giúp truy xuất dữ liệu về từng thành phần trong danh sách các đối tượng trong lớp được dễ dàng hơn thông qua id của đối tượng đó. 4.2.3 Xây dựng FSM mô tả biểu đồ trình tự UML Giao thức được mô tả bằng biểu đồ trình tự là giao thức liên quan đến nhiều lớp đối tượng khác nhau, nhưng xét cho cùng, nó cũng g ần giống với giao thức trên một lớp đối tượng được mô tả bằng biểu đồ trạng thái. Nó cũng quy đ ịnh dãy các phương thức sẽ được gọi trong chương trình và l ập trình viên sẽ phải gọi các phương thức trong các lớp khác nhau đúng theo trình tự như vậy. Việc kiểm chứng, xét cho cùng cũng chính là để kiểm tra xem lập trình viên gọi các phương thức có đúng như giao thức đặc tả ban đầu không. Do đó, Máy trạng thái mô tả biểu đồ trình tự tôi xây dựng cũng tương tự với máy trạng thái mô tả biểu đồ trạng thái. Gồm ba thành phần dữ liệu: HashMap> fsm = null; HashSet entrySigs, exitSigs; - entrySigs: Mô tả phương thức bắt đầu của giao thức - exitSigs: Mô tả phương thức kết thúc giao thức - fsm: Là một HashMap, với key một phương thức bất kỳ khác phương thức mở đầu và phương thức kết thúc giao thức. Value chính là phương thức ngay trước nó trong giao thức. Một câu hỏi đặt ra là: Trong biểu đồ trình tự, các phương thức (thông điệp) được mô tả theo một dãy và đư ợc đánh số thứ tự tự động bắt đầu từ 1, như vậy thì cần ba thành phần dữ liệu để mô tả một dãy gọi phương thức như vậy có phải là thừa không? Tôi xin trả lời là không hề thừa chút nào. Vì trong khi kiểm chứng, theo như bài báo [5] đề cập, không phải trong chương trì nh, mỗi lớp đối tượng được đặc tả ở đây chỉ được khởi tạo và thực hiện một lần. Lập trình viên có thể thực hiện giao thức nhiều lần bằng cách khai báo các biến khác nhau của các lớ

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

  • pdfVu Sy Vuong_K50CNPM_Khoa luan tot nghiep dai hoc.pdf