چرا از AOP  استفاده می کنیم؟

من ارسلان میربزرگی، در این مقاله قصد دارم تا شما را با مفهوم دیگری به نام برنامه نویسی جنبه گرا یا AOP  آشنا کنم و از مزایا و ملزومات این نوع از برنامه نویسی برای شما صحبت کنم. در مقالات قبلی در مورد برنامه نویسی شی گرا یا OOP مطالبی را ارائه کردیم.  گفتیم که برنامه نویسی شی گرا، به منظور مدلسازی درخواست‌های معمولی بر روی سیستم بسیار کارآمد است اما در صورتی که بخواهیم در قسمت خاصی از برنامه، درخواست بخصوصی را اجرا کنیم، نیازمند نوع دیگری از برنامه نویسی هستیم که به خوبی بتواند Concern های هر برنامه را نیز تحت پوشش قرار دهد. AOP، نوع برنامه نویسی خاصی است که دقیقا همین کار را برای ما انجام می‌دهد.
برنامه نویسی شی گرا
 Aspect ( ساده سازی عبارت Aspect Oriented Programming به معنای برنامه نویسی جنبه گرا یا AOP ) در واقع یک متدولوژی مربوط به توسعه است. با AOP می‌توان فعالیت‌هایی را بر روی متدها یا سازنده‌های خاصی انجام داد. اگر شما از AOP  استفاده کنید، کدنویسی نهایی بسیار تمیز خواهد بود. در این کدنویسی، هر بخش به طور دقیق، مسئولیت خودش را انجام می‌دهد و دیگر کدهای اضافی وجود ندارند و Separation of Concern محقق میشود.
برای درک بهتر عملکرد AOP،  مثالی را با یکدیگر مرور خواهیم کرد. فرض کنید برنامه بزرگی را در دست دارید و می‌خواهید در یک متد، یک فعالیت 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 لازم است تعاریف و مفاهیم خاصی را نیز یاد بگیرید که در ادامه آنها را بیان کرده‌ایم.
  1.  Cross-cutting : این ویژگی، بع معرفی بخش‌هایی از کد که در برنامه موجود است می‌پردازد
  2. Advice : به معنای کدهایی است که باید inject شوند.
  3. Joinpoint : مکانی است که می‌توان در آن، یک یا چند Aspect را اعمال کرد.
  4. Pointcut : شامل مجموعه‌ای از Joinpoint ها که برمبنای مجموعه ای از شاخص‌ها انتخاب شده‌اند.
  5. Aspect : مکانی است که advice ها و point-cut ها در آن، با همدیگر ترکیب می‌شود.
  6. weaving : به معنای ادغام کلاس ها و aspect ها است.
Joinpoint  در برنامه نویسی AOP  انواع مختلفی دارند که شامل موارد زیر است:
  1.  Call : مربوط به زمانی است که یک متد فراخوانی می‌شود.
  2. Execution : مربوط به زمانی است که یک متد در حال اجرا است.
  3. Handler : مربوط به زمانی است که یک catch block در حال اجرا است.
  4.   get:  مربوط به زمانی است که یک فیلد خوانده می‌شود.
  5. set : مربوط به زمانی است که بر روی یک فیلد یک مقدار نوشته می‌شود.
  6. staticinitialization : مربوط به زمانی است که یک بلوک استاتیک در درون یک کلاس اجرا می‌شود.
  7. initialization : مربوط به زمانی است که یک constructor یا سازنده اجرا می‌شود.
  8. Preinitialization : مربوط به زمانی است که یک constructor  به ارث رسیده اجرا می‌شود.
  9. 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()
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)

و در آخر

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

ارسال دیدگاه

11 + 8 =

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

پیام با موفقیت ثبت شد.
خطایی رخ داده است.