در علم کامپیوتر ، **توسعه نرم‌افزار جنبه گرا** (AOSD) یک فرایند توسعه نرم‌افزار است که به دنبال پیمانه‌ای سازی جدید سامانه نرم‌افزار است تا توابع ثانویه یا توابع پشتیبان را از منطق تجاری در برنامه اصلی جدا کند. AOSD اجازه می دهد تا مسئله‌های مختلف به طور جداگانه بیان شده و به طور خودکار در سیستم های کاری یکپارچه و مرتبط شوند.

روش‌های توسعه نرم‌افزار سنتی، بر تجزیه سیستم‌ها به واحدهای عملکردی اولیه تمرکز می‌کند؛ در حالی که تشخیص می‌دهد سایر موارد نگران کننده‌ای نیز وجود دارد که به خوبی در تجزیه اولیه لحاظ نشده است. فرایند توسعه سنتی این امر را به برنامه نویسان می سپارد که ماژول‌های مربوط به عملکرد اولیه و اصلی را کدنویسی کنند و مطمئن شوند که سایر موارد نگران کننده در هر کجا که لازم است، حتماً در کد برطرف می شوند. برنامه نویسان باید تمام کارهایی که باید انجام شود ، نحوه برخورد با هر مسئله ، مشکلات مرتبط با تعاملات احتمالی و انجام رفتار درست در زمان مناسب را به خاطر بسپارند. این نگرانی ها شامل چندین واحد عملکردی اولیه در داخل برنامه هستند و اغلب منجر به بروز مشکلات جدی در طول توسعه و نگهداری برنامه می شوند. توزیع کد برای فهم یک نگرانی، به ویژه با روند تکامل شرایط محصول، به شدت مورد نیاز است. یک نگهدارنده سیستم (System maintainer) باید مجموعه‌ای از شرایط مختلف را پیدا کند و به درستی به روز کند.

توسعه نرم‌افزار جنبه گرا تمرکز اصلی خود را بر شناسایی ، ذکر خصوصیات و ویژگی‌ها و نمایش نگرانی های مقطعی و مدولاسیون آنها به واحدهای اولیه‌ی جداگانه و هم‌چنین ترکیب خودکار آن‌ها در یک سیستم کاری می‌گذارد.

بهترین تعریف شناخته شده از ماهیت AOSD مربوط به Filman و Friedman است که AOSD را با استفاده از معادله ی زیر مشخص می کند :

جنبه‌گرایی = کمی سازی + فراموشی 

تمرکز توسعه نرم‌افزار جنبه‌گرا در بررسی و اجرای ساختارهای جدید بر مدولار بودن نرم‌افزار است که پشتیبانی از انتزاع های صریح را برای مدولاسیون ایجاد می کند. رویکردهای برنامه نویسی جنبه محور ، انتزاعات صریحی را برای اجرای مدولار نگرانی در زمینه طراحی ، کد ، اسناد یا سایر مصنوعات ایجاد شده در طول چرخه عمر نرم‌افزار فراهم می کند. این نگرانی های مدولار،"جنبه ها" نامیده می شوند و رویکردهای جنبه محور روش‌هایی را برای ترکیب آن‌ها ارائه می دهند. برخی از رویکردها نشان دهنده یک نگرانی ریشه‌ای به عنوان پایه هستند. رویکردهای مختلف انعطاف پذیری متفاوتی را با توجه به ترکیب جنبه‌ها فراهم می کنند.

بررسی اجمالی
------------

### ماهیت جنبه گرایی

#### کمی سازی و فراموشی

> 
> * AOP را می توان تمایل به اظهارنظرهای کمی در مورد رفتار برنامه ها ، و نگه داشتن این کمیت ها درباره برنامه های نوشته شده توسط برنامه نویسان فراموشی دانست.
> * AOP میل به اظهارات در یک فرم است: در برنامه P ، هر زمان که شرط C بوجود آمد ، عمل A را نسبت به یک برنامه متداول رمزگذاری شده P انجام دهید.
> 
> 
> 

**فراموشی (Obliviousness )**  به این معنی است که یک برنامه هیچ دانش و اطلاعی از اینکه کدام یک از جنبه ها آن را تغییر می دهد یا کجاست، ندارد. در حالی که کمی سازی به توانایی جنبه های مختلف برای تأثیرگذاری بر چندین نقطه در برنامه اشاره دارد.

مفهوم **عدم تهاجم ( non-invasiveness )** اغلب به اصطلاح فراموشی ترجیح داده می شود. غیرتهاجمی بیانگر این است که جنبه ها می توانند بدون نیاز به تغییر در برنامه ، رفتار را به برنامه اضافه کنند ، با این حال فرض نمی‌شود که برنامه ها از جوانب آگاهی ندارند.

تعریف فیلمن از جنبه‌گرایی، اغلب بیش از حد محدود کننده تلقی می شود. بسیاری از رویکردهای جنبه گرا با استفاده از حاشیه‌نویسی به صراحت مکان هایی را در سیستم معرفی می کنند که جنبه ها رفتار را معرفی می کنند. این رویکردها نیاز به بازرسی دستی و اصلاح ماژول‌های دیگر در سیستم دارند و بنابراین تهاجمی هستند. علاوه بر این ، جنبه‌گرایی لزوماً به کمی سازی احتیاج ندارد. از جنبه‌ها می توان برای جداسازی ویژگی‌هایی استفاده کرد که پیاده سازی آن‌ها در غیر این صورت با سایر ویژگی ها گره می خورد. چنین جنبه هایی لزوماً از کمیت در چندین مکان در سیستم استفاده نمی‌کنند.

### مفاهیم و اصطلاحات

رویکردهای جنبه گرا، پشتیبانی صریحی را برای محلی سازی دغدغه‌ها در ماژول های جداگانه فراهم میکنند که جنبه نامیده میشوند ( aspect ). جنبه، ماژولی است که یک نگرانی یا مسئله را دربرمی گیرد. بیشتر زبانهای جنبه گرا از معرفی غیرتهاجمی رفتار به یک پایگاه کد و تعیین کمیت در نقاطی از برنامه که این رفتار باید معرفی شود ، پشتیبانی می کنند. به این نقاط، "نقاط اتصال" می‌گویند.

#### مدل نقطه اتصال

ننقاط اتصال،  نقاطی در اجرای سیستم هستند. مانند فراخوانی تابع ، جایی که رفتار ارائه شده توسط جنبه‌ها ترکیب می شود. نقطه ی اتصال به نقطه ای در اجرای برنامه گفته می شود که برای تعریف ساختار پویای نگرانی مقطعی استفاده می شود.

مدل نقطه اتصال یک زبان جنبه‌گرا ، انواع نقاط پیوستگی را که توسط زبان جنبه‌گرا و نقاط تعامل احتمالی بین جنبه‌ها و ماژول‌های پایه پشتیبانی می شوند ، تعریف می کند.

#### نشانگر

کمی سازی بیش از نقاط پیوستن در سطح زبان بیان می شود. این کمیت ممکن است در ساختار زبان ضمنی باشد یا با استفاده از ساختاری شبیه پرس و جو به نام نشانگر ( pointcut )  بیان شود. نشانگرها به عنوان یک محمول بر روی درخت نحوی برنامه تعریف می شوند و رابطی را تعریف می کنند که محدود کننده قرار گرفتن در معرض عناصر برنامه پایه توسط نشانگر باشد. یک نشانگر، نقاط اتصال و مقادیر مشخصی را در آن نقاط انتخاب می کند. فرمول نحوی یک نشانگر از یک رویکرد به رویکرد دیگر متفاوت است .

می توان نشانگرها را در دو دسته طبقه بندی کرد: نشانگرهای مهربان و نشانگرهای نا مهربان 

#### بدنه های مشاوره ای

بدنه مشاوره کدی است که با رسیدن به نقطه ی اتصال اجرا می شود. مشاوره جزئیات عملکردی یک نگرانی را مدولار می کند. ترتیب کنترل بدنه‌های مشاوره با جنبه های مختلف (و توسط پایگاه) ممکن است به طرق مختلف کنترل شود ، از جمله:

* با رسیدن به نقطه اتصال ، قبل از اینکه اجرا با پایه ادامه یابد.
* بعد از معناشناسی پایه برای نقطه اتصال. هنگامی که نقطه اتصال با اجرای یک روش مطابقت دارد ، یک توصیه یا مشاوره پس از بازگشت می تواند پس از بازگشت روش یا پس از ایجاد یک استثنا اجرا شود.
* با رسیدن به نقطه اتصال ، با کنترل صحیح بر اینکه آیا معناشناسی پایه اجرا می شود یا خیر. مشاوره می تواند جریان کنترل برنامه را اصلاح کند.

منابع
-----

1. 1 2  Filman, R. and D. Friedman. "Aspect-oriented programming is quantification and Obliviousness." Proceedings of the Workshop on Advanced Separation of Concerns, in conjunction with OOPSLA’00 (2000)