AOP cho phép đóng gói những hành vi liên quan đến nhiều lớp. AOP cho phép kéo thể hiện chung của vấn đề đan nhau vào một khối hay aspect (tạm dịch là lát – hàm ý là lát cắt đi qua nhiều lớp đối tượng). Các aspect 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. Nhờ được tách riêng nên vấn đề đan xen dễ kiểm soát hơn.
Trang 1TÌM HIỂU KỸ THUẬT LẬP TRÌNH
HƯỚNG KHÍA CẠNH
(AOP)
Aspect-Oriented Programming
Trang 2AOP LÀ GÌ?
Trang 3 OOP xuất sắc trong việc đóng gói
các hành vi và chủ thể (lớp), miễn là chúng riêng biệt.
OOP không giải quyết thỏa đáng
những hành vi liên quan đến nhiều đối tượng.
Trang 4AOP LÀ GÌ?
AOP cho phép đóng gói những hành vi liên
quan đến nhiều lớp.
AOP cho phép kéo thể hiện chung của vấn đề
đan nhau vào một khối hay aspect (tạm dịch là lát – hàm ý là lát cắt đi qua nhiều lớp đối tượng).
Các aspect 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
Nhờ được tách riêng nên vấn đề đan xen dễ
kiểm soát hơn.
Trang 5AOP LÀ GÌ?
Trang 6AOP gồm ba bước phát triển :
Phân tích các yêu cầu để xác định vấn đề chung
và vấn đề đan nhau.
Xây dựng thể hiện từng vấn đề riêng biệt.
Tổng hợp các thể hiện.
Trang 7
AOP LÀ GÌ?
Đặc tả ngôn ngữ AOP: gồm 2 thành phần
Thể hiện vấn đề.
Đặc tả quy tắc đan kết.
Biên dịch AOP: Trình biên dịch AOP thực hiện theo
trình tự hai bước sau:
Kết hợp các hành vi riêng lẻ.
Chuyển đổi thông tin kết quả sang dạng mã thực thi.
Trang 8LỢI ÍCH CỦA AOP
Khả năng sử dụng AOP trong bảo mật ứng dụng là rất lớn Ở đây có một số các ứng dụng mà AOP được sử dụng cho việc bảo mật:
Thực hiện điều khiển truy cập một cách độc lập với logic ứng dụng Thay vì phải có các check rõ ràng như checkAccess (User) trong mỗi hàm nhạy cảm, bạn có thể hoàn thành được vấn đề này thông qua các aspect và cho phép các chuyên gia phát triển tập trung vào logic doanh nghiệp
lập trình gọi các thư viện SQL động (ví dụ như executeQuery()) Bất cứ khi nào thư viện đó được gọi, bạn có thể sử dụng aspect để đưa vào một ngoại lệ và ghi một cách chính xác địa điểm xuất hiện các lời gọi nguy hiểm.
Trang 9VD dùng AOP giải quyết những hành vi liên
quan đến nhiều đối tượng
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, 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
Trang 10VD dùng AOP giải quyết những hành vi liên
quan đến nhiều đối tượng
Trang 11VD dùng AOP giải quyết những hành vi liên
quan đến nhiều đối tượng
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 12VD dùng AOP giải quyết những hành vi liên
quan đến nhiều đối tượng
Trang 13Ưu điểm của AOP?
Mô-đun hóa những vấn đề đan xen nhau.
Tái sử dụng mã nguồn tốt hơn.
Dễ dàng phát triển hệ thống.
Giảm thời gian thi công hệ thống.
Giảm giá thành của sản phẩm.
Trang 14Nhược điểm của AOP?
AOP thực ra không giải quyết các vấn đề mới, không giải quyết được vấn đề vẫn chưa được giải quyết.
AOP không là cứu cánh cho các thiết kế cẩu thả.
AOP phá vỡ tính đóng gói.
Trang 15 Trong AOP, từ “Aspect” chính là vấn đề [Concern] người lập trình quan tâm và nó xuất hiện trong rất nhiều class cũng như nhiều method khác nhau.
Trang 16Ta thường gặp hai loại “concern”: core concerns và cutting concerns:
cross- Core concern: là requirement chính của chương trình, ví
dụ như upload file/folder, đọc danh sách user, …
Cross-cutting concerrns: là những xử lý phụ cần được thực hiện khi “core concern” được gọi Cross-cuttong concerns thường xảy ra nhiều nơi trong chương trình, nó
có thể xảy ra trong nhiều layer của ứng dụng, nhiều class, nhiều method; chẳng hạn như tính toán thời gian chạy các hàm đọc ghi database, ghi log lại mỗi lần cập nhật thông tin user, …
Trang 17 Aspect-Oriented Programming(AOP) còn được gọi là Aspect-Oriented Software Development (AOSD) là một nguyên tắc thiết kế giúp tách rời các yêu cầu hay các vấn đề được quan tâm (separation of concerns) trong chương trình thành các thành phần độc lập và từ đó tăng tính uyển chuyển cho chương trình “Separation of concerns” là một trong những kĩ thuật được quan tâm nhất trong ngành phần mềm
Trang 18 Ở vai trò của người thiết kế phần mềm, chúng ta nên đưa ra các cách làm đơn giản nhất Để thỏa mãn yêu cầu của chương trình, người ta sẽ tạo ra thành phần chính của chương trình (gồm các class/component/method); các chức năng bổ sung như loging, tính toán performance, cũng sẽ được xem xét
để tạo ra Vì do các chứng năng bổ xung này không phải
là yêu cầu chính của hệ thống nên người ta sẽ có yêu cầu bật tắt chúng theo ý muốn Vậy làm thế nào để có thể tạo ra chương trình có thể linh hoạt được như thế? Câu trả lời là “Separate of concerns”
Trang 19 Ở vai trò của người thiết kế phần mềm, chúng ta nên đưa ra các cách làm đơn giản nhất Để thỏa mãn yêu cầu của chương trình, người ta sẽ tạo ra thành phần chính của chương trình (gồm các class/component/method); các chức năng bổ sung như loging, tính toán performance, cũng sẽ được xem xét
để tạo ra Vì do các chứng năng bổ xung này không phải
là yêu cầu chính của hệ thống nên người ta sẽ có yêu cầu bật tắt chúng theo ý muốn Vậy làm thế nào để có thể tạo ra chương trình có thể linh hoạt được như thế? Câu trả lời là “Separate of concerns”
Trang 20CÁC KHÁI NIỆM TRONG AOP
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
Phân loại:
• 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ệ.
Trang 21CÁC KHÁI NIỆM TRONG AOP
}
}
Trang 22CÁC KHÁI NIỆM TRONG AOP
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 đó
Ví dụ:
execution( void Account.creadit( float ))
Trang 23CÁC KHÁI NIỆM TRONG AOP
Advice: Là mã được thực hiện tại một join point mà đã được chọn bởi pointcut.
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, …)
Trang 24CÁC KHÁI NIỆM TRONG AOP
Trang 25Ví dụ
Trang 27Aspect
Mẫu khai báo aspect:
[access specification] aspect <AspectName>
public aspect ExampleAspect {
before() : execution( void
Account.credit( float )) {
System out println( "About to perform credit operation" );
}
Trang 29Một số tính chất của aspect:
Aspect có thể khai báo như một aspect trừu tượng.
public abstract aspect AbstractLogging {
public abstract pointcut logPoints();
public abstract Logger getLogger();
before() : logPoints() {
getLogger().log(Level.INFO, "Before: " + thisJoinPoint);
} }
Trang 30return Logger.getLogger( "banking" );
} }
Trang 31Static crosscutting
như class, interface, các aspect khác và các hành vi tại điểm dịch chương trình.
Trang 32Sử dụng AOP trong giai đoạn bảo trì
Sử dụng AOP trong bước kiếm tra
Sử dụng AOP trong bước thi công
Sử dụng AOP trong bước thiết kế
GIẢI QUYẾT BÀI TOÁN VỚI AOP
Trang 331 Sử dụng AOP trong bước thiết kế
Nếu sử dụng AOP trong bước thiết kế chúng
ta sẽ có được nhiều sự thuận lợi mà AOP đem lại
Từ quan điểm về kiến trúc, sự thuận lợi chính là giúp chúng ta vượt qua sự bế tắc của các kiến trúc hiện tại.
Trang 34Sau đây là một số bước điển hình sử dụng AOP trong pha thiết kế:
Nhận biết các concern đan xen:
Thiết kế các concern lõi trước:
Thiết kế các concern đan xen:
Trang 352 Sử dụng AOP trong bước thi công
Khi sử dụng AOP trong bước thi công bạn nên nhấn mạnh vào trên một vài thực tiễn có tính chất chung Cũng như cần theo một số chỉ dẫn để
việc thi công các concern lõi và concern đan xen
dễ nhất có thể Cũng có một số phương pháp
refactoring theo mô hình AOP bạn có thể sử dụng
Trang 36 Viết các concern lõi theo mô hình refactoring tốt nhất.
Sử dụng cách đặt tên nhất quán xuyên suốt ứng dụng.
Tách biệt các concern đan xen từ các module
trong bước đầu tiên.
Xem xét bất kỳ sự rải rác và chồng chéo mã chương trình.
a) Thực thi các concern lõi:
Trang 37 Xác định các join point.
Lựa chọn các kỹ thuật sử dụng ở lớp dưới.
Thiết kế các aspect.
b) Thực thi các concern đan xen
c) Thực hiện refactoring các aspect
Trang 383 Sử dụng AOP trong bước kiếm tra
AspectJ có thể trợ giúp nhiều nhiệm vụ trong bước kiếm tra Sau đây là một kịch bản điển hình mà chúng ta có thể bắt đầu thực hiện với AspectJ
Tạo các test case.
Thực hiện kiểm tra hiệu năng hệ thống.
Báo cáo lỗi
Trang 394 Sử dụng AOP trong giai đoạn bảo trì
Giai đoạn bảo trì hệ thống bao gồm hai thao tác chính sau:
Thêm mới tính năng cho các yêu cầu mới.
Sửa các lỗi được tìm thấy.
Trang 40AspectJ có thể điều khiển 2 bước sau trong giai đoạn bảo trì
Tạo một bức tường an toàn:
Thực thi các tính năng mới:
Trang 42AOP with PostSharp
Compile-time MSIL Injection - by MSBuild Task
Easy to use - like normal Attribute
Intercept any method - not only Virtual
More Join points - on: field access, exception
More controllability - break, change param or return
More transparent - no need “new proxy()”
Multicasting Custom Attributes - filter
Code quality after injection
Complexity of Debug
Trang 43How does it work?
Trang 44AOP with PostSharp
Trang 451 Add a reference to PostSharp.dll
Trang 462 Write an aspect
Trang 473 Apply the aspect