2009-05-17 33 views

Trả lời

6
  • hỗ trợ toolchain nghèo - gỡ rối, profilers vv có thể không biết về AOP và như vậy có thể làm việc trên mã như nếu tất cả các khía cạnh đã được thay thế bằng thủ tục đang
  • mã sưng lên - nguồn nhỏ có thể dẫn đến mã đối tượng lớn hơn nhiều là mã được "dệt" khắp các cơ sở mã
2

tôi sẽ không gọi nó là một nhược điểm quan trọng, nhưng vấn đề lớn nhất mà tôi đã thấy là một trong những trải nghiệm của nhà phát triển và Khả năng thích nghi. Không phải tất cả các nhà phát triển đều hiểu sự khác biệt giữa lập trình khai báo và bắt buộc.

Chúng tôi sử dụng policy injection application block trong EntLib 4.1 khá rộng rãi cũng như Unity cho DI và nó không phải là thứ chìm nhanh trong một số người. Tôi thấy tự mình giải thích lặp đi lặp lại cho cùng một người tại sao ứng dụng không hoạt động theo cách họ mong đợi. Nó thường bắt đầu họ giải thích một cái gì đó và tôi nói "thấy rằng tuyên bố trên phương pháp." :) Một số người nhận được nó ngay lập tức, yêu nó và trở nên cực kỳ hiệu quả - những người khác đấu tranh.

Đường cong học tập không phải là duy nhất cho AOP, nhưng có vẻ như có đường cong học tập cao hơn là những thứ khác mà nhà phát triển trung bình của bạn gặp phải.

7

Bảo trì và gỡ lỗi. Với aop, bạn đột nhiên có mã đang được chạy tại một điểm nhất định (phương thức nhập cảnh, thoát, bất cứ điều gì) nhưng chỉ cần nhìn vào mã, bạn không có đầu mối mà nó thậm chí còn được gọi, đặc biệt nếu cấu hình aop nằm trong tệp khác , như cấu hình xml. Nếu lời khuyên gây ra một số thay đổi, sau đó trong khi gỡ lỗi một ứng dụng, mọi thứ có thể trông kỳ lạ mà không có lời giải thích. Điều này không chỉ ảnh hưởng đến người mới.

+1

http://stackoverflow.com/a/201084/13940 –

8

Tôi nghĩ nhược điểm lớn nhất là sử dụng AOP tốt. Mọi người sử dụng nó ở những nơi mà nó không có ý nghĩa, ví dụ, và sẽ không sử dụng nó ở đâu. Ví dụ, một mẫu nhà máy rõ ràng là một cái gì đó mà AOP có thể làm tốt hơn, vì DI cũng có thể làm tốt, nhưng mô hình quan sát đơn giản hơn khi sử dụng AOP, cũng như mẫu chiến lược.

Sẽ khó khăn hơn khi kiểm tra đơn vị, đặc biệt nếu bạn thực hiện việc dệt khi chạy.

Nếu dệt trong thời gian chạy thì bạn cũng có thể đạt được hiệu suất.

Có cách tốt để mô hình những gì đang xảy ra khi trộn AOP với các lớp là một vấn đề, như UML tôi không nghĩ là một mô hình tốt tại thời điểm đó.

Trừ khi bạn đang sử dụng Eclipse thì các công cụ có vấn đề, nhưng với Eclipse và AJDT AOP thì dễ dàng hơn nhiều.

Chúng tôi vẫn sử dụng junit và nunit, và do đó phải sửa đổi mã của chúng tôi để cho phép kiểm tra đơn vị chạy, khi sử dụng chế độ Privileged AOP có thể thực hiện kiểm tra đơn vị tốt hơn bằng cách thử nghiệm các phương pháp riêng và chúng tôi không phải thay đổi chương trình của chúng tôi chỉ để làm cho chúng hoạt động với thử nghiệm đơn vị. Đây là một ví dụ khác không thực sự hiểu AOP có thể hữu ích như thế nào, chúng ta vẫn bị xích theo nhiều cách với quá trình triển khai đơn vị và triển khai mẫu thiết kế hiện tại và không thấy AOP có thể giúp chúng ta viết mã tốt hơn như thế nào.

+0

Thực sự khó kiểm tra đơn vị hơn? Không nên thử nghiệm đơn vị kiểm tra các khía cạnh và bây giờ không có gì để làm với tùy thuộc vào cách chúng được dệt? – Zombies

+1

@Zombies - Bạn tự kiểm tra các khía cạnh như thế nào, vì cách duy nhất để làm điều đó là bao gồm chúng. Nếu bạn dệt vào thời gian chạy thì nó phải được thiết lập để làm việc dệt khi chạy thử nghiệm. –

+0

Câu hỏi khiêm tốn từ một newbie: Mẫu nhà máy nào có mối quan tâm chéo? Ý tôi là, tại sao AOP làm tốt hơn? –

0

Đối với đối số bảo trì/gỡ lỗi, lập trình hướng-khía cạnh có xu hướng tương tác với tất cả các khía cạnh khác của thực tiễn phát triển phần mềm nhanh.

Các thực tiễn này có xu hướng xóa gỡ lỗi khỏi ảnh, thay thế bằng thử nghiệm đơn vị và phát triển theo hướng thử nghiệm. Ngoài ra, có thể dễ dàng hơn để duy trì một dấu chân mã nhỏ, rõ ràng với lời khuyên hơn là một dấu chân mã không thể hiểu được lớn mà không có lời khuyên (lời khuyên là thứ biến đổi một dấu chân mã lớn, không thể hiểu được thành một nhỏ, rõ ràng.). dấu chân mã).

0

Bởi vì sức mạnh của AOP, nếu có lỗi của bạn crosscutting, nó có thể gây ra vấn đề phổ biến rộng rãi. Mặt khác, ai đó có thể thay đổi điểm tham gia trong một chương trình - ví dụ: bằng cách đổi tên hoặc di chuyển các phương thức - theo cách mà người viết khía cạnh không mong đợi, với những hậu quả không mong muốn. Một lợi thế của việc mô-đun hóa các mối quan tâm crosscutting là cho phép một lập trình viên có thể ảnh hưởng đến toàn bộ hệ thống một cách dễ dàng.

8

Tôi nghĩ rằng vấn đề lớn nhất là không ai biết cách xác định ngữ nghĩa của một khía cạnh hoặc cách khai báo điểm tham gia không theo thủ tục.

Nếu bạn không thể xác định khía cạnh nào độc lập với ngữ cảnh mà nó sẽ được nhúng hoặc xác định hiệu ứng theo cách sao cho nó không làm hỏng ngữ cảnh được nhúng, bạn (và các công cụ) không thể lý do về những gì nó đáng tin cậy. (Bạn sẽ lưu ý ví dụ phổ biến nhất của các khía cạnh là "đăng nhập", được định nghĩa là "viết một số nội dung vào luồng đăng nhập mà ứng dụng không biết gì về", vì điều này khá an toàn). Điều này vi phạm quan điểm chính của David Parnas là information hiding. Một trong những ví dụ tồi tệ nhất về các khía cạnh mà tôi thấy là các khía cạnh chèn đồng bộ nguyên thủy vào mã; điều này ảnh hưởng đến chuỗi các tương tác có thể có mà mã có thể có. Làm thế nào bạn có thể biết điều này là an toàn (sẽ không bế tắc? Sẽ không livelock? Sẽ không thất bại để bảo vệ? Là phục hồi khi đối mặt với một ngoại lệ ném trong một đối tác đồng bộ hóa), trừ khi các ứng dụng chỉ làm những điều tầm thường đã.

Các điểm tham gia hiện được xác định bằng cách cung cấp một số loại ký tự đại diện nhận dạng (ví dụ: "đặt khía cạnh này vào bất kỳ phương thức nào có tên" DataBaseAccess * ". mã của chúng được đặt tên theo cách của chúng một cách hài hước, điều đó hầu như không có mô-đun.Điều tồi tệ hơn, tại sao nạn nhân của một khía cạnh thậm chí phải biết rằng nó tồn tại và xem xét điều gì sẽ xảy ra nếu bạn chỉ cần đổi tên một số phương thức; Điều cần thiết là các thông số điểm tham gia là cố ý; bằng cách nào đó, khía cạnh này phải biết vị trí cần thiết khi không có người lập trình đặt dấu hiệu neon tại mỗi điểm sử dụng. có một số điểm tham gia liên quan đến dòng điều khiển có vẻ tốt hơn một chút trong reg này ard).

Vì vậy, các khía cạnh là loại ý tưởng thú vị, nhưng tôi nghĩ rằng chúng là công nghệ chưa trưởng thành. Và sự non nớt đó làm cho việc sử dụng của họ trở nên mong manh. Và đó là nơi mà vấn đề nằm. (Tôi là một fan hâm mộ lớn của các công cụ kỹ thuật phần mềm tự động [xem tiểu sử của tôi] chỉ không theo cách này).

+2

+1, Kết hợp chuỗi các tên phương thức là một cực kỳ khủng khiếp (mong manh) cách để tiêm pointcuts. – Pacerier

Các vấn đề liên quan