Có những lựa chọn thay thế nào cho các mối quan tâm xuyên suốt ngoài lập trình định hướng theo khía cạnh? [đóng cửa]


18

Lập trình hướng theo khía cạnh hứa hẹn sẽ giải quyết các mối quan tâm xuyên suốt, nhưng tôi chưa hoàn toàn bán nó. Đã có bất kỳ nỗ lực nào khác để đối phó với vấn đề này?


Mẫu khách truy cập có thể giải quyết rất nhiều tình huống hiện đã được giải quyết thông qua AOP.
Steven Evers

@SnOrfus: Cũng xem phản hồi của tôi bên dưới, nơi tôi nói về thư viện DJ cho Java: Một cách năng động để sử dụng mẫu khách truy cập! Đáng để kiểm tra. (Đây cũng là một kỹ thuật chung mà bạn có thể tự mình sử dụng với Reflection.)
Macneil

Câu trả lời:


6

Khi có thể, bạn có thể gói gọn các mối quan tâm xuyên suốt vào các mô-đun riêng biệt sau đó được sử dụng trong toàn bộ ứng dụng thông qua việc tiêm phụ thuộc. Điều này cho phép bạn phần nào tách rời việc triển khai mối quan tâm xuyên suốt từ việc sử dụng trong suốt mã.

Điều này không phải lúc nào cũng hoạt động thanh lịch, mặc dù. Đó là lý do mọi người đang cố gắng giải quyết vấn đề bằng những thứ như AOP.


6

Hai lựa chọn khác mà tôi chưa từng khám phá:

Lập trình chức năng với Monads và Mũi tên

Trong FP, bạn đại diện cho một mối quan tâm xuyên suốt như mọi thứ khác: như một cái gì đó bạn truyền vào trong một cuộc gọi chức năng. Vì việc đó rõ ràng trở nên tẻ nhạt, bạn có thể sử dụng Monads (hoặc có thể là Mũi tên) để che giấu thông tin bổ sung được truyền qua.

Ví dụ AOP phổ biến nhất là đăng nhập. Với Monads, bạn sẽ tạo một đơn vị "Logger" giữ danh sách các tin nhắn. Bất kỳ chức năng nào bạn thực hiện thông qua LoggerMonad đều có khả năng đăng thông điệp tường trình. Với Mũi tên, bạn sẽ mô hình hóa toàn bộ luồng dữ liệu của ứng dụng và sẽ thực hiện quy trình ghi nhật ký vào mô hình khi thích hợp. Tôi nghĩ. Mũi tên khá phức tạp.

Lập trình dựa trên thực thể / thành phần

Một cái gì đó tôi đã nghiên cứu và thử nghiệm cho một công cụ trò chơi. Thay vì "các đối tượng" như trong OOP, bạn phân tách mọi thứ thành các gói dữ liệu (thành phần) và các dịch vụ hoạt động trên một loại thành phần. Các thành phần được nhóm lại với nhau theo các ID chung, như trong cơ sở dữ liệu quan hệ và các nhóm thành phần được liên kết là các Thực thể. Để thêm đăng nhập vào một hệ thống như vậy, bạn sẽ thêm một dịch vụ ghi nhật ký mới các kích hoạt dựa trên các thành phần được truyền qua nó.

Cả hai phương pháp đều cho phép một người dễ dàng thực hiện một thay đổi xuyên suốt rất dễ dàng, nhưng cả hai đều là mô hình kiến ​​trúc cấp cao. Vì vậy, bạn có thể sẽ cần phải sử dụng chúng ngay từ đầu. Về mặt lý thuyết, mô hình Thành phần có thể được làm việc trong một hệ thống OOP hiện có. Tôi đoán các đơn nguyên cũng có thể như vậy nếu ngôn ngữ của bạn đủ mạnh.


Khi bạn nói về Monads và Mũi tên, bạn cũng nên đề cập đến Functor ứng dụng.
Chờ

3

Có một số cách để giải quyết các vấn đề liên quan đến giao thoa:

  • Sử dụng các mẫu, thành ngữ hoặc cơ chế trừu tượng tốt hơn : Mã có thể được giao thoa ngay cả khi nó có thể được mô đun hóa. Để duy trì mã, bạn sẽ cần cấu trúc lại để sử dụng kỹ thuật thiết kế có thể mô đun hóa nó. Tái cấu trúc như vậy có thể giới thiệu giao thoa của một loại khác, nhưng hy vọng những gì cắt ngang là ổn định, và không có khả năng thay đổi.

  • Phát triển các tính năng ngôn ngữ phong phú hơn : Nhiều biểu hiện của giao thoa có thể được giải quyết thông qua các cơ chế trừu tượng hóa tốt hơn và đôi khi các tính năng ngôn ngữ mới là cần thiết. Chẳng hạn, các ngôn ngữ nâng cao hơn bao gồm các tính năng hướng đối tượng và chức năng thường không sử dụng nhiều mẫu thiết kế, vì chúng không cần thiết. Lưu ý rằng bản thân các mẫu thiết kế có thể giao thoa trong tự nhiên , vì chúng mô tả vai trò của một số đối tượng và lớp khác nhau. Trong Java, sự phản chiếu thường có thể được sử dụng thay vì một khía cạnh, mặc dù với chi phí thời gian chạy cao hơn. Ví dụ: bằng cách sử dụng sự phản chiếu, bạn có thể hỗ trợ mẫu khách truy cập qua hàng trăm lớp chỉ bằng một vài dòng mã. Thư viện DJtừ Đông Bắc là một giải pháp phản chiếu làm được điều đó. Mixins là một kỹ thuật mạnh mẽ có sẵn trong C ++ (nhưng không phải Java) và có thể cung cấp cho bạn một số trường hợp sử dụng tương tự như một khía cạnh.

  • Cung cấp hỗ trợ công cụ tốt hơn : Các kỹ thuật như sử dụng grepvà thực hiện các hoạt động tái cấu trúc có thể xử lý các vấn đề liên quan đến mã chéo. Ví dụ, tên của một phương pháp tuyên bố trong một giao diện có thể cắt ngang chương trình. . những nơi trong mã của bạn sử dụng tên. Bằng cách này, nó có thể ngôn ngữ không cần tính năng khi môi trường lập trình là đủ biểu cảm cho bạn.

  • Sử dụng ngôn ngữ dành riêng cho tên miền : Các ngôn ngữ khía cạnh ban đầu, xuất hiện trước AspectJ, chỉ dành riêng cho miền và chỉ áp dụng cho một số vấn đề nhất định, chẳng hạn như đồng bộ hóa luồng hoặc phân tích luồng dữ liệu để kết hợp hiệu quả các thành phần chức năng. Những ngôn ngữ này là thử nghiệm, nhưng dường như rất thành công trong việc mô đun hóa các mối quan tâm mà mặt khác là giao thoa.

  • Sử dụng các kỹ thuật lập trình sáng tạo : Bước lên cấp độ meta có thể được coi là một kỹ thuật triển khai cho lập trình hướng theo khía cạnh, nhưng đó là một lĩnh vực đủ lớn để vượt qua các khía cạnh đơn giản. Các kỹ thuật tạo (trong đó một chương trình tạo mã nguồn cho một chương trình khác) cũng liên quan đến các ngôn ngữ dành riêng cho tên miền.

Đối với tất cả những điều này, tôi nghĩ rằng học AOP là phù hợp. AOP có thể giúp bạn mở rộng các khái niệm về mã, ngay cả khi bạn không sử dụng ngôn ngữ AOP.


2

Trong các phần tử mã gắn thẻ chung với tính năng khai báo, nhưng cụ thể là hệ thống Thuộc tính trong thế giới C # /. NET / Mono.


Bạn có thể cụ thể hơn không? Những gì bạn mô tả là làm thế nào một số hệ thống AOP hoạt động.
Steven Evers

2
Đó là khá nhiều AOP.
Matt H

AOP theo nghĩa điển hình / cổ điển của nó đòi hỏi một công cụ hỗ trợ (IDE dệt khía cạnh) để thực hiện nó ở quy mô lớn. AOP làm cho việc lập luận về mã từ mã nguồn chính trở nên khó khăn hơn. Thật khó để dự đoán hành vi của các thành phần của bạn khi chương trình của bạn bị xâm nhập bởi các zombie khía cạnh. Các thuộc tính hoặc thẻ cung cấp chức năng tương tự nhưng với biểu diễn rõ ràng trong mã nguồn.

Lưu ý rằng vấn đề của tôi không chính xác với các vấn đề mà cách AOP giải quyết. Mối quan tâm duy nhất của tôi là với AOP, mã nguồn của tôi không phải là nguồn đủ để dự đoán hành vi của chương trình của tôi.

@mumtaz: Tôi có thể thấy điều đó sẽ như thế nào khi áp dụng các khía cạnh cho toàn bộ không gian tên. Phương pháp khác của AOP: các phương thức / thuộc tính / v.v. để áp dụng (các) khía cạnh cho nó, giống hệt với những gì bạn mô tả.
Steven Evers

2

Tôi không phải là chuyên gia về AOP, nhưng từ khi đọc về nó trong nhiều năm qua, nó dường như luôn là một dạng siêu lập trình yếu hơn được cung cấp bởi Lisp , đặc biệt là các phần như giao thức metaobject của nó.

Điều này sẽ không gây ngạc nhiên, tôi cho rằng: Gregor Kiczales là một trong những tác giả của AMOP, và sau đó đã viết AspectJ cho Java!

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.