چرا از AOP ( Aspect Oriented Programming ) استفاده می کنیم؟
من ارسلان میربزرگی، در این مقاله قصد دارم تا شما را با مفهوم دیگری به نام برنامه نویسی جنبه گرا یا AOP ( Aspect Oriented Programming ) آشنا کنم و از مزایا و ملزومات این نوع از برنامه نویسی برای شما صحبت کنم. در مقالات قبلی در مورد برنامه نویسی شی گرا یا OOP مطالبی را ارائه کردیم. گفتیم که برنامه نویسی شی گرا، به منظور مدلسازی درخواستهای معمولی بر روی سیستم بسیار کارآمد است اما در صورتی که بخواهیم در قسمت خاصی از برنامه، درخواست بخصوصی را اجرا کنیم، نیازمند نوع دیگری از برنامه نویسی هستیم که به خوبی بتواند Concern های هر برنامه را نیز تحت پوشش قرار دهد. AOP (Aspect Oriented Programming) ، نوع برنامه نویسی خاصی است که دقیقا همین کار را برای ما انجام میدهد.

Aspect ( ساده سازی عبارت Aspect Oriented Programming به معنای برنامه نویسی جنبه گرا یا AOP ) در واقع یک متدولوژی مربوط به توسعه است. با AOP میتوان فعالیتهایی را بر روی متدها یا سازندههای خاصی انجام داد. اگر شما از AOP استفاده کنید، کدنویسی نهایی بسیار تمیز خواهد بود. در این کدنویسی، هر بخش به طور دقیق، مسئولیت خودش را انجام میدهد و دیگر کدهای اضافی وجود ندارند و Separation of Concern محقق میشود.
برای درک بهتر عملکرد AOP (Aspect Oriented Programming)، مثالی را با یکدیگر مرور خواهیم کرد. فرض کنید برنامه بزرگی را در دست دارید و میخواهید در یک متد، یک فعالیت business انجام دهید. در این حالت، شما باید در قدم اول مقادیر ورودی این متد را از لحاظ امنیتی بررسی کنید و از عدم آسیب رسانی آنها به سیستم خود مطمئن شوید. همچنین قصد دارید این فرایند به صورت دقیقی لاگ شود. در این حالت لازم است که شما، به غیر از کد اصلی، کدهای مورد نیاز دیگری (Cross Cutting Concerns) را نیز بنویسید که کد اصلی، فعالیت business را انجام خواهد داد و سایر کدها (Cross Cutting Concerns) در بین کدهای اصلی گم خواهند شد و خوانایی مربوط به این کدها، افت خواهد کرد. در این وضعیت تنها راه چاره، استفاده از AOP است. با استفاده از AOP، تنها نیاز به نوشتن کدهای اصلی خواهید داشت و AOP لاگ های مورد نیاز و بررسی امنیتی متدهای شما را انجام خواهد داد.

Cross Cutting Concern :
- Logging/Tracing
- Transactions
- Security
- Dependency Injection
- Architectural rule enforcement
- Profiling
- Exception Handling
- Caching
- Mocking testing scenarios
در بالا، در مورد مزایای استفاده از AOP گفتیم. اما در صورتی که بخواهیم از این شیوه برنامه نویسی استفاده کنیم، با مشکلات متعددی مواجه خواهیم شد که در زیر به آنها اشاره کردهایم.
- Less Code Reuse
- Poor Traceability
- More difficult evolution
- Poor code quality
- Lower Productivity
به منظور استفاده از AOP و توسعه برنامه، ابتدا باید برنامه را به 2 بخش Business و Cross Cutting Concern تقسیم کنیم و وظیفه هر بخش کاملا مشخص باشد. در مرحله بعدی میبایست Concern ها را در کلاسهای مجزا و Aspect های جداگانه، پیاده سازی کنیم. در مرحله آخر نیز Cross Cutting ها و Business را با استفاده از AOP Compiler با یکدیگر ادغام خواهیم کرد. به این فرایند در اصطلاح Weaving و به کامپایلری که این فرایند را انجام می دهد، Weaver گفته میشود.

برنامه نویسی AOP
در برنامه نویسی AOP، تمامی Crosscutting Concern ها به شکلی مجزا و به عنوان Aspect ها، اجرا میشوند. در واقع این Aspect ها، پایه اصلی AOP هستند و مشابه همان کلاسهای اجرایی در برنامه نویسی شی گرا عمل میکنند. این Aspect ها در قسمتهای خاصی از برنامه کار میکنند. عملکرد آنها نیز در صورت فراخوانی متدهای خاصی یا اجرای بخشهای مشخص شدهای از برنامه، فعال خواهد شد. به منظور یادگیری AOP لازم است تعاریف و مفاهیم خاصی را نیز یاد بگیرید که در ادامه آنها را بیان کردهایم.
- Cross-cutting : این ویژگی، بع معرفی بخشهایی از کد که در برنامه موجود است میپردازد
- Advice : به معنای کدهایی است که باید inject شوند.
- Joinpoint : مکانی است که میتوان در آن، یک یا چند Aspect را اعمال کرد.
- Pointcut : شامل مجموعهای از Joinpoint ها که برمبنای مجموعه ای از شاخصها انتخاب شدهاند.
- Aspect : مکانی است که advice ها و point-cut ها در آن، با همدیگر ترکیب میشود.
- weaving : به معنای ادغام کلاس ها و aspect ها است.
Joinpoint در برنامه نویسی AOP:
- Call : مربوط به زمانی است که یک متد فراخوانی میشود.
- Execution : مربوط به زمانی است که یک متد در حال اجرا است.
- Handler : مربوط به زمانی است که یک catch block در حال اجرا است.
- get: مربوط به زمانی است که یک فیلد خوانده میشود.
- set : مربوط به زمانی است که بر روی یک فیلد یک مقدار نوشته میشود.
- staticinitialization : مربوط به زمانی است که یک بلوک استاتیک در درون یک کلاس اجرا میشود.
- initialization : مربوط به زمانی است که یک constructor یا سازنده اجرا میشود.
- Preinitialization : مربوط به زمانی است که یک constructor به ارث رسیده اجرا میشود.
- adviceexecution : مربوط به زمانی است که یک بلوک advice اجرا میشود.
چگونگی تعریف یک Advice در برنامه
در ابتدا باید اطلاعات کلی را در مورد Advice ها داشته باشید که در زیر آنها را به طور مختصر شرح دادهایم.
- Advice ها شباهتی به تعریف متدها دارند.
- pointcut ها صرفا مکانی را که در آن، لازم است عملکرد یک aspect تغییر کند را معین میکند و در این صورت لازم است تا برای آزادی عمل بیشتر pointcut ها، آنها با یک Advice ارتباط داشته باشند.
- یک Advice قابلیت اجرا در قبل و بعد از join point را دارد.
- یک Advice میتواند در پیرامون یک join point نیز اجرا شود. این نوع از Advice ها بر اجرای join point تاثیرگذار هستند و میتوانند آن را اجرا کرده و یا در هنگام فراخوانی متدها، پارامترها را عوض کنند.
Advice در برنامه نویسی AOP انواع مختلفی دارند که شامل موارد زیر است:
- Before ()
- after() returning
- after() throwing
- after()
- around()
روشهای استفاده از Aspectها :
3 روش برای استفاده از Aspect ها وجود دارد. یکی از طریق کد جاوا ( Java code) و دیگری از طریق انوتیشنها ( annotation ) و یا از طریق XML است.
Weaving در AspectJ دارای مدلهای مختلفی(AspectJ Weaving Model) است که در زیر به آنها اشاره کردهایم:
- Source Code Weaving
- Binary Weaving
- Load Time Weaving
فریم ورکها و تکنولوژیهایی نیز وجود دارند که به صورت گسترده از AOP استفاده میکنند. این موارد عبارتند از :
- AspectJ
- Spring
- JBoss AOP
- AspectWerkz (merged with AspectJ now)
- Java Aspect Components (JAC)
و در آخر
.وبسایت میربزرگی قصد دارد تا با ارائه مقالهها و تجربههای کاربردی شما را در زمینه یادگیری و رفع اشکالاتتان کمک کند. در صورت وجود هرگونه سوالی به من ایمیل بزنید.