Tải bản đầy đủ (.pptx) (44 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (550.97 KB, 44 trang )

LẬP TRÌNH HƯỚNG KHÍA CẠNH
(AOP)


Nội dung chính



Sự hạn chế của phương pháp lập trình hiện tại (OOP)



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



AspectJ



Một số ứng dụng cơ bản của AOP



Giải quyết bài toán với AOP



Ví dụ minh họa




Demo chương trình


Sự hạn chế của phương pháp lập trình hiện tại


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



Phương pháp lập trình hướng đối tượng (OOP) hiện tại đã tạo ra một cuộc cách mạng lớn trong công nghệ phần mềm, ảnh
hưởng đến tất cả các pha từ xác định yêu cầu, phân tích, thiết kế, cài đặt, kiểm thử đến các hệ quản trị cơ sở dữ liệu.



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à tính đa hình đã làm thay đổi hoàn
toàn ngành công nghiệp phần mềm.


Sự hạn chế của phương pháp lập trình hiện tại


Về cơ bản, 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: 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.
 Thứ hai: các chức năng dàn trải trên rất nhiều các module nghiệp vụ chính – được gọi là các chức năng cắt ngang hệ
thống (hay được gọi là crosscutting concern).



Sự hạn chế của phương pháp lập trình hiện tại


OOP có thể giải quyế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 (chức năng đan xen). 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).


Sự hạn chế của phương pháp lập trình hiện tại
 Chồng chéo mã nguồn: Module 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 module 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. Hiện tượng này gọi là dàn trải mã nguồn.


Lập trình hướng khía cạnh



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 (OOP),
lập trình có cấu trúc, bổ sung thêm các khái niệm và cấu trúc để module hóa các chức năng cắt ngang hệ thống

(crosscutting concern).



Nếu sử dụng AOP, hệ thống sẽ thực thi 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 module khác nhau gắn kết với nhau để hình
thành hệ thống cuối cùng.


Lập trình hướng khía cạnh


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 module 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.



Thay vì tích hợp chức năng các module cắt ngang hệ thống ngay trong module nghiệp vụ chính, lập trình viên sẽ tách
chúng ra thành các module mới, gọi là Aspect.


Lập trình hướng khía cạnh



Phương pháp luận của AOP




Vấn đề cốt lõi của AOP là cho phép 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 module khác, cho phép kéo theo thể hiện chung của các vấn đề đan xen
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.


Lập trình hướng khía cạnh


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.


Lập trình hướng khía cạnh



Ưu điểm của AOP




Module 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 module 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 module 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.


Lập trình hướng khía cạnh


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.



Kết nối muộn thiết kế, 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.



Giảm thời gian thi công hệ thống, giảm giá thành của sản phẩm.


Lập trình hướng khía cạnh




Nhược điểm của AOP



AOP thực ra không giải quyết các vấn đề mới. AOP giải quyết các bài toán theo cách tốt hơn.



Với những thiết kế cẩu thả, việc sử dụng AOP cũng không mang lại hiệu quả cao hơn.



Đôi khi, AOP phá vỡ tính đóng gói (Encapsulation) trong việc thiết kế các đối tượng.


Lập trình hướng khía cạnh



Một số công cụ hỗ trợ làm việc với AOP



AOP hiện nay đã được nghiên cứu và áp dụng vào hầu hết các ngôn ngữ như Java, C, C#, Python, PHP ..


AspectJ


Giới thiệu




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 bao gồm hai phần: đặc tả ngôn ngữ và phần thực thi. Phần đặc tả ngôn ngữ sẽ chỉ ra cách viết code, các concern
cơ bản được viết bằng Java, các concern hệ thống được thực hiện bởi AspectJ. AspectJ đã được plugin vào công cụ phát
triển Eclipse (eclipse.org) và được đánh giá là sản phẩm tốt nhất hiện nay về AOP.


AspectJ


Một số khái niệm



Như đã biết mục đích của AOP là module hoá các concern đan xen nhau. AspectJ định nghĩa 2 loại concern:



Concern đan xen tĩnh (static crosscutting): Là sự gắn kết thay đổi trong một cấu trúc tĩnh (class, interface, aspect).
Nghĩa là khi chúng ta thực hiện một thay đổi đến các cấu trúc dữ liệu tĩnh để đáp ứng các yêu cầu của bài toán



Concern đan xen động (dynamic crosscutting): là sự gắn kết các hành vi mới vào chương trình, hầu hết các

concern đan xen trong AspectJ là concern đan xen động.


AspectJ


Join point: là một khái niệm cơ bản của AspectJ, Join point có thể là bất kỳ điểm nào có thể xác định được khi thực hiện
chương trình. Có thể là lời gọi đến một phương thức hoặc một lệnh gán cho một biến của đối tượng. Trong AspectJ mọi
thứ đều xoay quanh join point.



Join point được phân loại như sau:



Join point tại các phương thức



Join point tại hàm dựng (contructor)



Join point tại điểm truy cập các thuộc tính



Join point tại điểm điều khiển ngoại lệ: Được biểu diễn trong khối điều khiển ngoại lệ



AspectJ


Pointcut: là một cấu trúc chương trình mà nó chọn các Join point và ngữ cảnh tại các Joint point đó. Ví dụ một Pointcut
có thể chọn một Join point là một lời gọi đến một phương thức và lấy thông tin ngữ cảnh của phương thức đó như đối
tượng chứa phương thức, các đối số của phương thức đó.



Cú pháp của Pointcut được khai báo như sau:
[access specifier] pointcut pointcut-name([args]) : pointcut-definition
Ví dụ: execution(void Account.creadit(float))



Bảng ánh xạ giữa các Join point được chọn cho các Pointcut


AspectJ


AspectJ


Advice: Là mã được thực hiện tại một Join point mà đã được chọn bởi Pointcut. Advice tương tự cấu trúc của hàm cung
cấp cách thức các hành động đan xen tại các Join point mà nó được chọn bởi Point cut. 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 thành 3 loại sau:



Before: Được thực hiện trước Join point



After: Được thực hiện sau Join point



Around: Bao quanh sự thực hiện Join point, advice này có thể thực hiện vòng, thực hiện tiếp của mã nguồn ban
đầu hoặc thực hiện thay đổi ngữ cảnh (tham số của hàm, …)


AspectJ


Introduction: là một lệnh chỉ ra sự thay đổi đến một class, interface, aspect. Nó tạo ra sự thay đổi tĩnh đến các module
mà không trực tiếp ảnh hưởng đến các hành vi của module đó. Ví dụ có thể thêm một phương thức hoặc một trường vào
lớp nào đó hoặc sửa đổi cấu trúc thừa kế của một đối tượng.



Ví dụ khai báo sau sẽ sửa đổi cấu trúc thừa kế của đối tượng Account:
declare parents: Account implements BankingEntity;




Introduction là khái niệm sinh ra để can thiệp vào các cấu trúc tĩnh, trong AOP nó được dùng để xử lý các quan hệ đan xen
tĩnh (static crosscutting).


AspectJ


Aspect: là phần tử tập trung của AspectJ, giống như class trong Java. Aspect chứa mã thể hiện các luật đan kết cho
Concern. Join point, Pointcut, Advice, Introduction được kết hợp trong Aspect.



Một số tính chất của khái niệm Aspect tương tự khái niệm Class



Aspect có thể chứa các thuộc tính và phương thức



Aspect chứa các thuộc tính truy cập: private, public, protected …



Aspect có thể khai báo như một Aspect trừu tượng



Aspect có thể thừa kế class, abstract aspect và thi công các interface




Aspect có thể nhúng trong class và interface như một Aspect nằm trong


AspectJ


Ngoài các tính chất tương tự class như trên, Aspect cũng có một số đặc điểm khác so với class như sau:



Aspect không thể khởi tạo trực tiếp.



Aspect không thể thừa kế từ một Aspect khác (không phải trừu tượng).



Aspect có thể được đánh dấu như quyền.


AspectJ


Ví dụ khai báo một aspect:
public aspect ExampleAspect {
before() : execution(void Account.credit(float)) {

System.out.println("About to perform credit operation");
}
declare parents: Account implements BankingEntity;
declare warning : call(void Persistence.save(Object))
: "Consider using Persistence.saveOptimized()";
}


AspectJ


Static crosscutting: Trong AOP chúng ta thường xuyên can thiệp vào các quan hệ đan xen động sử dụng advice, và cũng
cần thiết các hành động can thiệp vào các cấu trúc tĩnh. Trong khi các concern đan xen động sẽ sửa đổi sự thực hiện các
thủ tục của chương trình thì sự đan xen tĩnh sẽ sửa đổi các cấu trúc như class, interface, các aspect khác và các hành vi tại
điểm dịch chương trình.



Giới thiệu thành viên: Aspect thường xuyên giới thiệu các thành viên hoặc các phương thức vào trong một lớp
aspect . AspectJ cung cấp một có chế được gọi là Introduction để giới thiệu các thành viên vào trong các class
hoặc interface. Các thành viên được giới thiệu vào một lớp cũng có thể được chỉ ra quyền truy nhập như khai báo
các thành viên của một lớp


×