Phát triển ứng dụng bằng cách sử dụng AOP và phương pháp kiểm chứng dựa trên AOP

avatar

Ở bài trước chúng ta đã được biết đến khái niệm AOP (lập trình hướng khía cạnh), hiểu được AOP có những ưu điểm vượt trội gì so với các phương pháp lập trình khác. AOP được xây dựng dựa trên các phương pháp lập trình đã có như là: lập trình có cấu trúc, lập trình hướng đối tượng. Tuy nhiên, nó bổ sung thêm các khái niệm và cấu trúc nhằm module hóa các chức năng cross – cutting concern. Nếu như với OOP, các quan hệ cơ bản sẽ được thực thi dưới hình thức lớp (class) thì với AOP, chúng sử dụng các phương pháp cơ bản. Các chức năng cắt ngang hệ thống sẽ được các Aspect đóng gói lại với nhau. Các Aspect sẽ quy định những module khác nhau liên kết lại với nhau để tạo nên hệ thống cuối cùng. AOP hiện đang được sử dụng rộng rãi và hiệu quả trong quá trình phát triển ứng dụng và các phương pháp kiểm chứng.

Phát triển ứng dụng và Phương pháp kiểm chứng dựa trên phương pháp Lập trình AOP

PHÁT TRIỂN ỨNG DỤNG AOP

Hiện nay, giới công nghệ thông tin đang ngày càng sử dụng AOP nhiều hơn trong việc phát triển ứng dụng. Cũng như phát triển hệ thống bằng các phương thức khác, việc phát triển hệ thống bằng AOP cũng phải gồm các công đoạn: nhận định concern, cài đặt concern, kết hợp các concern lại để xây dựng nên hệ thống. Các nhà nghiên cứu về AOP đã đề xuất các bước thực hiện sau đây:

Aspectual decomposition (Phân tích bài toán theo khía cạnh): ở bước này ta cần xem xét các yêu cầu, từ đó tìm ra chức năng nào là chính, chức năng nào là chức năng cắt ngang hệ thống. Xác định được rồi, ta cần phải tách các chức năng cắt ngang này khỏi chức năng chính.

Concern Implementation (Xây dựng các chức năng): ở bước này, các chức năng được cài đặt độc lập nhau.

Aspectual Recomposition (Kết hợp các khía cạnh lại để tạo nên hệ thống hoàn chỉnh): ở bước này, bằng cách tạo nên các Aspect, ta có thể chỉ ra các quy luật kết hợp. Đây cũng được gọi là quá trình dệt mã, sử dụng các thông tin trong Aspect nhằm tạo nên hệ thống cuối cùng.

Mô hình Cross – cutting Concern
Mô hình Cross – cutting Concern

Thực tế, người ta đã nghiên cứu và áp dụng phát triển ứng dụng AOP vào nhiều loại ngôn ngữ lập trình khác nhau như: C, C#, Java, PHP. Một số dự án nghiên cứu AOP quan trọng có thể kể đến là: AspectJ, AspectC++, Aspect#, Aspect Werkz, Jboss AOP, JAC, Spring AOP.

Phương pháp phát triển ứng dụng AOP đã được áp dụng cho nhiều Ngôn ngữ lập trình
Phương pháp phát triển ứng dụng AOP đã được áp dụng cho nhiều Ngôn ngữ lập trình

Nhờ tính ưu việt tách rời sự hoạt động của các module, khả năng module hóa các quan hệ đan xen cũng như chức năng cut – crossing hệ thống và nhiều đặc tính nổi trội hơn so với OOP mà AOP đã biến thành sự lựa chọn thích hợp đối với nhiều hệ thống phần mềm. Đặc biệt, AOP phát huy thế mạnh của mình trong các nhiệm vụ bảo mật, xác thực, lưu vết của hệ thống phần mềm. Một điều đáng chú ý nữa là việc các mã Aspect có thể sửa đổi tùy thích theo mong muốn của lập trình viên mà không phụ thuộc vào mã nguồn chính của chương trình, khiến cho AOP được ứng dụng rộng rãi trong các kiểu kiểm chứng ở quá trình thiết kế phần mềm. Chẳng hạn như: kiểm tra việc gọi theo thứ tự các hàm trong chương trình, kiểm chứng giao thức…

Nội dung chủ yếu của các phương pháp này cũng dựa vào những khái niệm cơ bản trong AOP như: Advice, Point Cut, Join Point, Aspect. Từ đó thiết kế ra những module kiểm chứng (các Aspect) từ những chức năng cắt ngang hệ thống. Thông qua biên dịch AspectJ, những Aspect đó được đan xen vào khung mã nguồn chương trình, từ đó thực hiện nhiệm vụ kiểm chứng.

Phương pháp kiểm chứng các giao thức bằng AOP

Phương pháp kiểm chứng AOP
Phương pháp kiểm chứng áp dụng AOP

Biểu diễn giao thức

Nói nôm na, việc gọi lần lượt các phương thức trong biểu đồ tuần tự theo các quy định đặt ra từ trước, gọi là một giao thức trên đối tượng. Giả sử ta xem xét phương pháp biểu diễn giao thức các giao thức cơ bản như XYn XnYm, (X*Y)n. Với X, Y là các giao thức; m, n là số lần X, Y được gọi trong chương trình. Kiểm chứng giao thức đã kiểm chứng được các giao thức (XY)n, (X*Y)n trên biểu đồ tuần tự, nhưng chưa thực hiện với postcondition và precondition. Ở bài này, tôi xin giới thiệu về việc xử lý các giao thức được nêu ở trên, trên biểu đồ tuần tự. Ngoài ra, xử lý tận gốc hơn các ràng buộc postcondition và precondition đối với tất cả các giao thức. Sau đây, tôi xin nói đến 2 phương pháp biểu diễn giao thức:

Biểu diễn trên biểu đồ trình tự: ta có thể dùng 2 vòng lặp (một thành phần trong Combinded Fragment) để diễn tả giao thức trên. Phương thức mô tả này cho phép ta mô tả được hầu hết các giao thức cơ bản.

Biểu diễn giao thức bằng biểu thức: việc này giúp quá trình kiểm tra giao thức diễn ra nhanh chóng hơn. Giao thức XnYm sẽ được biểu diễn bởi biểu thức [X]n[Y]m.

Điều kiện trước và điều kiện sau

Điều kiện trước (tiền điều kiện)

Những điều kiện này thể hiện các ràng buộc mà một thủ tục sẽ thực thi một cách chính xác. Ví dụ:

  • Nếu ngăn xếp đã đầy, Put sẽ không được gọi.
  • Nếu ngăn xếp rỗng, sẽ không thực hiện được Remove Item trên ngăn xếp đó.

Tiền điều kiện vào có hiệu lực tới mọi lời gọi thủ tục, thậm chí cả trong lớp hay từ các lớp liên đới. Một hệ thống thực thi một lời gọi ỡm ờ, chưa thỏa mãn tiền điều kiện thì không thể gọi là một hệ thống chính xác được.

Điều kiện sau (hậu điều kiện)

Những điều kiện này thể hiện các thuộc tính trạng thái kết quả đạt được sau khi thực thi thủ tục. Chẳng hạn như:

Sau khi Put, ngăn xếp không thể ở trạng thái rỗng, số lượng phần tử được cộng thêm 1 và phần tử mới được thêm vô sẽ là phần tử trên cùng.

Sau thủ tục Remove, ngăn xếp không thể ở trạng thái đầy, số phần tử phải trừ đi 1.

Giả sử thủ tục đã phù hợp các tiền điều kiện để được gọi, khi đó, sự tồn tại của hậu điều kiện trong thủ tục đảm bảo kết quả đạt được của thủ tục đáp ứng được các thuộc tính.

Biểu diễn điều kiện trước và sau trong biểu đồ trình tự:

Trong biểu đồ trình tự, giả sử tôi sử dụng thành phần comment để biểu diễn điều kiện trước và điều kiện sau, thì comment này sẽ phải bao gồm thông tin về loại điều kiện, điều kiện ràng buộc cũng như các thủ tục liên quan.

Kiểm chứng giao thức

Giả sử cần kiểm chứng biểu đồ dưới đây:

XML DOM
XML DOM

 

Công việc kiểm chứng giao thức sẽ phải gồm những việc dưới đây:

* Check xem mã nguồn chương trình có thực thi lần lượt các phương thức như trong thiết kế ở biểu đồ thứ tự hay không. Từ thiết kế ở trên, thì khi lập trình viên viết mã chương trình phải đảm bảo chương trình tuân theo các quy tắc trong bản thiết kế. Chẳng hạn: phương thức void message1() không thể nào được gọi sau phương thức void message2(), phương thức void message2() đương nhiên phải được gọi trước phương thức void message4().

* Để giải quyết bài toán này với AOP, chúng ta có thể đặt tên cho những trạng thái của chương trình khi nó thực thi bằng mã Aspect. Bắt đầu với trạng thái mở đầu (State_start), rồi khi gọi một phương thức nào đó trạng thái sẽ được thay đổi và đánh dấu tại phương thức đó. Cuối cùng là trạng thái kết thúc.

* Kiểm chứng về việc mã nguồn đáp ứng được các ràng buộc (nếu có) hay không: đây cũng là việc kiểm tra xem các tiền điều kiện các hậu điều kiện được mô tả trên biểu đồ tuần tự có được xác minh rồi hay không. Chẳng hạn như: kiểm chứng xem x=0 có đúng hay không trước khi gọi void message2(). Sau khi đã gọi void message2() thì x>0 có đúng hay sai. Kiểm chứng các ràng buộc như thế không phải là việc quá khó khăn. Tuy nhiên, khi ràng buộc quá rắc rối, lời khuyên đưa ra là nên viết chia tách các điều kiện thành những điều kiện nhỏ dễ dễ kiểm chứng hơn.

* Phát hiện, chỉ ra cũng như thông báo lỗi trong đoạn cài đặt của chương trình. Giả sử có lỗi cài đặt được tìm thấy thì mã kiểm chứng phải xuất ra dòng thông báo lỗi ở vị trí phù hợp nhằm mục tiêu tiện lợi cho người kiểm tra chỉnh sửa lại cho đúng.

Với trường hợp biểu đồ tuần tự định nghĩa các Combinded Fragment, việc kiểm chứng phải bao gồm cả việc kiểm chứng các Combinded Fragment bao hàm điều kiện có được thi hành đúng hay không. Chẳng hạn, giả sử Loop là một Combinded Fragment, khi đó chương trình phải xác minh cả việc Loop có được thi hành đúng hay chưa (giao thức lặp, số vòng lặp, ….)

Nếu không định nghĩa Combinded Fragment trong biểu đồ tuần tự nào cả, thì việc kiểm chứng giao thức chỉ đơn giản là việc xác minh các cài đặt trên biểu đồ tuần tự mà thôi. Nghĩa là, chỉ cần kiểm tra mã thực hiện có thực thi tuần tự như trên thiết kế ở Sequence Diagram hay không.

Duyệt các trạng thái: để đặt các trạng thái vào sau khi gọi phương thức thì các trạng thái sẽ phải được đặt vào Enumeration và được duyệt lần lượt.

Hy vọng bài viết trên đây giúp các bạn hiểu được thêm một số kiến thức về phát triển ứng dụng và các phương pháp kiểm chứng dựa trên phương pháp lập trình khía cạnh AOP. Để nắm bắt chuyên sâu hơn, mời các bạn tiếp tục tham khảo các bài viết khác của Freelancervietnam.vn nhé.