Tài liệu tham khảo công nghệ thông tin Kiểm chứng đặt tả uml cho tác tử phần mềm
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Trang 3Lời cám ơn
Trước tiên tôi xin gửi lời cảm ơn sâu sắc tới TS Trương Anh Hoàng, Bộ môn Công nghệ phần mềm, Khoa Công nghệ thông tin, Trường Đại học Công Nghệ, Đại Học Quốc Gia Hà Nội – người đã định hướng đề tài và tận tình hướng dẫn chỉ bảo tôi trong suốt quá trình thực hiện khóa luận tốt nghiệp này
Tôi cũng xin trân trọng cảm ơn quý th ầy cô trong Khoa Công nghệ thông tin trường Đại học Công Nghệ, Đại Học Quốc Gia Hà Nội đã tận tình giảng dạy, truyền đạt những kiến thức quý báu trong suốt bốn năm học làm nền tảng cho tôi thực hiện khóa luận tốt nghiệp này
Con xin cảm ơn cha mẹ và gia đình đã sinh ra và nuôi d ạy con khôn lớn, luôn bên cạnh động viên và ủng hộ con trên con đường mà con đã yêu thích và lựa chọn
Cảm ơn các bạn sinh viên Khoa Công nghệ thông tin khóa 2005 – 2009 Các bạn đã giúp đỡ và ủng hộ tôi rất nhiều cũng như đóng góp nhiều ý kiến quý báu, qua đó, giúp tôi hoàn thiện khóa luận tốt hơn
Mặc dù đã r ất nỗ lực, cố gắng nhưng chắc hẳn khóa luận của tôi vẫn còn nhiều thiếu sót Tôi rất mong nhận được nhiều những ý kiến đánh giá, phê bình của quý thầy cô, của các anh chị và các bạn
Một lần nữa, tôi xin chân thành cảm ơn
Hà Nội, tháng 5 năm 2009 Vũ Sỹ Vương
Trang 4Tóm tắt nội dung
Trong quy trình phát triển phần mềm, kiểm chứng phần mềm đóng vai trò quan trọng trong việc đảm bảo tính đúng đắn của hệ thống trong suốt quá trình thực thi Nó có nhiệm vụ phát hiện và dò tìm lỗi cho giai đoạn kiểm thử phần mềm Phương pháp lập trình hướng khía cạnh (AOP) cùng với công nghệ AspectJ ra đời đã tạo ra hướng phát triển mới cho kiểm chứng phần mềm, giúp nâng cao chức năng dò tìm, s ửa lỗi phần mềm mà không ảnh hưởng tới mã nguồn hệ thống Từ yêu cầu thực tế, khi mà mô hình UML đang là sự lựa chọn phổ biến cho việc mô hình hóa hệ thống phần mềm ở giai đoạn thiết kế, việc kiểm chứng các giao thức ràng buộc đối tượng, giao thức ràng buộc giữa các tác tử trong hệ đa tác tử được mô tả trong biểu đồ trạng thái và biểu đồ trình tự UML, AUML là rất cần thiết trong thời gian chạy Dựa vào yêu cầu thực tế đặt ra cùng với việc lựa chọn AOP làm giải pháp giải quyết vấn đề, trong phạm vi khóa luận, tôi xin trình bày phương pháp sinh mã aspect phục vụ cho mục đích kiểm chứng phần mềm và xây dựng công cụ Protocol Verification Generator (PVG) tự động
sinh mã aspect dựa trên phương pháp này Nội dung chính của phương pháp là dựa
vào các kiến thức về AOP và UML, XML, AUML, JADE framework để chuyển đổi các giao thức ràng buộc đối tượng được đặc tả bởi biểu đồ UML, giao thức tương tác giữa các tác tử trong hệ đa tác tử được đặc tả bởi biểu đổ AUML sang các mô-đun
aspect phục vụ quá trình kiểm chứng Ý nghĩa thực tiễn của bài toán là việc sử dụng
mã aspect vừa được tạo ra đan vào chương trình chính thông qua b ộ đan (aspect
weaver) của AspectJ để thực hiện nhiệm vụ kiểm chứng các giao thức ràng buộc giữa các đối tượng, các tác tử trong thời gian chạy
Trang 5Mụ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.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
Trang 63.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
Trang 76.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 606.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
Trang 8Danh mục ký hiệu, từ viết tắt AOP Aspect-Oriented Programming
FSM Finite State Machine
JADE Java Agent DEvelopment Framework
OOP Object Oriented Programming
PVG Protocol Verification Generator
XMI XML Metadata Interchange
XML eXtensible Markup Language
UML Unified Modeling Language
Trang 9Chương 1 Mở đầu 1.1 Đặt vấn đề
Ngày nay công nghệ thông tin đã được ứng dụng vào tất cả các lĩnh vực của đời sống xã hội Nó đã tạo ra một diện mạo mới cho xã hội và nhờ đó nền văn minh nhân loại đã được nâng lên một tầm cao mới Nói đến công nghệ thông tin là nói đến công nghệ phần mềm – một phần không thể tách rời của công nghệ thông tin Hiện nay ngành công nghệ phần mềm trên thế giới đã và đang phát triển như vũ bão Những tiến bộ vượt bậc của khoa học kỹ thuật phần cứng đã tạo điều kiện thuận lợi cho công nghệ phần mềm ngày càng phát triển không ngừng
Phần mềm được coi là sản phẩm chính của công nghệ phần mềm, được phát triển theo các mô hình, quy trình phát triển đặc biệt Quá trình phát triển phần mềm bao gồm rất nhiều giai đoạn: Thu thập yêu cầu, phân tích, thiết kế, xây dựng, kiểm tra, triển khai và bảo trì phần mềm Trong các giai đoạn đó giai đoạn kiểm tra, phát hiện, xác định và sửa các lỗi phần mềm là rất quan trọng để đảm bảo chất lượng của một phần mềm Các lỗi phần mềm có thể gây thiệt hại to lớn về tiền bạc, thời gian và công sức của con người Lỗi phần mềm được phát hiện càng muộn thì càng gây hậu quả nghiêm trọng, tốn rất nhiều thời gian và công sức để sửa chữa lỗi, thậm chí có thể phải xây dựng lại toàn bộ hệ thống từ đầu Chính ví vậy cần có các phương pháp phát hiện lỗi sớm nhằm giảm thiểu công sức để sửa chúng Để phát hiện ra những lỗi phần mềm, phần mềm cần phải được kiểm chứng (Verification) và thẩm định (Valication) [13] Kiểm chứng phần mềm là kiểm tra xem phần mềm có được thiết kế đúng và thực thi đúng như đặc tả yêu cầu hay không Thẩm định phần mềm là giai đoạn có sự hỗ trợ của khách hàng nhằm kiểm tra xem phần mềm có đáp ứng được các yêu cầu của họ hay không
Mục đích chính của kiểm chứng phần mềm là làm giảm thiểu lỗi phần mềm tới mức có thể chấp nhận được Chính vì vậy, nó có vai trò vô cùng quan trọng trong toàn bộ quy trình phát triển phần mềm và trong ngành công nghệ phần mềm hiện nay Nó đã và đang thu hút được mối quan tâm của rất nhiều nhà nghiên cứu
Giai đoạn kiểm thử trong quy trình phát triển phần mềm có mục đích kiểm tra tính đúng đắn của sản phầm phần mềm Trên thực tế, các thao tác kiểm thử đơn vị chỉ đánh giá được tính đúng sai của đầu vào và đầu ra của chương trình, không ki ểm tra được quá trình hoạt động logic của chương trình có theo đúng đ ặc tả ban đầu hay
Trang 10không Những đơn vị chương trình nhỏ này nếu không được kiểm tra kỹ sẽ có thể gây ra thiệt hại nặng nề khi tích hợp chúng để tạo thành chương trình hoàn ch ỉnh Vấn đề đặt ra là cần có phương pháp kiểm chứng các đặc tả giao thức giữa các đối tượng, các tác tử ngay trong thời gian chạy, đánh giá xem trong thời gian chạy đối tượng hay tác tử phần mềm có vi phạm các giao thức ràng buộc đã được đặc tả hay không, và từ đó đảm bảo chắc chắn hơn tính đúng đắn của sản phầm phần mềm Trong khóa luận này, tôi xin giới thiệu phương pháp tự động sinh mã aspect kiểm chứng đặc tả giao thức trong thời gian chạy, dựa trên phương pháp lập trình hư ớng khía cạnh (Aspect – Oriented Programming)
1.2 Nội dung bài toán
Hiện nay có rất nhiều phương pháp kiểm chứng phần mềm như giả lập hay kiểm chứng mô hình Trong phạm vi bài toán được đặt ra ở đây, tôi muốn đề cập tới phương pháp kiểm chứng phần mềm dựa trên phương pháp lập trình hư ớng khía cạnh (AOP) [7, 12] Lĩnh vực kiểm chứng cụ thể trong phạm vi bài toán là kiểm chứng giao thức đặc tả hoạt động của các đối tượng Java và kiểm chứng giao thức giữa các tác tử trong hệ đa tác tử (giao thức được mô tả bằng biểu đồ trạng thái và biểu đồ trình tự UML, AUML) trong thời gian chạy
Trong cách tiếp cận này, một ứng dụng hướng đối tượng được đặc tả bằng mô hình UML và được cài đặt bằng ngôn ngữ Java; một hệ đa tác tử được đặc tả bằng các biểu đồ AUML và được cài đặt dựa trên JADE framework Các aspect sau đó sẽ được
đan vào khung mã Java đ ể kiểm tra tại bất kỳ thời điểm nào trong thời gian chạy, các
đối tượng Java, các tác tử phần mềm hoạt động vi phạm giao thức đã đặc tả (aspect là
mô-đun cắt ngang hệ thống) Bài toán có nhiệm vụ là tạo ra được các aspect từ biểu đồ
trạng thái và biểu đồ trình tự UML; dùng công cụ AspectJ để đan các aspect này vào khung chương trình Java chính Khi đó, trong quá trình ch ạy của chương trình, các
đoạn mã aspect sẽ tự động kiểm tra các đặc tả giao thức và đưa ra thông báo lỗi khi có
bất kỳ vi phạm nào xảy ra Trong khi phương pháp kiểm thử đơn vị chỉ xác định được tính đúng đắn của đầu vào và đầu ra của chương trình, không kiểm tra được những lỗi logic thì phương pháp kiểm tra tính đúng đắn ngay tại thời gian chạy của chương trình sẽ đem lại hiệu quả rất lớn
Nhiệm vụ chính của bài toán là xây dựng phương pháp tạo ra các đoạn mã aspect
để kiểm chứng, xây dựng công cụ Protocol Verification Generator(PVG) tự động sinh mã aspect kiểm chứng từ đặc tả giao thức bằng biểu đồ trạng thái và biểu đồ trình tự UML, AUML Tôi xin đề cập hướng nghiên cứu kiểm chứng đặc tả UML cho tác tử
Trang 11phần mềm để kiểm chứng giao thức giữa các đối tượng Java trong thời gian chạy và kiểm chứng giao thức giữa các tác tử trong hệ đa tác tử được xây dựng trên JADE framework Từ một biểu đồ trạng thái hay biểu đồ trình tự UML, AUML xuất ra tài liệu XMI đặc tả các biểu đồ này Các tài liệu XMI chính là đầu vào cho công cụ cần xây dựng Dựa vào các kiến thức về UML, XML tôi sẽ phân tích tài liệu XMI, xây dựng máy trạng thái (FSM) mô tả các biểu đồ UML, AUML Sử dụng máy trạng thái vừa tạo để sinh ra mã aspect phục vụ cho việc kiểm chứng sau này Mã aspect chính là đầu ra cuối cùng của công cụ
1.3 Tổng quan phương pháp “Kiểm chứng đặc tả UML cho tác tử phần mềm”
Bài toán bắt đầu với đầu vào là một biểu đồ trạng thái hay biểu đồ trình tự UML, các biểu đồ này sẽ được xuất ra dạng XMI Sau đó, lấy ra các thông tin cần thiết mô tả các đối tượng của biểu đồ và chuyển thành một máy trạng thái (FSM) Lập trình viên sẽ phát triển các mô-đun nghiệp vụ chính từ hai biểu đồ này và các biểu đồ UML khác còn lại Song song với nó là quá trình xây dựng các mô-đun cắt ngang hệ thống thành
các aspect từ máy trạng thái Bài báo “Checking Interface Interaction Protocols Using
Aspect-oriented Programming” [5] đã xây dựng phương pháp kiểm chứng giao thức xử dụng AOP Dựa vào nội dung phương pháp này tôi đã xây d ựng công cụ tự động hóa việc sinh các mô-đun aspect với đầu vào là tài liệu XMI mô tả biểu đồ trạng thái
hay biểu đồ trình tự UML Phương pháp xây dựng công cụ Protocol Verification
Generator của tôi gồm hai bước:
- Bước1: Phân tích tài liệu XMI, lấy các thông tin cần thiết mô tả biểu đồ
UML để xây dựng máy trạng thái Đầu tiên, tôi sẽ phân tích tài liệu XMI, xây dựng các cấu trúc dữ liệu mô tả các thành phần của biểu đồ UML bằng ngôn ngữ Java, sau đó sử dụng thư viện XML DOM đọc tài liệu XMI này, lấy dữ liệu theo cấu trúc đã định nghĩa trước, tạo ra FSM
- Bước 2: Xây dựng bộ sinh tự động aspect từ FSM: Sử dụng FSM vừa
được sinh ra, duyệt từng trạng thái trong FSM, áp dụng phương pháp cài
đặt aspect trong bài báo nói trên, tôi sẽ tạo ra các join point, pointcut và
advice từ các trạng thái đó để hình thành mô-đun aspect
Trong hình minh họa dưới đây, tôi sẽ xây dựng công cụ Protocol Verification
Generator Kết quả thu được là các đoạn mã aspect sẽ được đan vào chương trình Java
thông qua trình biên dịch AspectJ Kết quả cuối cùng của quá trình này chính là hệ
Trang 12thống có chứa những đoạn mã kiểm chứng Trong quá trình thực thi, kể cả trong thời gian chạy, bất cứ khi nào xảy ra vi phạm ràng buộc đã định nghĩa trong biểu đồ UML thì chương trình đều báo thông báo lỗi cho lập trình viên, chỉ ra vị trí dòng mã nguồn sai đặc tả trong mã nguồn của chương trình Nh ờ đó, lập trình viên có thể kiểm soát được hệ thống và làm cho hệ thống chạy ổn định và đúng đắn hơn
Use Case DiagramClass Diagram
Sequence DiagramState Diagram
XMI File (*.xmi, *.xml)
AspectJ Generator
Bytecode withProtocol checking
Hình 1.1: Quy trình kiểm chứng phần mềm dựa vào AOP
1.4 Cấu trúc khóa luận
Các phần còn lại của khóa luận được phân bố như sau:
Chương 2: Giới thiệu về phương pháp lập trình hướng khía cạnh Trong chương
này tôi sẽ đưa ra những so sánh giữa hai phương pháp OOP và AOP, từ đó nêu bật những ưu điểm của AOP; vai trò và ý nghĩa c ủa AOP đối với công nghệ phần mềm hiện nay Đồng thời, tôi cũng gi ới thiệu công cụ AspectJ – một cài đặt của AOP cho ngôn ngữ lập trình Java
Chương 3: Trình bày sơ qua v ề các kiến thức về: UML, XML, XMI; trình bày
một số khái niệm về tác tử phần mềm, phần mềm hướng agent và AUML – mở rộng từ
UML để mô tả các hệ thống dựa tác tử Giới thiệu JADE – một framework hỗ trợ xây dựng hệ đa tác tử trên ngôn ngữ Java Đây là nền tảng kiến thức căn bản để xây dựng công cụ tự sinh mã aspect trong khóa luận của tôi
Chương 4: Trình bày phương pháp xây dựng máy trạng thái mô tả biểu đồ trạng
thái và biểu đồ trình tự UML Trong chương này, tôi sẽ trình bày cách phân tích tài
Trang 13liệu XMI mô tả các biểu đồ UML, từ đó xây dựng các cấu trúc dữ liệu cần thiết để lấy dữ liệu từ tài liệu XMI hình thành nên máy trạng thái
Chương 5: Xây dựng công cụ tự sinh mã aspect từ máy trạng thái Trong
chương này, tôi sẽ trình bày chi tiết thuật toán sinh mã aspect từ máy trạng thái mô tả
biểu đồ UML Đồng thời tôi trình bày phương pháp sinh mã aspect kiểm chứng giao
thức (AB)n – một mở rộng cho công cụ Protocol Verification Generator
Chương 6: Cài đặt công cụ Protocol Verification Generator tự sinh aspect Sau
đó, tiến hành kiểm chứng một số giao thức thực tế
Chương 7: Đưa ra các kết luận của khóa luận và hướng nghiên cứu tiếp theo
trong tương lai
Trang 14Chương 2 Giới thiệu lập trình hư ớng khía cạnh (Aspect-Oriented Programming) và AspectJ
2.1 Phương pháp lập trình hướng khía cạnh
Có lẽ các khái niệm về lập trình hướng khía cạnh (AOP) hiện nay đã được nhiều người biết đến, vì vậy ở đây tôi sẽ chỉ trình bày lại ngắn gọn các khái niệm cơ bản và đặc điểm chính của AOP Để trả lời được câu hỏi AOP là gì? Tại sao phải có AOP? chúng ta sẽ bắt đầu tìm hiểu sự hạn chế của các phương pháp lập trình hiện tại trong việc đáp ứng các yêu cầu ngày càng phức tạp của các hệ thống phần mềm
Như chúng ta đã bi ết trong OOP người ta cố gắng mô tả thế giới thực thành các đối tượng với các thuộc tính và phương thức; cùng với các tính chất của lập trình hướng đối tượng như: tính trừu tượng, tính đóng gói, tính kế thừa và đa hình đã làm thay đổi hoàn toàn ngành công nghiệp phần mềm
Hình 2.1: OOP
Ta xét một bài toán cụ thể: Cần xây dựng một chương trình vẽ hình đơn giản như hình vẽ mô tả dưới đây:
Trang 15Hình 2.2: Mô tả chương trình vẽ hình đơn giản Một phân tích đơn giản cho yêu cầu của bài toán:
- Các hình học cơ bản: điểm, đoạn thẳng, hình chữ nhật, hình tròn… - Hiển thị các hình ở các vị trí khác nhau trong khung vẽ
- Phải cập nhật lại hình tại vị trí mới mỗi khi di chuyển, co giãn hình Sử dụng OOP ta sẽ mô hình hóa yêu cầu thành các đối tượng như sau:
- Lớp Shape: là một lớp Abstract chứa phương thức moveBy(int, int) – di chuyển hình
Trang 16Hình 2.3: Sơ đồ lớp cho bài toán vẽ hình
Mô hình hóa thành các lớp như vậy ta thấy bài toán đã tương đối ổn Bây giờ vấn đề đặt ra là mỗi khi ta thay đổi tọa độ của một điểm hay co giãn hình, di chuyển hình ta lại phải vẽ lại hình ở vị trí mới – tức là phải update lại Display
Xét lớp đơn giản nhất là lớp Point, Khi đặt lại tọa độ x, tọa độ y, hay di chuyển
Point từ vị trí này sang vị trí khác, ta đều phải update lại Display thông qua phương
thức display.update(this) Như vậy, cùng một phương thức display.update(this), ta
phải gõ lại ở ba vị trí khác nhau ứng với ba sự thay đổi Hãy thử tưởng tượng xem nếu chương trình của chúng ta đủ lớn và có khoảng vài ngàn sự thay đổi kiểu như thế thì dòng mã nguồn display.update(this) sẽ phải xuất hiện ở hàng ngàn chỗ khác nhau
Đối với lớp Line hay các lớp khác cũng vậy Mỗi khi có sự thay đổi hình thì ngay
sau sự thay đổi đó sẽ có dòng mã nguồn display.update(this) đi kèm theo nó
Hình 2.4: Cập nhật hình khi có sự thay đổi
Trang 17Giả sử chương trình vẽ hình của chúng ta đã hoàn thành mỹ mãn với đầy đủ các chức năng cơ bản Đột nhiên, khách hàng yêu cầu cần phải ghi lại những sự thay đổi khi vẽ hình ra một file log.txt Ôi! Điều này thực sự là rất khổ sở cho lập trình viên khi phải dò lại toàn bộ mã nguồn, xem đoạn nào có sự thay đổi hình, chèn thêm vào đó một dòng mã nguồn có chức năng lưu vết ra file log.txt
Ta có thể chia các chức năng của một phần mềm ra làm hai loại chính:
- Thứ nhất là các chức năng thực hiện các nghiệp vụ chính, nghiệp vụ cơ bản của hệ thống (ví dụ như chức năng vẽ điểm, vẽ đoạn thẳng, vẽ hình khối trong bài toán vẽ hình ở trên)
- Thứ hai, những chức năng dàn trải trên rất nhiều các mô-đun nghiệp vụ chính – được gọi là các chức năng cắt ngang hệ thống (ví dụ: cập nhật hình, lưu vết, bảo mật) hay được gọi là crosscutting concern
OOP có thể giải quết rất tốt những chức năng chính của hệ thống, nhưng lại gặp rất nhiều khó khăn trong việc giải quyết các chức năng cắt ngang hệ thống Khi sử dụng OOP để thực hiện các chức năng cắt ngang hệ thống, hệ thống sẽ gặp phải hai vấn đề chính, đó là: chồng chéo mã nguồn (Code tangling) và dàn trải mã nguồn (Code scattering) [12]
- Chồng chéo mã nguồn: Mô-đun chính của hệ thống ngoài việc thực hiện
các yêu cầu chính, nó còn phải thực hiện các yêu cầu khác như: tính đồng bộ, bảo mật, lưu vết, lưu trữ Như vậy, trong một mô-đun có rất nhiều loại mã khác nhau, hiện tượng này gọi là chồng chéo mã nguồn Điều này làm cho tính mô-đun hóa của hệ thống giảm đi, khả năng sử dụng lại mã nguồn thấp, khó bảo trì hệ thống
- Dàn trải mã nguồn: Cùng một mã nguồn của các chức năng cắt ngang hệ
thống được cài đặt lặp đi lặp lại rất nhiều lần ở nhiều mô-đun chính của hệ thống Ví dụ như trong chương trình vẽ hình ở trên, mã nguồn của chức năng cập nhật hình, lưu v ết xuất hiện ở tất cả các mô-đun của hệ thống Hiện tượng này gọi là dàn trải mã nguồn
2.1.2 Lập trình hướng khía cạnh (AOP)
Lập trình hướng khía cạnh được xây dựng trên các phương pháp lập trình hiện tại như lập trình hư ớng đối tượng, lập trình có cấu trúc, bổ sung thêm các khái niệm và cấu trúc để mô-đun hóa các chức năng cắt ngang hệ thống (crosscutting concern) Với
AOP, các quan hệ cơ bản sử dụng các phương pháp cơ bản Nếu sử dụng OOP, sẽ thực
Trang 18thi các quan hệ cơ bản dưới hình thức lớp (class) Các aspect trong hệ thống đóng gói
các chức năng cắt ngang hệ thống lại với nhau Chúng sẽ quy định cách các mô-đun khác nhau gắn kết với nhau để hình thành lên hệ thống cuối cùng
Nền tảng cơ bản của AOP khác với OOP là cách quản lý các chức năng cắt ngang hệ thống Việc thực thi của từng chức năng cắt ngang AOP bỏ qua các hành vi được tích hợp vào nó Ví dụ một mô-đun nghiệp vụ sẽ không quan tâm nó cần được
lưu vết hoặc được xác thực như thế nào, kết quả là việc thực thi của từng concern tiến
triển một cách độc lập
Quay trở lại với ví dụ về chương trình vẽ hình đơn giản ở phần trên Nếu sử dụng AOP, các chức năng cắt ngang hệ thống: cập nhật hình, lưu vết sẽ được giải quyết theo cách sau:
Thay vì tích hợp chức năng các mô-đun cắt ngang hệ thống (cập nhật hình, lưu vết) ngay trong mô-đun nghiệp vụ chính; lập trình viên sẽ tách chúng ra thành các mô-
đun mới, gọi là aspect Hình 2.5 minh họa cho việc thực thi chức năng cập nhật hình
bằng AOP và dưới đây là mã nguồn của aspect đó
publicaspect UpdateSignaling {
pointcut updateDisplay(): execution(void *.setX(int)) || execution(void *.setY(int))
|| execution(void *.moveBy(int,int));
after(): updateDisplay() {
display.update(this); }
}
Hình 2.5: Dùng AOP giải quyết bài toán vẽ hình
Trang 19Sau khi định nghĩa một aspect như vậy thì bất cứ khi nào có sự thay đổi về hình
(setX, setY, moveBy) chương trình s ẽ tự động gọi chức năng cập nhật hình, cụ thể ở
đây là phương thức display.update(this) mà ta không cần phải lục lọi lại các đoạn mã
nguồn để thêm nó dòng mã nguồn này vào (các khái niệm cơ bản của aspect như:
advice, join point, pointcut, aspect tôi sẽ trình bày cụ thể trong phần 2.2 nói về AspectJ)
2.1.2.1 Phương pháp luận của AOP
Vấn đề cốt lõi của AOP là cho phép chúng ta thực hiện các vấn đề riêng biệt một cách linh hoạt và kết nối chúng lại để tạo nên hệ thống cuối cùng AOP bổ xung cho OOP bằng việc hỗ trợ một dạng mô-đun khác, cho phép kéo theo thể hiện chung của các vấn đề đan nhau vào một khối Khối này gọi là ‘aspect’ (tạm dịch là ‘lát’ – hàm ý cắt ngang qua nhiều lớp đối tượng) Từ chữ ‘aspect’ này chúng ta có mội phương pháp lập trình mới: Aspect-Oriented Programming Nhờ mã được tách riêng biệt, các vấn đề
đan xen nhau trở nên dễ kiểm soát hơn Các aspect của hệ thống có thể thay đổi, thêm
hoặc xóa lúc biên dịch và có thể tái sử dụng Một dạng biên dịch đặc biệt có tên là
Aspect Weaver thực hiện việc kết hợp các thành phần riêng lẻ thành một hệ thống thống nhất
2.1.2.2 Ưu điểm của AOP
AOP là một kỹ thuật mới đầy triển vọng, hứa hẹn đem lại nhiều lợi ích cho việc phát triển phần mềm, dưới đây là một số lợi ích cụ thể của AOP [12]:
- Mô-đun hóa những vấn đề đan xen nhau: AOP xác định vấn đề một
cách riêng biệt, cho phép mô-đun hóa những vấn đề liên quan đến nhiều lớp đối tượng
- Tái sử dụng mã nguồn tốt hơn: Các aspect là những mô-đun riêng biệt,
được kết hợp linh động – đây chính là yếu tố quan trọng để tái sử dụng mã nguồn
- Cho phép mở rộng hệ thống dễ dàng hơn: Một thiết kế tốt phải tính đến
cả những yêu cầu hiện tại và tương lai, việc xác định các yêu cầu trong tương lai là một công việc khó khăn Nhưng nếu bỏ qua các yêu cầu trong tương lai, có thể bạn sẽ phải thay đổi hay thực hiện lại nhiều phần của hệ thống Với AOP, người thiết kế hệ thống có thể để lại quyết định thiết kế cho những yêu cầu trong tương lai nhờ thực hiện các aspect riêng biệt
Trang 202.2 AspectJ
AspectJ là sự mở rộng theo mô hình AOP của ngôn ngữ Java, với sự mở rộng này mã chương trình viết bằng Java sẽ tương thích với chương trình viết bằng AspectJ
AspectJ gồm hai phần cơ bản là:
- Đặc tả ngôn ngữ: Chỉ ra cách viết mã, với AspectJ các chức năng cơ bản
của hệ thống sẽ được viết bằng Java còn các chức năng cắt ngang hệ thống sẽ được thực hiện bởi AspectJ
- Phần thực thi: Cung cấp các công cụ biên dịch, gỡ lỗi AspectJ đã đư ợc
plugin vào công cụ phát triển Eclipse (http://www.eclipse.org/) và được đánh giá là sản phẩm tốt nhất hiện nay về AOP
Một số khái niệm cơ bản trong AspectJ:
2.2.1 Join point
Join point là bất kỳ điểm nào có thể xác định được khi thực hiện chương trình [7, 12] Ví dụ: lời gọi hàm, khởi tạo đối tượng Join point chính là vị trí mà các hành động thực thi cắt ngang được đan vào Trong AspectJ mọi thứ đều xoay quanh join point
Một số loại join point chính trong AspectJ: - Join point tại hàm khởi tạo (constructor)
- Join point tại các phương thức
- Join point tại các điểm truy cập thuộc tính
- Join point tại các điểm điều khiển ngoại lệ: Được điều khiển trong khối
điều khiển ngoại lệ
Cú pháp của pointcut được khai báo như sau:
[access specifier] pointcut name([args]) :
pointcut-definition;
Ví dụ:
public pointcut test(): call(void Line.setP1(Point));
Trang 21Bảng 2.1: Ánh xạ giữa các loại join point và pointcut tương ứng:
Loại join point Cú pháp pointcut
Thực hiện phương thức execution(MethodSignature)
Gọi phương thức call(MethodSignature)
Thực hiện hàm dựng execution(ConstructorSignature)
Gọi hàm dựng call(ConstructorSignature)
Khởi tạo lớp staticinitialization(TypeSignature)
Đọc thuộc tính get(FieldSignature)
Ghi thuộc tính set(FieldSignature)
Thực hiện điều khiển ngoại lệ
execution handler(TypeSignature)
Khởi tạo đối tượng initialization(ConstructorSignature)
Tiền khởi tạo đối tượng preinitialization(ConstructorSignature)
Thực hiện advice adviceexecution()
2.2.3 Advice
Advice là mã thực hiện tại một join point mà được chọn bởi pointcut [7, 12] Hay
nói cách khác, nếu ta coi pointcut là khai báo tên phương thức, thì advice là phần thân
của phương thức đó Pointcut và advice sẽ hình thành nên các luật đan kết các quan hệ
đan xen
Advice được chia ra làm ba loại sau:
- Before: Được thực hiện trước join point - After: Được thực hiện sau join point - Around: Thực thi xung quanh join point
Giả sử ta có pointcut được khai báo như sau:
pointcut updateDisplay(): execution(void *.moveBy(int,int))
Ta có thể xây dựng các advice như sau: - Before advice thự hiện lưu vết
before() : updateDisplay() {
Trang 22// logging }
- After advice thực hiện cập nhật hình
after() : updateDisplay() { display.update(this); }
Ví dụ về around advice dùng để kiểm tra thuộc tính age của lớp Person trong phương thức setAge() có vi phạm điều khiện không (điều kiện: age > 0)
voidaround(Person person, int age):setAge(person, age) {
if(age > 0)
Process(person,age); else
System.out.println("Invalid Age!"); }
2.2.4 Aspect
Aspect là phần tử trung tâm của AspectJ, giống như class trong Java Aspect chứa
mã thể hiện các luật đan kết cho các concern Join point, pointcut, advice được kết hợp trong aspect [7, 12]
Aspect được khai báo theo mẫu sau:
[access specification] aspect <AspectName> [extends class-or-aspect-name]
[implements interface-list]
[<association-specifier>(Pointcut)] { aspect body
Ví dụ:
public abstractaspect AbstractLogging { public abstract pointcut logPoints(); public abstract Loger getLogger(); before():logPoints()
{
getLogger().log(Level.INFO, “Before” + thisJoinPoint); }
}
Tuy có gần giống các đặc điểm của class trong Java như: chứa thuộc tính,
phương thức, có thể khai báo trừu tượng, có thể kế thừa… Tuy nhiên, Aspect có một
số khác biệt cơ bản sau:
Trang 23- Aspect không thể khởi tạo trực tiếp
- Aspect không thể kế thừa từ một aspect cụ thể (không phải trừu tượng)
Aspect có thể được đánh dấu là có quyền bằng định danh privileged Nhờ đó nó
có thể truy cập đến các thành viên của lớp mà chúng cắt ngang
Aspect compiler là thành phần trung tâm của AspectJ, nó có nhiệm vụ kết hợp các file mã nguồn Java với các aspect lại với nhau để tạo ra chương trình cu ối cùng Quá trình dệt có thể xảy ra ở các thời điểm khác nhau: compile – time, link – time và load – time [7]:
- Compile – time: Dệt trong thời gian biên dịch là cách đơn giản nhất Mã nguồn Java và các aspect sẽ được kết hợp với nhau trước khi trình biên
dịch dịch mã nguồn ra dạng byte code Hay nói cách khác, trước khi biên
dịch, các mã aspect sẽ được phân tích, chuyển đổi sang dạng mã Java và
được chèn chính xác vào các vị trí đã định nghĩa sẵn trong mã nguồn Java chính của chương trình Sau đó trình biên dịch sẽ dịch mã đã được dệt này ra dạng byte code AspectJ 1.0.x sử dụng cách này để dệt chương trình
- Link – time: Quá trình dệt được thực hiện sau khi mã nguồn Java và các
aspect được biên dịch ra dạng byte code Một bộ xử lý tĩnh được sử dụng
để đánh dấu các điểm gọi hàm trong mã được viết bằng java Khi một hàm được thực thi Runtime system sẽ phát hiện ra điểm nào cần gọi đến mã
aspect để thực thi và khi đó mã aspect sẽ được gọi để đan vào chương trình
chính AspectJ 1.1.x sử dụng cách này để dệt chương trình
- Load – time: Quá trình dệt được thực hiện khi máy ảo Java tải một class
vào để chạy Theo cách này, mã nguồn Java và các aspect được biên dịch
ra dạng byte code Quá trình dệt diễn ra khi classloader nạp một class
AspectJ 1.5.x sử dụng cách này để dệt chương trình
kiểm chứng dựa trên AOP
Ngày nay, AOP được ứng dụng rộng rãi trong việc phát triển phần mềm Phát triển hệ thống sử dụng AOP tương tự như phát triển hệ thống sử dụng các phương pháp khác, cũng g ồm các bước như: xác định concern, cài đặt concern và kết hợp
Trang 24chúng lại tạo thành hệ thống cuối cùng Cộng đồng nghiên cứu AOP đề xuất ba bước [12] thực hiện như sau:
- Phân tích bài toán theo khía cạnh (Aspectual decomposition): Trong
bước này chúng ta phân tích các yêu cầu nhằm xác định các chức năng chính của hệ thống và các chức năng cắt ngang hệ thống Các phương thức cắt ngang hệ thống được tách ra khỏi các chức năng chính
- Xây dựng các chức năng (Concern Implementation): Cài đặt các chức
năng một cách độc lập
- Kết hợp các khía cạnh lại để tạo nên hệ thống hoàn chỉnh (Aspectual Recompositon): Trong bước này chúng ta chỉ ra các quy luật kết hợp bằng cách tạo ra các aspect Quá trình này gọi là quá trình dệt mã, sử dụng các thông tin trong aspect để cấu thành hệ thống cuối cùng
Hình 2.6: Các giai đoạn phát triển ứng dụng sử dụng AOP
AOP đã được nghiên cứu và áp dụng vào rất nhiều ngôn ngữ lập trình như: Java, C, C#, PHP Một số dự án được liệt kê trong bảng dưới đây:
Bảng 2.2: Các dự án nghiên cứu AOP
1 AspectJ http://www.eclipse.org/aspectj/
1 AspectWerkz http://aspectwerkz.codehaus.org/
2 Jboss AOP http://jboss.org/
3 Sping AOP http://www.springsource.org/
4 Aspect# http://sourceforge.net/projects/aspectsharp/
5 AspectC++ http://aspectc.org/
6 JAC http://jac.ow2.org/
Trang 25Từ khả năng mô-đun hóa các quan hệ đan xen, các chức năng cắt ngang hệ thống; tách rời sự hoạt động của các mô-đun cũng như nhiều ưu điểm khác của AOP so với OOP mà hiện nay AOP đã trở thành sự lựa chọn phù hợp cho rất nhiều hệ thống phần mềm; đặc biệt là trong các chức năng lưu vết, bảo mật, xác thực của hệ thống phần mềm Ngoài ra, do các mã aspect độc lập với mã nguồn chính của chương trình, có thể sửa đổi tùy theo ý muốn của lập trình viên, chính vì vậy AOP còn đư ợc ứng dụng rất lớn vào các loại kiểm chứng trong quá trình thiết kế phần mềm Ví dụ như: kiểm chứng giao thức [5], kiểm tra việc gọi tuần tự các hàm trong chương trình [15]…
Nội dung chính của các phương pháp kiểm chứng dựa trên AOP là dựa vào những kiến khái niệm cơ bản của AOP như: join point, pointcut, advice, aspect để xây
dựng nên các mô-đun kiểm chứng (các aspect) từ các chức năng cắt ngang hệ thống Các aspect này sẽ được đan vào khung mã ngu ồn chương trình thông qua trình biên
dịch AspectJ để thực hiện chức năng kiểm chứng
2.4 Kết luận
Trong chương 2 này, tôi trình bày tất cả những khái niệm cơ bản về phương pháp lập trình hướng khía cạnh AOP và AspectJ – sự mở rộng của AOP cho Java Ứng dụng của AOP vào phát triển và kiểm chứng phần mềm AOP vẫn là một ý tưởng mới, vẫn cần có thời gian để đánh giá, tìm hiểu các kỹ thuật hiện có và để phát triển, ứng dụng rộng rãi
Trang 26Chương 3 Agent UML và JADE framework
3.1.1 Khái niệm
UML (Unified Modeling Language) là ngôn ngữ mô hình hóa đư ợc sử dụng để biểu diễn, đặc tả và xây dựng các thành phần của hệ thống phần mềm Nó là một chuẩn của tổ chức OMG (Object management Group) [11] UML giúp người sử dụng mô tả được các tài liệu đặc tả yêu cầu, tài liệu phân tích và tài liệu thiết kế ứng dụng Hiện nay, nó được dùng để mô tả hình hóa gần như toàn bộ các hệ thống phần mềm từ nhỏ tới lớn, từ đơn giản tới phức tạp trên thế giới
UML sử dụng một hệ thống ký hiệu thống nhất để biểu diễn các phần tử mô hình Tập các phần tử mô hình tạo nên các biểu đồ UML Có nhiều loại biểu đồ UML như: biểu đồ ca sử dụng, biểu đồ lớp, biểu đồ tuần tự, biểu đồ trạng thái, biểu đồ hoạt động… Ở đây tôi chỉ trình bày hai loại biểu đồ được sử dụng làm đầu vào cho nghiên cứu của tôi; đó là: biểu đồ trạng thái (State Diagram) và biểu đồ trình tự (Sequence
Diagram)
Biểu đồ trạng thái là một sự bổ sung cho lời miêu tả biểu đồ lớp Nó mô tả chu kỳ tồn tại của đối tương từ khi sinh ra đến khi bị phá hủy Nó chỉ ra tất cả các trạng thái mà đối tượng của lớp này có thể có, các hành vi của đối tượng và những sự kiện tác động làm thay đổi trạng thái
Trang 27- State variables (các biến trạng thái – không bắt buộc): đây là những thuộc tính của lớp được thể hiện qua biểu đồ trạng thái
- Activities (sự kiện – không bắt buộc): Đây là phần dành cho hoạt động nơi mà các sự kiện và hành động và liệt kê Có ba loại sự kiện chuẩn hóa có
- Change events: Xuất hiện khi điều kiện thỏa mãn
- Signal events: Chỉ ra việc nhận một tín hiệu ngoài từ một đối tượng sang
đối tượng khác
- Call events: Chỉ ra việc nhận một lời gọi hàm bởi một đối tượng hoặc tác
nhân
- Time events: Đánh dấu việc chuyển trạng thái sau một khoảng thời gian
3.1.3 Biểu đồ trình tự (Sequence Diagram)
Biểu đồ trình tự minh họa các đối tượng tương tác với nhau ra sao Chúng tập trung vào các chuỗi thông điệp, có nghĩa là các thông điệp gửi và nhận giữa một loạt các đối tượng như thế nào Biểu đồ tuần tự có hai trục: trục dọc chỉ thời gian, trục nằm ngang chỉ ra một tập các đối tượng Ví dụ:
Hình 3.2: Biểu đồ tuần tự rút tiền từ máy ATM
Một biểu đồ tuần tự cũng nêu bật sự tương tác giữa các đối tượng trong một kịch bản – một tương tác sẽ xảy ra tại một thời điểm nào đó trong quá trình thực thi hệ thống
Trang 28Biểu đồ tuần tự gồm hai thành phần chính: - Các đối tượng
- Các thông điệp trao đổi giữa các đối tượng
3.2 XML (eXtensible Markup Language)
XML kết hợp những ưu điểm của các ngôn ngữ trước đó (sự đơn giản của HTML và cấu trúc mô tả tài liệu của SGML), có khả năng mô tả nhiều loại dữ liệu khác nhau với mục đích là đơn giản hóa việc chia sẻ dữ liệu giữa các hệ thống khác nhau, đặc biệt là các hệ thống được kết nối với Internet XML là ngôn ngữ đánh dấu với mục đích chung cho W3C đề nghị [6]
XML là một ngôn ngữ đánh dấu, nó gần giống với HTML (Hypertext markup Language) Nó cung cấp một phương tiện dùng văn bản để mô tả thông tin và áp dụng một cấu trúc kiểu cây cho thông tin đó Mọi thông tin đều hiển thị dưới dạng văn bản (text), chen giữa các thẻ đánh dấu (markup) với nhiệm vụ ký hiệu sự phân chia thông tin thành một cấu trúc có thứ bậc của các dữ liệu ký tự [6]
Nội dung của một tài liệu XML gồm hai phần chính:
- Nội dung chính: Hệ thống các thẻ đánh dấu tương ứng với các thông tin cần biểu diễn và có một node gốc
- Nội dung phụ: Bổ sung thông tin cho tài liệu XML, một số thẻ phụ: o Thẻ khai báo tham số: <?xml Ten1=“Giatri1”… ? >
Một số tham số thường dùng như: tham số version (phiên bản chỉ
định của XML), tham số encoding (cách mã hóa các ký tự), tham số
standalone (liên kết với tài liệu xml khác)
o Thẻ chỉ thị xử lý: Mô tả một số thông tin cho tài liệu XML nhưng có ý nghĩa riêng đối với một vài công cụ xử lý nào đó C ấu trúc: <?
Bo_Xu_Ly_Du_Lieu >
Ví dụ: <?xml-stylesheet type=“text/css” href=“a.css” ?>
Định dạng thể hiện tài liệu XML với “chương trình đ ịnh dạng” theo ngôn ngữ CSS được lưu trữ bên trong tệp tin a.css Thẻ này
có ý nghĩa với một số trình duyệt như IE5, Netscape o Thẻ ghi chú: Không ảnh hưởng đến tài liệu XML
Trang 29Cấu trúc: < Nội dung ghi chú >
o Thẻ CDATA: Yêu cầu các bộ phân tích tài liệu XML bỏ qua không phân tích vào nội dung bên trong của thẻ này Mục đích chính của thẻ này là cho phép sử dụng trực tiếp bên trong thẻ một số ký hiệu không được phép sử dụng bên ngoài Ví dụ các ký tự ‘<’, ‘>’
Cấu trúc: <![CDATA [Nội dung]]>
o Thẻ khai báo thực thể: cho phép tài liệu XML tham chiếu đến một tập hợp các giá trị đã chuẩn bị trước dưới dạng một tên gợi nhớ (tên thực thể)
Khai báo: <!DOCTYPE Ten_goc[ Khai báo thực thể tên X Khai báo thực thể tên Y] o Thẻ khai báo cấu trúc
Các thẻ XML không được định nghĩa trước trong cú pháp XML, người sử dụng có thể tự định nghĩa theo các thẻ theo ý thích khi sử dụng XML XML sử dụng DTD hoặc XML schema để mô tả dữ liệu XML biểu diễn dữ liệu bằng cách sử dụng các thành phần XML, trong đó chứa một trong các thành phần sau đây:
- Thẻ bắt đầu: Chứa tên của thành phần
- XML attributes: Các thuộc tính, mỗi thuộc tính có tên và giá trị
- Nội dung: Có thể chứa một đoạn văn bản hoặc thuộc tính, cũng có th ể chứa cả hai
- Thẻ kết thúc, giống với tên của thẻ bắt đầu Ví dụ về một tài liệu XML:
XML đã trở thành một công cụ rất mạnh và đơn giản để lưu trữ dữ liệu trên các file Nó cho phép bạn lưu trữ dữ liệu theo mẫu và có thể truy xuất được bằng các ứng
version="1.0" encoding="UTF-8"?> <edge type="directed ">
<from id="n1"/> <to id="n2"/> </edge>
<comment> An edge of one graph</comment>
Có 6 thành phần XML trong tài liệu này Đầu tiên là chỉ thị xử lý, Phần tử edge
chứa thuộc tính có tên là type và giá trị là directed Phần tử edge chứa hai phần tử con
là from và to chúng có hai thuộc tính là id Phần tử comment chứa nội dung là một
đoạn văn bản (text)
Trang 30dụng khác nhau, nhưng nó không thể tạo ra dữ liệu Bằng cách sử dụng các API như DOM, SAX, bạn có thể truy xuất dữ liệu từ một tài liệu XML rất dễ dàng
3.2.2 XML DOM
3.2.2.1 DOM
“The W3C Document Object Model (DOM) is a platform and language-neutral
interfacethat allows programs and scripts to dynamically access and update the
content, structure, and style of a document” [http://www.w3.org/] DOM gồm ba phần riêng biệt:
- Core DOM: Định nghĩa các đối tượng chuẩn cho các tài liệu có cấu trúc
- XML DOM: Định nghĩa tập hợp các đối tượng chuẩn cho tài liệu XML
- HTML DOM: Định nghĩa tập các đối tượng chuẩn cho tài liệu HTML
3.2.2.2 XML DOM
XML DOM định nghĩa các đối tượng và thuộc tính của tất cả các thẻ của tài liệu XML và các phương thức (giao diện) để truy xuất chúng Nó là một chuẩn để truy xuất, thêm, xóa, sửa các thẻ XML
Trong DOM, mọi thứ trong tài liệu đều là nút (node):
- Toàn bộ tài liệu là một nút tài liệu (document node) – cây node
o Một cây gồm nhiều node
o Node cao nhất gọi là root
o Mỗi node, trừ root ra có chính xác một node cha
o Một node có nhiều node con
o Node lá là node không có node con
- Mọi thẻ XML là một nút thẻ (element node)
- Text trong các thẻ XML là nút text (text node) - Mọi thuộc tính là nút thuộc tính (attribute node)
- Ghi chú là nút ghi chú (comment node)
3.2.2.3 XML DOM Parser
Để đọc, cập nhật và thao tác trên một tài liệu XML ta cần một XML Parser Có
nhiều XML Parser được hỗ trợ trong hầu hết các ngôn ngữ (Java, Net…) Parser nạp tài liệu XML vào trong bộ nhớ của máy tính và được xem dưới dạng cây node Sau đó dữ liệu sẽ được thao tác và xử lý thông qua tập hàm XML DOM API
Trang 31Hình 3.3: XML DOM Parser
3.2.2.4 XML DOM API
Cung cấp các phương thức xử lý tài liệu XML Trong XML DOM API có rất nhiều phương thức để có thể thao tác với tài liệu XML, ở đây tôi xin chỉ ra một số phương thức thường sử dụng nhất để thao tác với tài liệu XML:
- Duyệt node:
o ParentNode: Lấy node cha của node hiện tại
o ChildNodes: Lấy các node con của node hiện tại
o firstChild: Lấy node con đầu tiên của node hiện tại
o lastChild: Lấy node con cuối cùng của node hiện tại
o nextSibling: Lấy node kết tiếp node hiện tại
o previousSibling: Lấy node trước node hiện tại - Thao tác trên các node:
o getElementsByTagName(String tagname): Trả về một tập các node có thuộc tính tên là: tagname
o getElementById(String id): Trả về một node có thuộc tính id là: id
o setAttribute(String name, String value): Đặt thuộc tính cho node với tên thuộc tính là name, giá trị là value
o getAttribute(String name): lấy giá trị của thuộc tính có tên là name
o removeChild: Xóa node con của node hiện tại
o removeAttribute: Xóa bỏ thuộc tính của node hiện tại
Trang 32o replaceChild: Thay thế node con của node hiện tại bằng một node
mới
o createNode: Dùng để tạo ra tất cả các loại node
o createElement: = createNode với loại element node
o createTextNode: = createNode với loại text node
o createAttribute: = createNode với loại attribute node
o nodeCha.appendChild: thêm vào phần tử cuối cùng của danh sách
các node con của nodeCha
o nodeCha.insertBefore: thêm node mới vào trước node nào đó trong danh sách node con của nodeCha
3.3 XMI (XML Metadata Interchange)
XMI là một chuẩn OMG cho việc trao đổi siêu dữ liệu (metadata) giữa các công cụ, các kho dữ liệu và các ứng dụng Nó là một chuẩn cho phép người dùng mô tả đối tượng bằng cách sử dụng XML Nó làm việc dựa trên các chuẩn như W3C XML, OMG UML và MOF [14]
Mặc dù XML có rất nhiều ưu điểm, nhưng vẫn có một khoảng cách nhất định giữa XML với các đối tượng (objects) XML định nghĩa các phần tử XML, các thuộc tính, không phải là đối tượng Nó không cung cấp các đặc điểm của hướng đối tượng như đa thừa kế và nó không chứa mô hình đối tượng Tồn tại nhiều cách khác nhau để lưu trữ dữ liệu XML và nếu sử dụng các công cụ khác nhau để lưu trữ XML thì sẽ gây ra khó khăn trong việc trao đổi dữ liệu Khi ta lưu trữ đối tượng bằng XML cũng vậy, nếu đối tượng được lưu trữ khác nhau trong XML thì rất khó khăn để trao đổi giữa các công cụ Tuy nhiên, XMI ra chính là cầu nối liền khoảng cách giữa đối tượng và XML Nó cung cấp một chuẩn để tạo ra một ánh xạ từ một đối tượng được định nghĩa bằng UML đến XML
Trang 33Hình 3.4: Sử dụng XMI trao đổi thông tin giữa các công cụ khác nhau XMI được xây dựng dựa trên XML, vì vậy chúng ta hoàn toàn có thể sử dụng các API chuẩn thao tác với XML như DOM, SAX để thao tác với tài liệu XMI Trong nghiên cứu của tôi, tôi sử dụng DOM XML cho ngôn ngữ Java để thao tác với tài liệu XMI
3.4 AUML (Agent UML)
Trước khi đi vào tìm hi ểu về AUML, tôi xin giới thiệu qua một số khái niệm cơ bản về tác tử phần mềm (agent) và phần mềm hướng tác tử để ta có một cái nhìn tổng
quan nhất về một phần mềm hướng tác tử
Theo từ điển Heritage của Mỹ: “Agent là một đối tượng mà có ảnh hưởng hay có khả năng và có quyền tác động hay đại diện cho một đối tượng khác”
Theo Ressel và Norvig: “Một agent có thể được xét tới bởi khả năng nhận thức
về môi trườn nó đang tồn tại qua bộ cảm biến (sensor) và khả năng tác động lên môi trường đó qua cơ quan phản ứng (effector)”
Theo Pattie Maes: “Agent tự chủ là các hệ tính toán tồn tại trong môi trường động phức tạp, tri giác và hành động tự chủ trong môi trường này, qua đó hình dung được nhiệm vụ hoặc mục đích của mình”
Theo như các định nghĩa trên thì agent có thể là hệ thống phần cứng (điều nhiệt,
tàu vũ trụ, xe tự hành…) hoặc phần mềm (kiểm tra thư, Antivirus, …) Ở đây ta đi vào một vấn đề nhỏ hơn, đó là tác tử phần mềm Vậy tác tử phần mềm là gì?
Trang 34Tác tử phần mềm là một chương trình máy tính t ồn tại trong môi trường nhất định, tự động hành động phản ứng lại sự thay đổi của môi trường nhằm đáp ứng mục tiêu đã được thiết kế trước [http://www.wikipedia.org/] Và có các tính chất như:
- Antonomy (Tính tự chủ): Một agent có khả năng kiểm soát hành vi của
mình độc lập với các thực thể khác
- Reactivity (Tính phản xạ): Agent có khả năng phản ứng lại các tác động
từ môi trường theo một cơ chế nào đó
- Pro-activeness (Tính chủ động): Agent không chỉ phản ứng lại môi
trường, chúng có thể hành động có mục đích và chủ động để tranh thủ thời
cơ đạt được mục đích đó Từ một mục tiêu, agent có khả năng xác định các
hành động cần thiết và nó thực hiện một cách linh hoạt các hành vi đó để đạt được mục tiêu đề ra
- Social Ability (Tính cộng đồng): Agent có thể tương tác với những agent
khác hay con người để hoàn thành công việc riêng của mình hay trợ giúp
các agent khác trong những hoạt động nào đó
Dựa vào mức độ thông minh, tính di động hay số lượng agent, người ta phân
agent ra một số loại như: agent cộng tác, agent giao diện, agent di dộng, agent thông tin, agent phản xạ, agent thông minh
Công nghệ phần mềm hướng Agent phân rã bài toán thành nhiều thành phần
tương tác và tự trị (agents) mà có các mục tiêu cụ thể để đạt tới Phần mềm hướng
agent là một phương pháp luận mới hỗ trợ cách tiếp cận được công nghệ hóa: phân tích và thiết kế hệ thống
- Phân tích hướng agent: Cũng giống như các phương pháp phân tích hệ
thống khác, phân tích hướng agent cũng bắt đầu từ việc định nghĩa các yêu
cầu và mục đích của hệ thống Các mục đích toàn thể của ứng dụng được phân rã thành những mục tiêu con, nhỏ hơn; cho tới khi nào có thể quản lý
được chúng Việc phân tích hướng agent phải nhận ra được nhiệm vụ của
một agent
- Thiết kế phần mềm hướng agent: Mỗi agent trong hệ thống được giao
cho một hoặc một số nhiệm vụ riêng biệt Các agent phải nắm được đầy đủ
trách nhiệm đối với việc hoàn thành các nhiệm vụ được giao Các nhiệm vụ cộng đồng biểu diễn các chức năng toàn cục của hệ thống agent
Trang 35Phát triển phần mềm hướng agent dựa vào các hệ đa agent – là một cộng đồng các agent, nơi mà tương tác qua lại giữa các agent và với môi trường của chúng tạo ra
một hành vi toàn thể, hữu ích Một hệ đa agent bao gồm các thành phần: - Các agent được xem như là các cá thể
- Tương tác giữa các agent
- Sự phụ thuộc qua lại giữa agent và các quan hệ cộng đồng
Để hiểu rõ hơn phương pháp phân tích thi ết kế phần mềm hướng agent, tôi xin
trình bày qua một số khái niệm cơ bản trong lý thuyết Gaia [10] – một lý thuyết dùng trong phân tích và thiết kế phần mềm hướng agent
Hình 3.5: Các khái niệm cơ bản của lý thuyết Gaia Trong pha phân tích:
- Xác định các vai trò trong hệ thống và định nghĩa m ột dãy các vai trò chính bằng ngôn ngữ miêu tả phi hình thức Với mỗi vai trò cần xác định các giao thức liên kết
- Đầu ra của pha phân tích là mô hình hoàn thiện của các vai trò – mô tả về trách nhiệm, quyền hạn, các giao thức tương tác, hoạt động và mô hình tương tác Mỗi giao thức mô tả về sự chuyển đổi dữ liệu và các thành phần có liên quan
Pha thiết kế: Tập trung vào việc định nghĩa hệ thống agent để nó có thể hoạt động Nó bao gồm một số giai đoạn như sau:
- Thứ nhất: Xác định mô hình agent, kết hợp vai trò vào các loại agent từ
đó xây dựng hệ thống phân cấp các loại agent và ước lượng số lượng các
thể hiện (instance) được yêu cầu đối với mỗi lớp
Trang 36- Thứ hai: Xác định các dịch vụ mà agent phải cung cấp để hoàn thành các
nhiệm vụ mà chúng được giao bằng cách phân tích các nhiệm vụ và hoạt động Đó chính là các giao thức được định nghĩa cho mỗi vai trò
- Thứ ba: Xác định các mô hình tích hợp để xác định các khả năng thiếu sót
trong thiết kế
Kết quả đầu ra của pha thiết kế chính là kiến trúc thực tế của hệ thống agent
Nói đến agent cũng như phần mềm hướng agent còn rất nhiều vấn đề cần bàn như: kiến trúc agent, hệ đa agent, liên lạc/truyền thông trong hệ agent… trong phạm vi
khóa luận của tôi, tôi không đề cập tới tất cả các kiến thức về agent, cách thức phân
tích thiết kế, xây dựng phần mềm hướng agent; mà ở đây tôi chỉ trình bày một số khái niêm cơ bản nhất, đưa ra một cái nhìn tổng quan nhất về agent và phần mềm hướng
agent Các vấn đề này được trình bày kỹ trong [1, 3, 10]
3.4.3 AUML (Agent Unified Modeling Language)
Như ta đã biết UML là ngôn ngữ rất mạnh để mô hình hóa các đối tượng và thao tác của các đối tượng Nó cung cấp các mô hình tĩnh (các bi ểu đồ lớp và gói) và các mô hình đ ộng (biểu đồ tương tác, biểu đồ trạng thái, biểu đồ hoạt động) để mô tả hệ thống phần mềm Quá trình xây dựng các hệ thống dựa tác tử cũng đòi hỏi tất cả các quá trình của công nghệ phần mềm như: phân tích, thiết kế, đanh giá, bảo trì… Tuy
nhiên, agent có nhiều điểm khác biệt so với các đối tượng nên có nhiều lúc UML không thể hỗ trợ toàn bộ để mô hình hóa hệ thống dựa agent Vì vậy, để đặc tả cho hệ
thống dựa tác tử, FIFA (Foundation for Intelligent Physical Agents) sử dụng UML mở rộng, gọi là AUML (Agent Unified Modeling Language) để mô hình hóa các hệ dựa tác tử, đặc tả giao thức tương tác tác tử (AIP – Agent Interaction Protocols)
AUML là một hướng tiếp cận giao thức phân mức Một giao thức tương tác tác tử (AIP) mô tả các mẫu truyền thông như một dãy các thông đi ệp giữa các agent và
ràng buộc nội dung của các thông điệp này AIP được mô tả gồm ba mức [8, 9]:
- Mức 1: Mô tả giao thức liên lạc (UML Package and Template)
- Mức 2: Mô tả tương tác giữa các agent (các biểu đồ tuần tự, cộng tác, hoạt
động biểu đồ trạng thái)
- Mức 3: Mô tả quá trình xử lý bên trong agent (activity diagram và
statechart)
Trang 373.4.3.1 Mức 1 – biểu diễn giao thức liên lạc ở mức tổng quan
UML cung cấp hai kỹ thuật nhằm biểu diễn các giải pháp cho giao thức, đó là
package và template
- Package: Là tập các nhân tố mô hình hóa ở mức khái niệm
Ví dụ sau được lấy trong [8]
Hình 3.6: Ví dụ package
Các gói cung cấp một kỹ thuật chung cho việc phân chia các mô hình và nhóm các thành phần mô hình Mỗi gói được biểu diễn như sau:
o Mỗi gói đóng là nhóm thành phần có quan hệ logic với nhau
o Kiến trúc của hệ thống được biểu diễn nhờ mô hình liên kết giữa các gói đóng
o Một gói đóng có thể chứa các gói đóng khác o Dùng một gói mô tả giao thức lồng nhau
- Template: là một thành phần mô hình được tham số hóa có các tham số bị ràng buộc Ví dụ sau được lấy trong [8]
Trang 38Hình 3.7: Một kịch bản giữa người mua hàn và ngời bán hàng
3.4.3.2 Mức 2 – biểu diễn tương tác giữa các agent
Ở mức này, ta sử dụng các biểu đồ trong UML để biểu diễn các giao thức: - Biểu đồ tuần tự
- Biểu đồ cộng tác - Biểu đồ hoạt động - Biểu đồ trạng thái
Trong đó, biểu đồ tuần tự và biểu đồ cộng tác mô tả tương tác giữa các agent;
còn biểu đồ hoạt động và biểu đồ trạng thái biểu diễn các luông xử lý Các biểu đồ này biểu diễn các agent gần giống với UML biểu diễn các đối tượng, và mở rộng ra một
chút cho phù hợp với agent Như: AUML thêm các phần biểu diễn tương tác đa luồng
ví dụ [8]:
Hình 3.8 Tương tác đa luồng trong AUML
Hình (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)
Trang 393.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)
“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
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
Trang 403.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