Lập trình hướng khía cạnh

Trong điện toán, lập trình hướng khía cạnh (tiếng Anh: aspect-oriented programming, viết tắt: AOP) là một mẫu hình lập trình nhằm tăng tính mô đun bằng cách cho phép phân tách những mối quan tâm xuyên suốt. Nó làm như vậy bằng cách thêm hành vi bổ sung vào mã đã tồn tại (một lời khuyên) mà không sửa đổi chính mã đó, thay vì xác định cụ thể mã nào được sửa đổi thông qua một đặc tả "điểm cắt" (pointcut), ví dụ như "lưu lại (log) tất cả lời gọi hàm khi tên hàm bắt đầu với từ 'set'". Điều này cho phép những hành vi không phải là trung tâm của logic nghiệp vụ (ví dụ như lưu lại) được thêm vào chương trình mà không làm rối lõi của mã đến các chức năng. AOP tạo cơ sở cho phát triển phần mềm hướng khía cạnh (aspect-oriented software development).

AOP bao gồm các phương thức và công cụ lập trình hỗ trợ cho mô đun hóa các mối quan tâm ở mức độ mã nguồn, trong khi "phát triển phần mềm hướng khía cạnh" dùng để chỉ đến toàn bộ một nguyên lý công nghệ.

AOP đòi hỏi chia nhỏ logic của chương trình thành các phần riêng biệt (gọi là mối quan tâm hay concern, là những khu vực liên kết các chức năng). Gần như các mẫu hình lập trình đều hỗ trợ các mức độ gom nhóm và đóng gói các mối quan tâm thành các thực thể riêng biệt và độc lập bằng cách cung cấp khả năng trừu tượng (ví dụ, các hàm, thủ tục, mô đun, lớp, phương thức) để có thể dùng cho hiện thực, trừu tượng và bố cục những mối quan tâm đó. Vài mối quan tâm "cắt xuyên qua" nhiều trừu tượng trong một chương trình, và gây khó khăn cho hiện thực - chúng được gọi là những mối quan tâm xuyên suốt (cross-cutting concern hay horizontal concern).

 Hiện thực 
Các ngôn ngữ lập trình sau có hiện thực AOP, trong ngôn ngữ đó, hay thông qua thư viện ngoài:
.NET Framework (C# / VB.NET)Numerous:
Afterthought, LOOM.NET, Enterprise Library 3.0 Policy Injection Application Block, AspectDNG, DynamicProxy, Compose* , PostSharp, Seasar.NET, DotSpect (.SPECT) , Spring.NET (as part of its functionality), Wicca and Phx.Morph, SetPoint 
PostSharp
Unity
ActionScript
AdaAda2012 Rationale
AutoHotkey
C / C++Several: AspectC++, FeatureC++, AspectC, AspeCt-oriented C , Aspicere 
COBOLCobble
Cocoa Objective-C frameworks
ColdFusion
Common Lisp
Delphi
Delphi Prism
e (IEEE 1647)
Emacs LispEmacs Advice Functions
Groovy
Haskellmonad (functional programming) () and Aspect-oriented programming with type classes. A Typed Monadic Embedding of Aspects
JavaNumerous others: CaesarJ , Compose* , Dynaop , JAC , Google Guice (as part of its functionality), Javassist , JAsCo (and AWED), JAML , JBoss AOP , LogicAJ , Object Teams, PROSE, The AspectBench Compiler for AspectJ (abc) , Spring framework (as part of its functionality), Seasar, The JMangler Project , InjectJ, GluonJ , Steamloom 
AspectJ
JavaScriptMany: Advisable , Ajaxpect, jQuery AOP Plugin , Aspectes , AspectJS, Cerny.js , Dojo Toolkit, Humax Web Framework, Joose, Prototype - Prototype Function#wrap, YUI 3 (Y.Do) 
LogtalkUsing built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of before and after event handlers).
Lua
make
Matlab
ML
Perl
PHPSeveral: PHP-AOP (AOP.io), Go! AOP framework, PHPaspect, Seasar.PHP, PHP-AOP , TYPO3 Flow , AOP PECL Extension
Prolog
PythonSeveral: PEAK, Aspyct AOP , Lightweight Python AOP , Logilab's aspect module , Pythius, Spring Python's AOP module , Pytilities' AOP module , aspectlib
Racket
Ruby
Squeak Smalltalk
UML 2.0WEAVR
XML

 Xem thêm 
 Phát triển phần mềm hướng khía cạnh
 Mẫu hình lập trình
 Decorator pattern

 Ghi chú và tham khảo

 Đọc thêm 
  The paper generally considered to be the authoritative reference for AOP.





 Aspect-oriented Software Development and PHP, Dmitry Sheiko, 2006


 "Adaptive Object-Oriented Programming Using Graph-Based Customization" – Lieberherr, Silva-Lepe, et al. - 1994

 Wijesuriya, Viraj Brian (2016-08-30) ''Aspect Oriented Development, Lecture Notes, University of Colombo School of Computing, Sri Lanka ''

 Liên kết ngoài 
 Eric Bodden's list of AOP tools in.net framework
 Programming Styles: Procedural, OOP, and AOP 
 Programming Forum: Procedural, OOP, and AOP 
 Aspect-Oriented Software Development, annual conference on AOP
 AOSD Wiki, Wiki on aspect-oriented software development
 AspectJ Programming Guide
 The AspectBench Compiler for AspectJ , another Java implementation
 Series of IBM developerWorks articles on AOP
 A detailed series of articles on basics of aspect-oriented programming and AspectJ 
 What is Aspect-Oriented Programming? , introduction with RemObjects Taco
 Constraint-Specification Aspect Weaver 
 Aspect- vs. Object-Oriented Programming: Which Technique, When? 
 Gregor Kiczales, Professor of Computer Science, explaining AOP, video 57 min.
 Aspect Oriented Programming in COBOL 
 Aspect-Oriented Programming in Java with Spring Framework 
 Wiki dedicated to AOP methods on.NET
Early Aspects for Business Process Modeling (An Aspect Oriented Language for BPMN)
 Spring AOP and AspectJ Introduction
 AOSD Graduate Course at Bilkent University
 Introduction to AOP - Software Engineering Radio Podcast Episode 106
 An Objective-C implementation of AOP by Szilveszter Molnar 
 Aspect-Oriented programming for iOS and OS X by Manuel Gebele
 Java Method Logging with AOP and Annotations by Yegor Bugayenko
 DevExpress MVVM Framework. Introduction to POCO ViewModels


Thể loại:Phát triển phần mềm hướng khía cạnh
Thể loại:Mẫu hình lập trình