Lập trình hướng theo khía cạnh là gì?


231

Tôi hiểu lập trình hướng đối tượng và đã viết chương trình OO trong một thời gian dài. Mọi người dường như nói về lập trình hướng theo khía cạnh, nhưng tôi chưa bao giờ thực sự biết nó là gì hoặc làm thế nào để sử dụng nó. Mô hình cơ bản là gì?

Câu hỏi này có liên quan, nhưng không hoàn toàn hỏi nó:

Lập trình hướng đối diện so với lập trình hướng đối tượng


5
IMAO, liên kết được cung cấp trong câu hỏi có câu trả lời rõ ràng và kỹ lưỡng hơn so với câu hỏi được chấp nhận ở đây. Những người đọc câu hỏi này có thể đọc nó đầu tiên.
David Chen

Câu trả lời:


198

AOP giải quyết vấn đề liên quan đến xuyên suốt , đó sẽ là bất kỳ loại mã nào được lặp lại theo các phương thức khác nhau và thông thường không thể được tái cấu trúc hoàn toàn vào mô-đun của chính nó, như ghi nhật ký hoặc xác minh. Vì vậy, với AOP, bạn có thể loại bỏ nội dung đó ra khỏi mã chính và xác định nó theo chiều dọc như vậy:

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

Và sau đó, một trình tạo khía cạnh được sử dụng để biên dịch mã thành:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 

14
Bạn có cần hỗ trợ ngôn ngữ cho việc này không? Ngôn ngữ nào là ví dụ của bạn trong?
Sophie

8
Đây là mã giả nhưng ví dụ nổi tiếng nhất là AspectJ, đây là một sửa đổi AOP của Java, sử dụng một kỹ thuật tương tự được gọi là các điểm cắt.
Đánh dấu Cidade

71
Thư. Và tôi nghĩ OOP là quá mức cần thiết.
Aiden Bell

17
Đánh dấu, điều này giống như trang trí các điểm vào và ra của một phương thức?
Filip Dupanović

3
@AidenBell Nếu hành động vô hình ở khoảng cách xa có thể được coi là voodoo, thì vâng, đó là voodoo. Trong Moose metaprogamming, các công cụ sửa đổi phương thức như trước, sau, xung quanh, bên trong, gia tăng thực hiện chính xác điều đó. Nó che khuất luồng thực thi của chương trình. Chúng có thể gần như không thể theo dõi, đặc biệt là khi chúng xuất phát từ phiên bản các khía cạnh của hệ thống mà nó gọi là vai trò . Người ta có thể sáng tác các hệ thống phức tạp đáng kinh ngạc với tất cả điều này.
tchrist

13

Thật không may, dường như rất khó để làm cho AOP thực sự hữu ích trong một tổ chức cỡ trung bình thường. (Hỗ trợ biên tập viên, ý thức kiểm soát, thực tế là bạn bắt đầu với những thứ không quan trọng dẫn đến thối mã, mọi người về nhà với gia đình, v.v.)

Tôi đặt hy vọng vào lập trình định hướng tổng hợp , đó là một cái gì đó ngày càng thực tế hơn. Nó kết nối với nhiều ý tưởng phổ biến và cung cấp cho bạn một cái gì đó thực sự mát mẻ.

Nhìn vào một triển khai sắp tới tại đây: qi4j.org/

Tái bút Trên thực tế, tôi nghĩ rằng một trong những người đẹp bị AOP cũng là gót chân achilles của nó: Nó không xâm phạm, để mọi người bỏ qua nếu có thể, vì vậy nó sẽ được coi là mối quan tâm thứ yếu trong hầu hết các tổ chức.


8

Sao chép từ một bản sao để hoàn thiện (Einstein):

Các ví dụ cổ điển là bảo mật và đăng nhập. Thay vì viết mã trong ứng dụng của bạn để ghi nhật ký x hoặc kiểm tra đối tượng z để kiểm soát truy cập bảo mật, có một ngôn ngữ "ngoài băng" của mã thông thường có thể tiêm bảo mật một cách có hệ thống hoặc đăng nhập vào các thói quen không có chúng trong đó như một cách mà mặc dù mã của bạn không cung cấp nó - nó được chăm sóc.

Một ví dụ cụ thể hơn là hệ điều hành cung cấp các điều khiển truy cập vào một tệp. Một chương trình phần mềm không cần kiểm tra các hạn chế truy cập vì hệ thống cơ bản thực hiện công việc đó.

Nếu bạn nghĩ rằng bạn cần AOP theo kinh nghiệm của tôi, bạn thực sự cần đầu tư nhiều thời gian và công sức hơn vào việc quản lý dữ liệu meta phù hợp trong hệ thống của mình, tập trung vào thiết kế cấu trúc / hệ thống được suy nghĩ kỹ.


7

Sao chép từ Spring in Action

AOP thường được định nghĩa là một kỹ thuật thúc đẩy phân tách các mối quan tâm trong một hệ thống phần mềm. Các hệ thống bao gồm một số thành phần, mỗi thành phần chịu trách nhiệm cho một phần chức năng cụ thể. Nhưng thường thì các thành phần này cũng mang các trách nhiệm bổ sung ngoài chức năng cốt lõi của chúng. Các dịch vụ hệ thống như ghi nhật ký, quản lý giao dịch và bảo mật thường tìm đường vào các thành phần có trách nhiệm cốt lõi là một thứ khác. Các dịch vụ hệ thống này thường được gọi là mối quan tâm xuyên suốt vì chúng có xu hướng cắt ngang nhiều thành phần trong một hệ thống.


6

Sao chép từ một bản sao để hoàn thiện (Buzzer):

Các thuộc tính lớp và phương thức trong .NET là một dạng lập trình hướng theo khía cạnh. Bạn trang trí các lớp / phương thức của bạn với các thuộc tính. Đằng sau hậu trường, điều này thêm mã vào lớp / phương thức của bạn để thực hiện các chức năng cụ thể của thuộc tính. Ví dụ, đánh dấu một lớp tuần tự hóa cho phép nó được tuần tự hóa tự động để lưu trữ hoặc truyền đến một hệ thống khác. Các thuộc tính khác có thể đánh dấu các thuộc tính nhất định là không tuần tự hóa và các thuộc tính này sẽ được tự động bỏ qua khỏi đối tượng được tuần tự hóa. Tuần tự hóa là một khía cạnh, được triển khai bởi các mã khác trong hệ thống và được áp dụng cho lớp của bạn bằng cách áp dụng thuộc tính "cấu hình" (trang trí).


5

AOP có thể được sử dụng để thực hiện các hành động không liên quan đến logic nghiệp vụ của ứng dụng của bạn như ghi nhật ký, lưu trữ, v.v. Những hành động này có thể được đặt trong một phần riêng biệt của ứng dụng và sau đó được sử dụng lại trong toàn bộ ứng dụng. Thường có hai cách để thực hiện điều này. Tách mã tự động bởi bộ xử lý trước / sau một phương thức hoặc đính kèm các lớp proxy chặn cuộc gọi phương thức và sau đó có thể thực hiện mọi thứ trước / sau khi gọi phương thức.

Đây là một ví dụ trong .Net. Nó sử dụng các lớp proxy để chặn các cuộc gọi phương thức và thực thi mã trước sau các cuộc gọi phương thức saif.

Lập trình hướng đối tượng (AOP) trong .NET Core và C # bằng AutoFac và DynamicProxy


4

Có một ví dụ về AOP, nó đã sử dụng AOP mùa xuân làm ví dụ. Ví dụ khá dễ hiểu.

Khung công tác Spring AOP (lập trình hướng theo khía cạnh) được sử dụng để mô đun hóa các mối quan tâm xuyên suốt về các khía cạnh. Nói một cách đơn giản, nó chỉ là một công cụ chặn để chặn một số quy trình, ví dụ, khi một phương thức được thực thi, Spring AOP có thể chiếm quyền điều khiển phương thức thực thi và thêm chức năng bổ sung trước hoặc sau khi thực hiện phương thức.

Tham khảo: http://www.mkyong.com/spring/spring-aop-examples-advice/


Trong điện toán, lập trình hướng theo khía cạnh (AOP) là một mô hình lập trình nhằm mục đích tăng tính mô đun bằng cách cho phép tách các mối quan tâm xuyên suốt.
RF

3

AOP là một cách để mô đun hóa tốt hơn ứng dụng của bạn cho chức năng trải dài trên nhiều ranh giới. AOP là một cách khác để đóng gói các tính năng này và tuân theo Trách nhiệm đơn lẻ bằng cách chuyển các mối quan tâm xuyên suốt này (ghi nhật ký, xử lý lỗi, v.v.) ra khỏi các thành phần chính của ứng dụng của bạn. Khi được sử dụng một cách thích hợp AOP có thể dẫn đến mức độ duy trì và mở rộng cao hơn trong ứng dụng của bạn theo thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.