2008-08-21 7 views
36

AOP là một mô hình lập trình thú vị theo ý kiến ​​của tôi. Tuy nhiên, chưa có thảo luận về nó ở đây trên stackoverflow (ít nhất là tôi không thể tìm thấy chúng). Bạn nghĩ gì về nó nói chung? Bạn có sử dụng AOP trong các dự án của bạn không? Hoặc bạn có nghĩ rằng nó là một công nghệ thích hợp sẽ không tồn tại trong một thời gian dài hoặc sẽ không biến nó thành dòng chính (như OOP đã làm, ít nhất là trong lý thuyết;))?Bạn có sử dụng AOP (Lập trình hướng Aspect) trong phần mềm sản xuất không?

Nếu bạn sử dụng AOP, vui lòng cho chúng tôi biết bạn cũng sử dụng công cụ nào. Cảm ơn!

Trả lời

12

Có.

Các mối quan tâm trực giao, như bảo mật, được thực hiện tốt nhất với chặn theo phong cách AOP. Cho dù đó là thực hiện tự động (thông qua một cái gì đó giống như một container tiêm phụ thuộc) hoặc bằng tay là không quan trọng đối với mục tiêu cuối cùng.

Ví dụ: thuộc tính "trước/sau" trong xUnit.net (dự án mã nguồn mở tôi chạy) là một hình thức chặn phương pháp kiểu AOP. Bạn trang trí các phương pháp thử nghiệm của mình với các thuộc tính này, và ngay trước và sau khi phương thức thử nghiệm đó chạy, mã của bạn được gọi. Nó có thể được sử dụng cho những thứ như thiết lập cơ sở dữ liệu và quay trở lại kết quả, thay đổi bối cảnh bảo mật trong đó thử nghiệm chạy, v.v.

Ví dụ khác: thuộc tính bộ lọc trong ASP.NET MVC cũng hoạt động như bộ chặn phương pháp kiểu AOP chuyên dụng . Một, ví dụ, cho phép bạn nói cách xử lý các lỗi chưa xử lý, nếu chúng xảy ra trong phương thức hành động của bạn.

Nhiều thùng chứa phụ thuộc tiêm, bao gồm Castle Windsor và Unity, hỗ trợ hành vi này hoặc là "trong hộp" hoặc thông qua việc sử dụng các phần mở rộng.

+1

Hãy cẩn thận khi xác nhận điều gì đó là tốt nhất. Nhiều chuyên gia tin rằng mô hình năng lực là cách tốt nhất để làm an ninh, và rằng AOP là một điều khủng khiếp. –

+0

@Brad, Bạn nói một số điều được thực hiện tốt nhất với AOP. Bạn có thể giải thích những gì * chính xác * là lợi thế bằng cách làm nó theo cách AOP so với cách * truyền thống *? – Pacerier

3

Chúng tôi đã sử dụng aspectJ trong một trong những dự án lớn của tôi trong một thời gian dài. Dự án được tạo thành từ một số dịch vụ web, mỗi dịch vụ có một số chức năng, đó là giao diện người dùng cho một hệ thống xử lý/truy vấn tài liệu phức tạp. Một nơi nào đó xung quanh 75k dòng mã. Chúng tôi đã sử dụng các khía cạnh cho hai phần chức năng tương đối nhỏ.

Đầu tiên là truy tìm luồng ứng dụng. Chúng tôi đã tạo ra một khía cạnh chạy trước và sau mỗi cuộc gọi hàm để in ra chức năng "đã nhập" và "đã thoát" chức năng "". Tôi có thể sử dụng nó như một công cụ gỡ lỗi, chỉ chọn các hàm mà chúng tôi muốn theo dõi tại một thời điểm nhất định. Đây là một cách sử dụng thực sự tốt đẹp cho các khía cạnh trong dự án của chúng tôi.

Điều thứ hai chúng tôi đã làm là số liệu cụ thể của ứng dụng. Chúng tôi đặt các khía cạnh xung quanh các phương pháp dịch vụ web của chúng tôi để nắm bắt thời gian, thông tin đối tượng, v.v. và kết xuất các kết quả trong cơ sở dữ liệu. Điều này là tốt đẹp bởi vì chúng tôi có thể nắm bắt thông tin này, nhưng vẫn giữ tất cả các mã chụp tách biệt với mã "thực" đã làm công việc.

Tôi đã đọc về một số giải pháp tốt đẹp mà các khía cạnh có thể mang lại cho bảng, nhưng tôi vẫn không tin rằng họ thực sự có thể làm bất cứ điều gì bạn không thể làm (có thể tốt hơn) với công nghệ "bình thường". Ví dụ, tôi không thể nghĩ ra bất kỳ tính năng hoặc chức năng chính nào mà bất kỳ dự án nào của chúng tôi cần không thể thực hiện dễ dàng mà không có khía cạnh - nơi tôi thấy các khía cạnh hữu ích là những thứ nhỏ nhặt mà tôi đã đề cập .

15

Python hỗ trợ AOP bằng cách cho phép bạn sửa đổi động các lớp của nó khi chạy (trong Python thường được gọi là monkeypatching chứ không phải là AOP). Dưới đây là một số trường hợp sử dụng AOP của tôi:

  1. Tôi có một trang web trong đó mỗi trang được tạo bởi hàm Python.Tôi muốn tham gia một lớp học và làm cho tất cả các trang web được tạo bởi lớp đó được bảo vệ bằng mật khẩu. AOP đến giải cứu; trước khi mỗi hàm được gọi, tôi thực hiện kiểm tra phiên thích hợp và chuyển hướng nếu cần.

  2. Tôi muốn thực hiện một số ghi nhật ký và lược tả trên một loạt các chức năng trong chương trình của mình trong quá trình sử dụng thực tế. AOP cho phép tôi tính toán thời gian và in dữ liệu để ghi lại các tệp mà không thực sự sửa đổi bất kỳ chức năng nào trong số này.

  3. Tôi có một mô-đun hoặc lớp học đầy đủ các chức năng không an toàn chủ đề và tôi thấy mình sử dụng nó trong một số mã đa luồng. Một số AOP thêm khóa xung quanh các cuộc gọi chức năng này mà không cần phải đi vào thư viện và thay đổi bất cứ điều gì.

Loại điều này không xuất hiện thường xuyên, nhưng bất cứ khi nào nó xảy ra, tính năng monkeypatching rất hữu ích. Python cũng có trang trí thực hiện các mẫu thiết kế trang trí (http://en.wikipedia.org/wiki/Decorator_pattern) để thực hiện những điều tương tự.

Lưu ý rằng các lớp sửa đổi động cũng có thể cho phép bạn làm việc xung quanh lỗi hoặc thêm tính năng vào thư viện của bên thứ ba mà không thực sự phải sửa đổi thư viện đó. Tôi gần như không bao giờ cần phải làm điều này, nhưng một vài lần nó xuất hiện nó vô cùng hữu ích.

1

Tôi sử dụng AOP nhiều trong các ứng dụng C# của mình. Tôi không phải là một fan hâm mộ lớn của việc phải sử dụng thuộc tính, vì vậy tôi sử dụng Castle DynamicProxy và Boo để áp dụng các khía cạnh trong thời gian chạy mà không gây ô nhiễm mã của tôi

4

Tại Terracotta chúng tôi sử dụng AOP và bytecode thiết bị đo đạc khá rộng rãi để tích hợp với công cụ và thứ ba phần mềm của bên. Ví dụ: Spring intergration của chúng tôi được thực hiện một phần lớn bằng cách sử dụng aspectwerkz. Tóm lại, chúng ta cần chặn các cuộc gọi đến các bean Spring và các nhà máy đậu tại các điểm khác nhau để phân cụm chúng.

Vì vậy, AOP có thể hữu ích để tích hợp với mã của bên thứ ba mà không thể sửa đổi được. Tuy nhiên, chúng tôi thấy rằng có một lỗ hổng lớn - nếu có thể, chỉ sử dụng API công khai của bên thứ ba trong các điểm tham gia của bạn, nếu không bạn có nguy cơ bị mã bị hỏng do thay đổi phương thức riêng tư trong bản phát hành nhỏ tiếp theo và một cơn ác mộng bảo trì.

4

AOP và phân giới cắm mốc giao dịch là trận đấu được thực hiện ở trên trời. Chúng tôi sử dụng các chú thích Spring AOP @Transaction, nó làm cho việc phân định cú pháp tx dễ dàng và trực quan hơn tôi từng thấy ở bất kỳ nơi nào khác.

1

Chúng tôi sử dụng AOP trong mặt tiền phiên của chúng tôi để cung cấp một khuôn khổ nhất quán cho khách hàng của chúng tôi để tùy chỉnh ứng dụng của chúng tôi. Điều này cho phép chúng tôi hiển thị một điểm tùy chỉnh đơn lẻ mà không cần phải thêm hỗ trợ móc thủ công cho từng phương pháp.

Ngoài ra, AOP cung cấp một điểm cấu hình duy nhất cho thiết lập giao dịch và teardown bổ sung và các thông tin ghi nhật ký thông thường. Tất cả đã nói, nhiều hơn nữa duy trì hơn làm tất cả điều này bằng tay.

7

Tôi không hiểu cách người ta có thể xử lý các mối quan tâm chéo như đăng nhập, bảo mật, quản lý giao dịch, xử lý ngoại lệ theo cách sạch sẽ mà không cần sử dụng AOP.

Bất kỳ ai sử dụng khung công tác Spring (có thể khoảng 50% nhà phát triển doanh nghiệp Java) đang sử dụng AOP cho dù họ có biết hay không.

+2

Bạn có nhớ giải thích chính xác * cách * là 'Nhật ký ([đối số])' ô uế không? Những gì * vấn đề * nó tạo ra? – Pacerier

1

Ứng dụng chính mà tôi làm việc trên bao gồm máy chủ tập lệnh. AOP cho phép máy chủ kiểm tra các thuộc tính của tập lệnh trước khi quyết định có tải tập lệnh vào Miền ứng dụng hay không. Vì một số kịch bản khá cồng kềnh, điều này làm cho tải nhanh hơn nhiều vào thời gian chạy.Chúng tôi cũng sử dụng và dự định sử dụng một số lượng đáng kể các thuộc tính cho những thứ như kiểm soát trình biên dịch, kiểm soát lưu lượng và gỡ lỗi trong IDE, mà không cần phải là một phần của ứng dụng phân phối cuối cùng.

1

Chúng tôi sử dụng PostSharp cho giải pháp AOP của chúng tôi. Chúng tôi có bộ nhớ đệm, xử lý lỗi và cơ sở dữ liệu thử lại các khía cạnh mà chúng tôi hiện đang sử dụng và đang trong quá trình thực hiện kiểm tra bảo mật của chúng tôi một Aspect.

Hoạt động tốt cho chúng tôi. Các nhà phát triển thực sự thích chia tách mối quan tâm. Các kiến ​​trúc sư thực sự thích có logic cấp nền tảng hợp nhất ở một vị trí.

Thư viện PostSharp là trình biên dịch bài viết thực hiện việc tiêm mã. Nó có một thư viện của các can thiệp được xác định trước mà não chết dễ thực hiện. Nó cảm thấy như hệ thống dây điện trong xử lý sự kiện.