Tải bản đầy đủ (.doc) (65 trang)

Tìm hiểu mô hì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 (897.98 KB, 65 trang )

1 Giới thiệu...............................................................................................................................5
1.1 Mục đích và cấu trúc của tài liệu...................................................................................5
1.2 Các thuật ngữ.................................................................................................................5
1.3 Hạn chế của các phương pháp lập trình hiện tại...........................................................6
2 Các đặc điểm của AOP.........................................................................................................7
2.1 Quản lý các concern hệ thống........................................................................................8
2.2 Phương pháp luận của AOP.........................................................................................11
2.2.1 Ưu điểm của AOP.................................................................................................12
2.2.2 Những nhược điểm...............................................................................................12
2.3 Một số công cụ hỗ trợ làm việc với AOP....................................................................12
3 Giới thiệu AspectJ...............................................................................................................13
3.1 Giới thiệu......................................................................................................................13
3.2 Một số khái niệm..........................................................................................................13
3.2.1 Join point...............................................................................................................13
3.2.2 Pointcut.................................................................................................................14
3.2.3 Advice...................................................................................................................15
3.2.4 Introduction...........................................................................................................16
3.2.5 Aspect....................................................................................................................16
3.2.6 Static crosscutting.................................................................................................18
3.3 Một số ứng dựng cơ bản của AOP..............................................................................19
4 Giải quyết bài toán với AOP...............................................................................................19
4.1 Sử dụng AOP trong bước thiết kế...............................................................................20
4.2 Sử dụng AOP trong bước thi công..............................................................................20
4.3 Sử dụng AOP trong bước kiếm tra..............................................................................21
4.4 Sử dụng AOP trong giai đoạn bảo trì..........................................................................21
5 Triển khai một số pattern trên AspectJ...............................................................................22
5.1 Các mẫu thiết kế cho việc tạo đối tượng.....................................................................22
5.1.1 Singleton pattern...................................................................................................22
5.1.2 Prototype pattern...................................................................................................25
5.1.3 Abstract Factory pattern........................................................................................27
5.1.4 Factory Method pattern.........................................................................................29


5.1.5 Builder pattern.......................................................................................................30
5.2 Các mẫu thiết kế cho cấu trúc của đối tượng..............................................................31
5.2.1 Composite pattern.................................................................................................31
5.2.2 Flyweight pattern..................................................................................................35
5.2.3 Bridge Pattern.......................................................................................................36
5.2.4 Decorator pattern...................................................................................................37
5.2.5 Adapter pattern......................................................................................................39
5.2.6 Proxy Pattern.........................................................................................................39
5.3 Các mẫu thiết kế cho hành vi của đối tượng...............................................................42
5.3.1 Observer pattern....................................................................................................42
5.3.2 Command Pattern..................................................................................................45
5.3.3 Iterator pattern.......................................................................................................49
5.3.4 Mediator pattern....................................................................................................50
5.3.5 Chain of Responsibility Pattern............................................................................52
5.3.6 Memento Pattern...................................................................................................56
5.3.7 Visitor Pattern.......................................................................................................58
5.3.8 Strategy pattern ....................................................................................................60
5.3.9 State Pattern..........................................................................................................62
6 Kết luận...............................................................................................................................64
7 Tài liệu tham khảo...............................................................................................................65
Mục lục hình ảnh
Hình 1: Mô hình các concern mức hệ thống............................................................................8
Hình 2: Mô hình ánh xạ yêu cầu người dùng sử dụng AOP...................................................9
Hình 3: Mô hình đa chiều về sự phụ thuộc giữa các module với nhau...................................9
Hình 4: Mô hình ánh xạ từ các concern hệ thống sang các phương pháp lập trình truyền
thống.......................................................................................................................................10
Hình 5: Các module yêu cầu logging đều phải nhúng các đoạn mã để gọi logging API.....10
Hình 6: Giải quyết các concern hệ thống bằng phương pháp AOP......................................11
Hình 7: Các giai đoạn phát triển sử dụng phương pháp AOP...............................................12
Hình 8: Cấu trúc của aspect trừu tượng với interface và các hàm được định nghĩa để hỗ trợ

Singleton pattern.....................................................................................................................23
Hình 9:Một ứng dụng trước và sau khi được tác động bởi Singleton pattern......................24
Hình 10: Các bước thực hiện của mẫu thiết kế Singleton trong ứng dụng...........................24
Hình 11: Cấu trúc của PrototypePattern aspect.....................................................................25
Hình 12:Một ứng dụng trước và sau khi được tác động bởi Prototype pattern....................26
Hình 13: Sử dụng Prototype pattern trong ứng dụng............................................................27
Hình 14: Lược đồ UML của AbstractFactory Pattern...........................................................28
Hình 15: Lược đồ UML của factory method pattern.............................................................29
Hình 16: Cấu trúc của CompositePattern aspect...................................................................32
Hình 17: Mô hình các đối tượng trước khi áp dụng Composite pattern...............................34
Hình 18: Mô hình các đối tượng sau khi áp dụng Composite pattern..................................34
Hình 19: Hoạt động của composite pattern trong ứng dụng.................................................34
Hình 20: Cấu trúc của FlyweightPattern aspect....................................................................35
Hình 21:Cấu trúc của XWindowBridge aspect.....................................................................37
Hình 22: Sử dụng các hành vi của lớp Window trong ứng dụng..........................................37
Hình 23: Cấu trúc của DecoratorPattern aspect.....................................................................38
Hình 24:Lớp TextDisplay trước và sau khi áp dụng DecoratorPattern ...............................38
Hình 25: Áp dụng Adapter pattern.........................................................................................39
Hình 26: Cấu trúc của ProxyPattern aspect...........................................................................39
Hình 27: Cấu trúc của ObserverPattern aspect......................................................................42
Hình 28: Cấu trúc lớp trước khi áp dụng ObserverPattern ...................................................44
Hình 29:Cấu trúc lớp sau khi áp dụng ObserverPattern .......................................................44
Hình 30:Sử dụng ObserverPattern trong ứng dụng...............................................................45
Hình 31: Cấu trúc của CommandPattern và các hàm hỗ trợ pattern.....................................45
Hình 32: Trước khi áp dụng CommandPattern ....................................................................47
Hình 33:Trước khi áp dụng CommandPattern .....................................................................48
Hình 34: Sử dụng CommandPattern trong ứng dụng............................................................49
Hình 35: IteratorPatternAspect và interface định nghĩa vài trò của pattern..........................49
Hình 36: Mô tả sự tương tác của EmployeeIteration với ứng dụng......................................50
Hình 37: Cấu trúc của MediatorPattern aspect......................................................................51

Hình 38: Trước và sau khi áp dụng Mediator pattern...........................................................52
Hình 39: Cấu trúc của ChainOfResponsibilityPattern aspect...............................................52
Hình 40: Sau khi áp dụng ChainOfResponsibilityPattern ....................................................54
Hình 41:Sử dụng ChainOfResponsibilityPattern trong ứng dụng.......................................56
Hình 42: Cấu trúc của MementoPattern aspect.....................................................................57
Hình 43: Sử dụng MementoPattern trong ứng dụng.............................................................57
Hình 44: Cấu trúc của Visitor pattern aspect.........................................................................58
Hình 45: Cấu trúc của Computeur.........................................................................................59
Hình 46: Cấu trúc Computeur sau khi áp dụng Visitor pattern.............................................60
Hình 47:Sử dụng VisitorPattern trong ứng dụng...................................................................60
Hình 48:Cấu trúc của StrategyPattern aspect........................................................................61
Hình 49: Cấu trúc các lớp sắp xếp khi chưa áp dụng StrategyPattern .................................62
Hình 50: Cấu trúc các lớp sắp xếp sau khi áp dụng StrategyPattern ...................................62
Hình 51: Sử dụng Strategy Pattern trong ứng dụng..............................................................62
Hình 52: Sử dụng state pattern trong ứng dụng.....................................................................63
1 Giới thiệu
Việc chuyển đổi các yêu cầu của người dùng vào trong một hệ thống phần mềm
bao giờ cũng rất khó khăn, mặc dù hiện nay đã có rất nhiều phương pháp tiếp cận như lập
trình hướng đối tượng, hướng thành phần, các design pattern ...Chúng cũng đã giải quyết
được một số vấn đề nhưng vẫn chưa có một phương pháp nào thoả mãn việc giải quyết các
yêu cầu đan xen ở mức hệ thống, các yêu cầu này được mô tả bằng khái niệm
crosscutting concern. Các nhà nghiên cứu lý thuyết đã đưa ra mô hình AOP để giải
quyết các vấn đề mà các mô hình lập trình hiện tại chưa đáp ứng được hoặc đáp ứng được
nhưng việc thực hiện nó quá phức tạp. AOP không phát minh và điều gì mới mà chỉ giải
quyết các vấn đề đã tồn tại theo cách tốt hơn. (How to do the bad things in better way)
1.1 Mục đích và cấu trúc của tài liệu
Tài liệu này được tổng hợp từ nhiều nguồn khác nhau (xem phần tài liệu tham
khảo), bao gồm các cuốn sách, các bài báo, các luận văn …về vấn đề nghiên cứu và ứng
dụng AOP trong ngành công nghệ phần mềm. Tài liệu nhằm mục đích tìm hiểu mô hình
AOP và đi sâu trình bày một trong những kỹ thuật quan trọng của ngành công nghệ phần

mềm hiện nay là design pattern trên mô hình AOP
Trước khi đọc tài liệu này bạn cần có kiến thức cơ bản về kỹ thuật lập trình hướng
đối tượng, các mẫu thiết kế, các kiến trúc của phần mềm, … trong ngành công nghệ phần
mềm hiện nay. Đồng thời cũng cần kinh nghiệm thực tế về những khó khăn mà các
phương pháp lập trình hiện tại đang gặp.
Tài liệu được chia thành 2 phần chính sau
Phần thứ nhất, từ mục 1 đến 5: Trình bày các vấn đề cơ bản về AOP, giới thiệu một
phiên bản thi công của nó là AspectJ, cú pháp và các khái niệm của AspectJ. Ngoài ra
trong phần này, tài liệu cũng đề cập đến các ứng dụng thích hợp cho việc áp dụng AOP.
Phần thứ 2, từ mục 6 đến hết: Trình bày cách triển khai các mẫu thiết kế (design
pattern) đã được sử dụng trong mô hình OOP sang mô hình AOP, cụ thể là triển khai trên
cú pháp của AspectJ.
1.2 Các thuật ngữ
Trước khi đi vào tìm hiểu về AOP (một phương pháp lập trình mới) chúng ta cần
hiểu một số thuật ngữ trong ngành công nghệ phần mềm hiện nay.
crosscutting concerns Chỉ các quan hệ giữa các module trong
một hệ thống phần mềm.
refactoring Refactoring là một kỹ thuật trong công
nghệ phần mềm mà mã nguồn chương
trình được cấu trúc lại nhằm đảm bảo tính
mềm dẻo, mở rộng chức năng của chương
trình đồng thời mã chương trình dễ hiểu
hơn cho người đọc.
middleware Là lớp trung gian trong các hệ thống phần
mềm . Một số middleware tiêu biểu như
EJB của Sun, Net Framework của
Microsoft
AOP Mô hình lập trình hướng tương quan
design pattern Là giải pháp thực hiện khi thiết kế các
ứng dụng nhằm đảm bảo chất lượng, tăng

tính mềm dẻo, tính trong sáng của mã
chương trình. Một số pattern hay được sử
dụng như IOC (Inversion of Control),
Singleton, Proxy, Abstract Factory Class
1.3 Hạn chế của các phương pháp lập trình hiện tại
Có lẽ khái niệm về AOP hiện nay đã được nhiều người biết đến, vì vậy ở đây ta chỉ
trình bày lại ngắn gọn các khái niệm cơ bản và các đặ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 cần bắt đầu tìm hiểu sự
hạn chế của 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.
Có lẽ các câu hỏi thường gặp nhất trong ngành công nghệ phần mềm hiện nay
là:Thiết kế một phần mềm như thế nào được gọi là đủ? Các hệ thống tốt cần xem xét đến
những yêu cầu hiện tại và cả những yêu cầu tiềm tàng trong tương lai. Sự lơ là các yêu cầu
trong tương lai có thể dẫn đến thay đổi nhiều phần của hệ thống hoặc có thể phải xây dựng
lại. Hay nói một cách khác, các thiết kế có khả năng đáp ứng nhu cầu cho tương lai kém có
thể dẫn đến hiện tượng “tràn thiết kế”, khó hiểu, hệ thống phình ra không mong muốn. Từ
đó hình thành một yêu cầu có một thiết kế có thể đáp ứng được các yêu cầu trong tương lai
mà không ảnh hưởng đến chất lượng.
Phương pháp lập trình 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 ... Tuy nhiên, người ta nhận thấy OOP
modul hoá yêu cầu theo kiểu mô phỏng một đối tượng (object) trong thế giới thực. Nhưng
sự mô phỏng này chỉ dừng ở mức tĩnh. Các đối tượng trong OOP hoạt động theo qui trình:
Sinh-Hoạt động-Tử, nhưng ở thế giới thực, thường thì một object có một chu kỳ sống:
Sinh-Hoạt động-Phát triển-Tử. Ở đây, 'Phát triển' là điều quan trọng, giải quyết được nó
tức bạn đã giải quyết được tính tiến hoá, thay đổi yêu cầu của bài toán phần mềm. Theo
OOP, bạn phải cân nhắc giữa dự đoán trước các yêu cầu phát triển  Phát triển phần mềm
nặng nề, hoặc bỏ qua các yêu cầu phát triển tương lai  hệ thống thiếu tính khả mở, tiến
hoá.
Nhược điểm trên của OOP là thấy rõ nhất, nhược điểm thứ hai là: Một hệ thống

thực tế là sự đan xen nhau giữa các yêu cầu. Lấy ví dụ: Bạn cần xử lý nghiệp vụ truy xuất
dữ liệu. Trong bản thiết kế, bạn có thể phân công trách nhiệm này cho một object cụ thể
nào đó và vấn đề này rất bình thường. Nhưng cùng với yêu cầu nghiệp vụ trên, thường thì
cần bổ sung vào các yêu cầu: Chứng thực, Phân quyền, Bảo mật, Lưu vết... Như vậy trong
method TruyXuatDuLieu() của một đối tượng được chỉ định nào đó, bạn phải bổ sung code
cho các yêu cầu nêu trên. Tình trạng này, người ta gọi là sự chồng chéo giữa các yêu cầu.
Nó làm nên một hệ thống lộn xộn, khó bảo trì, phát triển, tính tiến hoá cũng bị ảnh hưởng.
Vì khi cần bổ sung thêm một nghiệp vụ nào khác, bạn phải thay đổi tất cả các yêu cầu
nghiệp vụ liên quan.
2 Các đặc điểm của AOP
AOP được xây dựng trên các phương pháp lập trình hiện tại như OOP và lập trình
có cấu trúc.., bổ sung các khái niệm và cấu trúc để module hoá các quan hệ đan xen. 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 thi
các quan hệ cơ bản dưới hình thức lớp. Các aspect trong hệ thống đóng gói các quan hệ
đan xen lại với nhau. Chúng sẽ qui định cách các module khác nhau gắn kết với nhau để
định hình lên hệ thống cuối cùng.
Nền tảng cơ bản AOP khác với OOP là cách quản lý các quan hệ đan xen.Việc thực
thi của từng quan hệ của AOP bỏ qua các hành vi được tích hợp vào nó. Ví dụ, bussiness
module sẽ không quan tâm nó cần được log hoặ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.
2.1 Quản lý các concern hệ thống
Concern là các yêu cầu cụ thể hay mối quan tâm đặc trưng được xác định để thoả
mãn mục tiêu chung của hệ thống. Hệ thống phần mềm là sự gắn kết của tập các concern.
Ví dụ, hệ thống ngân hàng bao gồm các concern sau đây: quản lý khách hàng và quản lý tài
khoản, các giao dịch nội ngân hàng, các giao dịch ATM, chăm sóc khách hàng, lưu giữ các
thực thể trong hệ thống, xác nhận truy cập các dịch vụ, …Ngoài ra một phần mềm còn
phải đảm bảo khả năng dễ hiểu, dễ bảo hành và duy trì, dễ phát triển.
Concern được chia làm hai loại
1. Concern thành phần: Thể hiện các chức năng nội tại của một module.
2. Concern đan xen: Thể hiện các quan hệ ràng buộc giữa các module trong hệ thống

Một ứng dụng doanh nghiệp điển hình có thể bao gồm các concern đan xen sau:
authentication, logging, resource pooling, performance, storage management, data
persistence, security, multithread safety, transaction integrity, error checking…
Các concern được phục vụ cho một vài module. Ví dụ, logging tác động tới tất cả module
trong hệ thống, authencication tác động tới module có yêu cầu kiểm soát truy cập
Hình 1: Mô hình các concern mức hệ thống
Việc xác định được các concern trong hệ thống, chúng ta sẽ tập trung vào các concern một
cách độc lập và sẽ giảm độ phức tạp của hệ thống.
Hình 2: Mô hình ánh xạ yêu cầu người dùng sử dụng AOP
Hình 3: Mô hình đa chiều về sự phụ thuộc giữa các module với nhau
Các concern đan xen nhau giữa các module, các kỹ thuật thi công hiện tại sẽ trộn
chúng vào một module. Hình sau minh hoạ sự thực hiện này: Với mô hình biểu diễn nhiều
chiều của các concern được ánh xạ trên các ngôn ngữ một chiều như sau.
Hình 4: Mô hình ánh xạ từ các concern hệ thống sang các phương pháp lập trình truyền thống
Trong thiết kế phần mềm cách tốt nhất để đơn giản các hệ thống phức tạp là xác
định các concern rồi module hoá chúng. OOP được thiết kế để phục vụ việc module hoá
các concern cơ bản, nhưng khi gặp concern mức hệ thống thì OOP không đáp ứng được
yêu cầu. Hình sau minh hoạ một ví dụ thiết kế dùng phương pháp truyền thống. Ngay cả
khi bạn có một bản thiết kế tốt của logging module như: cung cấp các API trừu tượng
(Abstract API), giấu cách định dạng log message…Các module còn lại vẫn cần phải nhúng
các đoạn mã để gọi các logging API.
Hình 5: Các module yêu cầu logging đều phải nhúng các đoạn mã để gọi logging API
Đây chính là vấn đề sẽ được giải quyết bằng AOP, sử dụng AOP các module khác
không cần chứa đoạn mã gọi logging API. Hình 7 chỉ ra cách thực hiện module logging
dùng AOP có cùng chức năng với cách sử dụng OOP, như đã được chỉ ra trên hình vẽ,
cách thực hiện log bây giờ chỉ tồn tại trong logging module và logging aspect. Các
modulek khác không chứa bất kỳ đoạn mã nào gọi đến logging API. Như vậy các yêu cầu
đan xen giữa logging module và các module khác được thực hiện duy nhất trong một
module hay logging aspect. Với phương pháp module hoá này bất cứ sự thay đổi yêu cầu
nào về logging chỉ ảnh hưởng duy nhất đến logging aspect.

Hình 6: Giải quyết các concern hệ thống bằng phương pháp AOP
2.2 Phương pháp luận của AOP
Việc phát triển các hệ thống sử dụng AOP tương tự như phát triển các hệ thống sử
dụng các phương thức khác: xác đinh concern, thực hiện chúng, kết hợp lại để thành hệ
thống cuối cùng. Tuy nhiên cộng đồng nghiên cứu AOP đề xuất ba bước thực hiện sau:
1. 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 concern lõi và concern đan xen. Các concern lõi được tách ra khỏi các
concern đan xen.
2. Concern Implementation: Thực thi các concern một cách độc lập
3. Aspectual Recomposotion: Trong bước này chúng ta chỉ ra các quy lật kết hợp
bằng cách tạp ra các aspect. Quá trình này còn được 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 đích
Hình 7: Các giai đoạn phát triển sử dụng phương pháp AOP
2.2.1 Ưu điểm của AOP
Khi sử dụng AOP để giải quyết các bài toán chúng ta cần suy nghĩ về thiết kế và thi công
hệ thống theo một phương thức mới, với AOP ta sẽ có các ưu điểm sau
1. Tách biệt chức năng hơn của các module độc lập
2. Tính module hoá cao hơn
3. Phát triển hệ thống dễ dàng hơn
4. Kết nối muộn thiết kế
5. Tăng khả năng sử dụng lại mã
6. Giảm thời gian thi công hệ thống
7. Giảm giá thành của sản phẩm
2.2.2 Những nhược điểm
Mặc dù AOP có các ưu điểm trên khi thiết kế và thi công một hệ thống,nhưng trên thực tế
AOP cũng có một vài đặc điểm gay trở ngại sau
1. 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 giải quyết các bài toán theo cách tốt hơn
2. AOP không là cứu cánh cho các thiết kế cẩu thả
3. AOP phá vỡ tính đóng gói (encapsulation)

2.3 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 ..
Tên dự án Địa chỉ
1. AspectJ Aspectj.org
2. AspectWerkz Aspectwerkz.codehaus.org
3. Jboss AOP Jboss.org
4. Sping AOP www.spring framework.org
5. Aspect# Aspectsharp.sourceforge.net
6. AspectC++ Aspectc.org
7. JAC Jac.objectweb.org
3 Giới thiệu AspectJ
3.1 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, với AspectJ 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
3.2 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:
1. 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.
2. 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 sử dụng dự mở rộng của Java để chỉ ra các luật gắn kết cho concern tĩnh và
concern động.
3.2.1 Join point

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.
public class Account {
...
void credit(float amount) {
balance + = amount;
}
}
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ệ
try {
account.debit(amount);
} catch (InsufficientBalanceException ex) {
postMessage(ex);
OverdraftManager.applyOverdraftProtection(account,
amount);
}
• join point tại các advice:
public aspect MannersAspect {
before() : deliverMessage() {
System.out.print("Hello! ");
}
}
public aspect LoggingAspect {

after() : loggedOperations() {
...
_logger.log(...);
...
}
}
3.2.2 Pointcut
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 point cut
Thc hi n ph  ng thc execution(MethodSignature)
Gi ph   n g 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 class 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  n gđ initialization(ConstructorSignature)
Tin kh i to i t   n gđ preinitialization(ConstructorSignature)
Thc hi n advice adviceexecution()
3.2.3 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ác 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
1. before: Được thực hiện trước join point
2. after: Được thực hiện sau join point
3. 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, …)
Giả sử ta có pointcut được khai báo như sau
pointcut connectionOperation(Connection connection)
: call(* Connection.*(..) throws SQLException)&& target(connection);
Ta có thể xây dựng các advice như sau:
before(Connection connection):connectionOperation (connection) {
System.out.println("Performing operation on " + connection);
}
Object around(Connection connection) throws SQLException
: connectionOperation (connection) {
System.out.println("Operation " + thisJoinPoint
+ " on " + connection+ " started at " +
System.currentTimeMillis());
proceed(connection);
System.out.println("Operation " + thisJoinPoint
+ " on " + connection
+ " completed at "
+ System.currentTimeMillis());
}
Nếu trong around advice muốn thực hiện thao tác tại join point, phải sử dụng từ khoá
proceed().

3.2.4 Introduction
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). Chúng ta sẽ đề cập đến vấn đề
này trong phần static crosscutting.
3.2.5 Aspect
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.
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ụ sau 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()";
}

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:
public abstract aspect AbstractLogging {
public abstract pointcut logPoints();
public abstract Logger getLogger();
before() : logPoints() {
getLogger().log(Level.INFO, "Before: " + thisJoinPoint);
}
}
• Aspect có thể thừa kế class, abstract aspect và thi công các interface
public aspect BankLogging extends AbstractLogging {
public pointcut logPoints()
: call(* banking..*(..));
public Logger getLogger() {
return Logger.getLogger("banking");
}
}
• Aspect có thể nhúng trong class và interface như một aspect nằm trong
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
3.2.6 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.
3.2.6.1 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. Đoạn mã dưới đây mô tả cách giới thiệu 2
thành viên là thuộc tính minimumBalance và phương thức getAvailable() vào lớp Account.
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. Ví dụ từ khoá private chỉ ra thành viên chỉ được truy
cập từ aspect giới thiệu nó.
public aspect MinimumBalanceRuleAspect {
private float Account._minimumBalance;
public float Account.getAvailableBalance() {
return getBalance() - _minimumBalance;
}
after(Account account) :
execution(SavingsAccount.new(..)) && this(account) {
account._minimumBalance = 25;
}
before(Account account, float amount)throws
InsufficientBalanceException :
execution(* Account.debit())&& this(account) && args(amount)
{
if (account.getAvailableBalance() < amount) {
throw new InsufficientBalanceException(
"Insufficient available balance");
}
}
3.2.6.2 Sửa đổi cấu trúc thừa kế
Khi thực thi các quan hệ đan xen thường xuyên cần tác động đến tập các class hoặc
interface mà chúng có chung một kiểu cơ sở. AspectJ có thể sửa đổi cây thừa kế của một

lớp đã tồn tại để khai báo các lớp cha hoặc các interface của lớp đó miễn là không ảnh
hưởng đến qui luật thừa kế của Java.
Mẫu khai báo như sau:
declare parents : [ChildTypePattern] implements [InterfaceList];
declare parents : [ChildTypePattern] extends [Class or InterfaceList];
Ví dụ : Aspect khai báo tất cả các class và interface trong gói entities thực thi Identifiable
interface.
aspect AccountTrackingAspect {
declare parents : banking..entities.* implements Identifiable;
... tracking advices
}
3.3 Một số ứng dựng cơ bản của AOP
Dưới đây là một số ứng dụng điển hình sử dụng các ưu điểm của AOP trong việc thiết kế
và triển khai
1. Các kỹ thuật điều khiển, giám sát (monitor): Các kỹ thuật điều khiển, giám sát như
logging, tracing, profiling là những kỹ thuật chung để hiểu được các hành vi xảy ra
trong hệ thống. Ví dụ trong hệ thống nhà băng người quản trị muốn theo dõi thông
tin mỗi giao dịch trong hệ thống như tên tài khoản, thời gian giao dịch. Vì các chức
năng này xuyên suốt qua các module của ứng dụng nên khi triển khai các kỹ thuật
này với AOP là một cách tiếp cận tốt nhất có thể
2. Tăng cường chính sách (policy enforcement): Là một cơ chế bảo đảm các thành
phần trong hệ thống phải theo các quy tắc lập trình thực tế, tuân theo một số luật cụ
thể. Ví dụ bạn không thể gọi đến thư viên xử lý giao diện AWT trong mã của EJB
được.
3. Tối ưu hóa (resource pooling và caching): Khái niệm resource pooling và caching
chúng ta thường xuyên phải sử dụng trong các tình huống muốn tối ưu hóa ứng
dụng.
4 Giải quyết bài toán với AOP
Trong phần này chúng ta sẽ xem xét một số bài toán và một số giải pháp thực tiễn
để giúp một ứng dụng triển khai được trên AOP. Việc áp dụng một công nghệ mới để giải

quyết bài toán không bao giờ dễ dàng, đặc biệt khi bạn còn chưa nhìn thấy một hệ thống
nào triển khai thành công với công nghệ mới này. Chúng ta sẽ tìm hiểu cách sử dụng mô
hình hướng aspect như thế nào để giải quyết bài toán và các giải pháp về thiết kế.
Một khi thực sự chắc chắn muốn sử dụng AOP trong hệ thống phần mềm nào đó, ta
cần xác định tính thích hợp cho mỗi vấn đề khác nhau. Cần phải xem xét khả năng tối thiểu
các rủi ro của hệ thống. Chẳng hạn chúng ta có thể áp dụng AOP cho các module con, sau
khi chứng minh được khả năng của AOP, chúng ta sẽ tiếp tục triển khai trên các module
tiếp theo.
Mỗi pha trong quá trình phát triển phần mềm: thiết kế, thi công, test và bảo trì đều nhấn
mạnh tới một số hành động.
4.1 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.
Sau đây là một số bước điển hình sử dụng AOP trong pha thiết kế
1. Nhận biết các concern đan xen: Bước này là một phần trong việc ánh xạ các yêu
cầu người dùng tới các module. Một quy tắc là xem xét các concern được mô tả với
các tính tù hoặc trạng từ bắt đầu với từ “mọi”, ví dụ như mọi ngày, mọi nơi…Nhận
biết các concern này ban đầu sẽ giúp chúng ta tránh khỏi việc module hoá các
concern đan xen theo phương pháp truyền thống.
2. Thiết kế các concern lõi trước: Áp dụng các quy tắc và phương pháp truyền thống
để thiết kế các concern lõi. Công việc này càng làm tốt thì việc áp dụng các concern
đan xen sau này càng dễ.
3. Thiết kế các concern đan xen: Xác định các concern đan xen cần thiết, dễ thấy. Lên
một bộ khung cho các concern bạn cần và cũng có thể cả các concern bạn chưa cần
ngay lập tức.
4.2 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
1. Thực thi các concern lõi
a. Viết các concern lõi theo mô hình refactoring tốt nhất.
b. Sử dụng cách đặt tên nhất quán xuyên suốt ứng dụng
c. Tách biệt các concern đan xen từ các module trong bước đầu tiên.
d. Xem xét bất kỳ sự rải rác và chồng chéo mã chương trình
2. Thực thi các concern đan xen
a. Xác định các join point: Bước này cần xác định các vị trí trong mã chương
trình cần cho các quan hệ đan xen. Tiếp theo cần quyết định cách tốt nhất
để thể hiện các pointcut mà chúng sẽ chọn các join point
b. Lựa chọn các kỹ thuật sử dụng ở lớp dưới
c. Thiết kế các aspect
3. Thực hiện refactoring các aspect
4.3 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
1. Tạo các test case: Do AspectJ có khả năng sửa đổi các hành vi mà không cần sự
thay đổi thực sự nên AspectJ có thể trợ giúp để viết các chương trình kiểm tra.
2. Thực hiện kiểm tra hiệu năng hệ thống: Rất nhiều vấn đề chỉ được phát hiện ra vào
thời điểm triển khai hệ thống.AspectJ có thể bất chế độ theo dõi hiệu năng các
aspect, do đó chúng ta có thể xác định được kết quả gần với các hệ thống thực, và
chúng ta có thể quyết định sử dụng aspect hay không trên hệ thống triển khai để
tránh tràn bộ nhớ.
3. Báo cáo lỗi: Trong quá trình kiểm tra, khi chúng ta phát hiện ra các lỗi thì có thể sử
dụng aspect để chỉ ra các ngữ cảnh trong ứng dụng chứ không phải chỉ là ngăn xếp
của ngoại lệ được ném ra.
4.4 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

AspectJ 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êm các tính năng mới mà không làm đổ vỡ hệ
thống, Các chế độ tăng cường của aspect bảo đảm rằng các tính năng mới không
ảnh hưởng đến hệ thống cũng như tạo ra các lỗi mới
• Thực thi các tính năng mới: AspectJ có thể thêm các quan hệ đan xen mới mà
không thay đổi trực tiếp trên mã nguồn gốc
5 Triển khai một số pattern trên AspectJ
Mẫu thiết kế (design pattern) được sử dụng rất nhiều khi phát triển một phần mềm,
nó giúp người phát triển giải quyết các vấn đề như điều khiển đối tượng, tái sử dụng mã,
tăng hiệu năng chương trình.
“Design Patterns: Elements of Reusable Object-Oriented Software” được biên soạn
bởi Erich Gamma, Richard Helm, Ralph Johnson, và John Vlissides là một cuốn sách về
design pattern đã được công nhận chính thức như một tài liệu thực tiễn cho mô hình lập
trình hướng đối tượng (OOP). Các mẫu thiết kế trong quyển sách này được chia thành 3
loại, bao gồm: các mẫu thiết kế về cấu trúc đối tượng, hành vi đối tượng, và tạo lập đối
tượng. Các mẫu thiết kế được thực thi dựa trên cơ chế của các ngôn ngữ lập trình hướng
đối tượng đang có. Với mô hình lập trình hướng aspect, các mẫu thiết kế được xây dựng
với một số đặc điểm mới nhằm tận dụng được những ưu điểm của phương pháp mới này.
5.1 Các mẫu thiết kế cho việc tạo đối tượng
5.1.1 Singleton pattern
5.1.1.1 Giới thiệu
Singleton pattern là một mẫu thiết kế để đảm bảo trong một phiên làm việc của ứng
dụng chỉ có duy nhất một thể hiện ( instance) của đối tượng vào lúc chạy. Mẫu thiết kế này
thường được sử dụng để quản lý thông tin của một phiên làm việc của một ứng dụng.
Đối tượng không được khởi tạo trực tiếp trong chương trình (các hàm khởi tạo của
đối tượng được khai báo với từ khoá private) mà sẽ truy xuất qua một hàm static để trả về
thể hiện duy nhất của đối tượng.
public abstract aspect SingletonPattern issingleton( )
{
private Hashtable singletons = new Hashtable( );

public interface Singleton
{
}
public interface NonSingleton
{
}
// Pointcut định nghĩa các đối lớp cto define specify an interest
in all creations
// of all Classes that extend Singleton
pointcut selectSingletons( ) : call((Singleton +).new (..));
// Pointcut bảo đảm bất kỳ lớp nào trong cây thừa kế được đánh dấu
//là Non Singletons thì không được gộp trong logic của Singleton
pointcut excludeNonSingletons( ) : !call((NonSingleton +).new
(..));
Object around() : selectSingletons() && excludeNonSingletons( )
{
Class singleton =
thisJoinPoint.getSignature().getDeclaringType( );
synchronized(singletons)
{
if (singletons.get(singleton) == null)
{
singletons.put(singleton, proceed( ));
}
}
return (Object) singletons.get(singleton);
}
}
Aspect trừu tượng Singleton định nghĩa 2 vai trò: Singleton và NonSingleton. Các
vai trò này được thi công bởi interface nên các aspect trừu tượng có thể làm việc với

singleton mà không cần lo lắng về cách thi công chi tiết.
Hình 8: Cấu trúc của aspect trừu tượng với interface và các hàm được định nghĩa để hỗ trợ Singleton
pattern
5.1.1.2 Sử dụng
Sau đây là ví dụ chỉ ra aspect SingletonPattern được sử dụng trong ứng dụng:
Hình 9:Một ứng dụng trước và sau khi được tác động bởi Singleton pattern
public aspect PrinterSingleton extends SingletonPattern
{
declare parents: Printer implements Singleton;
declare parents: SpecializedPrinter implements NonSingleton;
}
Hình sau minh hoạ hoạt động của ứng dụng khi gọi hàm in 2 lần, lần đầu khi
instance của Printer chưa có, nó sẽ được khởi tạo lần đầu. Lần tiếp theo khi instance đã tồn
tại, hàm in sẽ lấy tham chiếu đến instance đã được khởi tạo ở bước đầu tiên.
Hình 10: Các bước thực hiện của mẫu thiết kế Singleton trong ứng dụng
5.1.2 Prototype pattern
5.1.2.1 Giới thiệu
Prototype pattern được sử dụng hỗ trợ sao chép một đối tượng dựa trên đối tượng gốc.
public abstract aspect PrototypePattern
{
protected interface Prototype
{
}
public Object Prototype.clone() throws CloneNotSupportedException
{
return super.clone( );
}
public Object cloneObject(Prototype object)
{
try

{
return object.clone( );
}
catch (CloneNotSupportedException ex)
{
return createCloneFor(object);
}
}
protected Object createCloneFor(Prototype object)
{
return null;
}
}
Aspect PrototypePattern định nghĩa Prototype interface mà nó có thể ứng dụng cho
bất cứ lớp nào trong ứng dụng cụ thể mà nó được là một nguyên mẫu. Những lớp này sẽ
thừa kế với hàm clone() để hỗ trợ việc sao chép đối tượng.
Hình 11: Cấu trúc của PrototypePattern aspect

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×