Bùi Duy Hải


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



tải về 0.58 Mb.
trang3/4
Chuyển đổi dữ liệu20.05.2018
Kích0.58 Mb.
#38988
1   2   3   4

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

  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.
        1. Sự hạn chế của lập trình hướng đối tượng(OOP)


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 3: OOP

Ta xét một ví dụ cụ thể xây dựng 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 sau :

  • Lớp Shape: là một lớp Abstract chứa phương thức moveBy(int,int) di chuyển hình

  • Lớp Display: hiển thị hình ảnh.

  • Lớp Point: mô tả 1 điểm hình học chứa hai thuộc tính là tọa độ x, y được kế thừa từ lớp Shape.

  • Lớp Line: mô tả 1 đoạn thẳng, chứa 2 thuộc tính là điểm đầu và điểm cuối của đoạn thẳng và được kế thừa từ lớp Shape.

Dưới đây là sơ đồ lớp của bài toán

Figure 1

Hình 4: Sơ đồ lớp của 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ó.

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

  • 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.
        1. Lập trình hướng khía cạnh


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 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 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 đó:

public aspect UpdateSignaling{

pointcut updateDisplay():execution(void *.setX(int))

|| execution(void*.setY(int))

|| execution(void*.moveBy(int, int));

after(): updateDisplay(){

display.update(this);



}

}

Hình 5: Dùng AOP giải quyết bài toán vẽ hình

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

          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.
          1. Ư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 :

  • 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.
      1. Các khái niệm trong Aspect

        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. 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 Aspect mọi thứ đều xoay quanh join point.
        1. 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 join point đó.Ví dụ một pointcut có thể chọn một join point là 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 tham số của phương thức đó.

Bảng 1:Ánh xạ giữa các loại join point và pointcut tương ướng



Loại join point

Cú pháp point cut

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()


        1. 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 dan 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
        1. Aspect


Aspect là phần tử trung tâm của Aspect, 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.

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:



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


  1. tải về 0.58 Mb.

    Chia sẻ với bạn bè của bạn:
1   2   3   4




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương