
آموزش برنامه نویسی جنبه گرا AOP در سی شارپ
آموزش برنامه نویسی جنبه گرا AOP در سی شارپ یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی آموزش برنامه نویسی جنبه گرا در سی شارپ است که با نام اصلی Aspect Oriented Programming in .NET از شرکت Pluralsight منتشر شده است.
جنبه (Aspect) چیست؟
در فضای برنامه نویسی شی گرا اغلب از رابطه ی وراثت برای تعریف ارتباط بین کلاس ها و اشیا استفاده می کنیم. برای مثال، اگر کلاس Dog را که حاوی تعدادی Member می باشد را تعریف کنیم، می توانیم پس از آن کلاس Poodle را بسازیم. کلاس Poodle از کلاس Dog ارث بری می کند و در واقع یک Poodle یک Dog است. در ادامه، فرض کنید که قصد داریم خاصیت Obedient (فرمانبرداری) را به کلاس Dog اضافه کنیم. بدون شک همه ی اشایی که از کلاس Dog (سگ) ساخته می شوند لزوماً نمی توانند فرمانبردار باشد. در این صورت، پس منطقی نیست که پروپرتی Obedient را درون کلاس Dog تعریف کنیم. به علاوه، منطقی نیست که کلاسی را تحت عنوان ObedientDog ایجاد کنیم. اگر چنین کاری انجام شود، آیا کلاس Poodle از کلاس Dog ارث بری کند یا از کلاس ObedientDog؟ در واقع یک Poodle ممکن است فرمانبردار باشد یا نباشد. پس راه حل چیست؟
راه حل این مشکل تعریف فرمانبردار بودن سگ ها (Obedient) به عنوان یک Aspect یا همان جنبه است که بر روی هر Object ی که قرار است فرمانبردار باشد اضافه می شود.
برنامه نویسی جنبه گرا (Aspect-Oriented Programming) چیست؟
در فضای برنامه نویسی، برنامه نویسی جنبه گرا (Aspect-Oriented Programming) به ما این امکان را می دهد که بدون استفاده از وراثت جنبه هایی را به اشیا یا کلاس ها اضافه کنیم. این جنبه ها را می توان در زمان کامپایل برنامه (Compile Time) یا زمان اجرای برنامه (Runtime)، به برنامه اضافه نمود.
برنامه نویسی جنبه گرا AOP چیست و چه مشکلی را حل میکند؟
برنامهنویسی جنبهگرا یا Aspect-Oriented Programming رویکردی برای مدیریت رفتارهایی است که در بخشهای مختلف یک برنامه تکرار میشوند. در برنامههای مبتنی بر C# ممکن است قابلیتهایی مانند Logging، بررسی مجوز دسترسی، مدیریت تراکنش و اندازهگیری زمان اجرا در کلاسها و متدهای متعددی موردنیاز باشند. اگر این منطقها در تمام بخشها بهصورت مستقیم نوشته شوند، تغییر و نگهداری آنها دشوارتر میشود. AOP تلاش میکند چنین مسئولیتهای مشترکی را از منطق اصلی برنامه جدا کند.
این رویکرد در کنار برنامهنویسی شیگرا به کار میرود و هدف آن جایگزین کردن کلاسها یا اصول طراحی شیگرا نیست. در عوض، AOP کمک میکند رفتارهایی که به چندین بخش برنامه مربوط میشوند، ساختار منسجمتری داشته باشند. برای مثال، میتوان ثبت اطلاعات مربوط به اجرای متدها را از منطق کسبوکار جدا کرد تا تغییر شیوه Logging نیازمند ویرایش تعداد زیادی از کلاسها نباشد. استفاده مناسب از این روش به کاهش تکرار کد و بهبود قابلیت نگهداری نرمافزار کمک میکند.
تفاوت Interception و IL Code Weaving در AOP
Interception یکی از روشهای پیادهسازی رفتارهای جنبهگراست که در آن فراخوانی یک متد از طریق یک لایه واسط مدیریت میشود. این لایه میتواند پیش از اجرای متد، پس از آن یا هنگام بروز خطا عملیات مشخصی انجام دهد. برای مثال، یک واسط میتواند زمان اجرای متد را اندازهگیری کند یا اطلاعات مربوط به فراخوانی آن را ثبت کند. این روش معمولاً به سازوکاری برای رهگیری فراخوانیها نیاز دارد و محدودیتهای آن به ابزار و معماری مورد استفاده بستگی دارد.

در مقابل، IL Code Weaving به تغییر یا ترکیب کد میانی دات نت مربوط میشود تا رفتارهای موردنظر در نقاط مشخصی از برنامه قرار بگیرند. در این رویکرد، برخلاف Interception مبتنی بر یک واسط در زمان فراخوانی، ممکن است تغییرات در مرحله ساخت یا پردازش اسمبلی انجام شوند. انتخاب میان این روشها به نیازهای پروژه، ابزارهای در دسترس و میزان کنترل موردنیاز بر اجرای برنامه بستگی دارد. شناخت تفاوت آنها به توسعهدهندگان کمک میکند راهکار مناسبتری برای جداسازی رفتارهای مشترک انتخاب کنند.
ارتباط AOP با Decorator در سی شارپ
الگوی Decorator در برنامهنویسی شیگرا روشی برای افزودن رفتار به یک شیء بدون نیاز به تغییر مستقیم کلاس اصلی آن است. در این الگو، یک شیء دیگر همان قرارداد را پیادهسازی میکند و درخواستها را در صورت نیاز با اجرای منطق اضافی به شیء اصلی منتقل میکند. برای مثال، میتوان یک Decorator برای یک سرویس ایجاد کرد که پیش از فراخوانی عملیات اصلی، اطلاعاتی را ثبت کند و سپس نتیجه را به فراخواننده برگرداند. این روش بهویژه زمانی کاربرد دارد که بخواهید رفتارهای اضافی را به شکل قابلکنترل ترکیب کنید.

AOP مفهومی گستردهتر است که میتواند با روشهایی مانند Interception و IL Code Weaving پیادهسازی شود. Decorator یکی از راهکارهای قابلاستفاده برای جداسازی رفتارهای جانبی است، اما تمام امکانات یا روشهای AOP را پوشش نمیدهد. تفاوت این دو رویکرد در نحوه تعریف، اتصال و اعمال رفتارهای اضافی مشخص میشود. درک ارتباط میان آنها به شما کمک میکند برای نیازهای ساده از الگوهای شیگرا استفاده کنید و در موارد پیچیدهتر، امکان بهرهگیری از سازوکارهای تخصصیتر برنامهنویسی جنبهگرا را ارزیابی کنید.
کاربردهای AOP در معماری برنامههای دات نت
در پروژههای بزرگ دات نت، رفتارهایی وجود دارند که در بخشهای مختلف برنامه تکرار میشوند و مستقیماً به منطق اصلی کسبوکار مربوط نیستند. Logging، اندازهگیری عملکرد، بررسی برخی شرایط دسترسی و مدیریت رفتارهای مشترک نمونههایی از این موارد هستند. با استفاده از AOP میتوان نحوه اجرای این رفتارها را از منطق اصلی متدها جدا کرد و در نتیجه، تمرکز کلاسها را بر مسئولیت اصلی آنها حفظ کرد. این جداسازی در پروژههایی با تعداد زیادی کلاس و عملیات میتواند اهمیت بیشتری پیدا کند.
با این حال، استفاده از AOP باید با توجه به پیچیدگی برنامه انجام شود. اگر رفتارهای اضافی به شکل غیرشفاف به متدها اضافه شوند، دنبال کردن جریان اجرای برنامه و عیبیابی آن ممکن است دشوارتر شود. بنابراین، انتخاب روش پیادهسازی، مستندسازی رفتارها و در نظر گرفتن تأثیر آنها بر آزمایش کد اهمیت دارد. این آموزش پیشرفته برای توسعهدهندگانی مفید است که میخواهند روشهای مختلف جداسازی مسئولیتهای مشترک را بشناسند و با استفاده از Interception و IL Code Weaving، دید عمیقتری نسبت به AOP در دات نت به دست آورند.
سرفصل مطالب آموزش برنامه نویسی جنبه گرا در سی شارپ
فصل اول: مقدمه ای بر برنامه نویسی جنبه گرا- تعریف برنامه نویسی جنبه گرا
- تعریف Hook Point ها
- اتصال جنبه ها به کد
- تعریف Interception
- فرآیند Interception
- ساخت Interceptor ها
- اتصال Interceptor به کد
- معرفی تکنیک IL Code Weaving
- فرآیند IL Code Weaving
- ساخت جنبه ها
- اتصال جنبه ها به کد
- کد نویسی فرای Decorator ها
- اضافه کردن Attribute ها به صورت خودکار در WCF
- تعریف کردن جنبه های اعتبار سنجی
- تعریف کردن جنبه های تولید کد
- فریم ورک های غیر جنبه گرا







