برنامه نویسی آسپکت گرا

https://www.youtube.com/watch?v=4RRQd-1nkeU&t=42s


در دنیای برنامه نویسی تکتیک های زیادی هست یکی از این هم همین بحث Cross-cutting concern می باشد.

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

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

نگرانی های اصلی نمایانگر عملکرد واحد و خاص برای نیازهای اولیه هست، مانند لاجیک بیزینس.

احتیاج های مشترک در سیستم بانکی
احتیاج های مشترک در سیستم بانکی

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


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


فکر میکنم یکی از بهترین مثال ها برای Cross-cutting concern کارهایی هس که عملکرد تراکنشی انجام میدهند، ما برای تمام متدها و یا سرویس ها نیاز داریم try-catch بنویسیم تا کامیت و یا رولبک انجام دهد، با استفاده از یک انوتیشن برای متد مورد نظر با کمک مفهموم برنامه نویسی آسپکت گرا, هم یک معماری کلین هم کپسوله سازی را انجام دهیم. یعنی فقط با یک انوتیشن ساده اون فانکشن رفتار ترنزاکشنال رو انجام خواهد داد و این یک دست آورد خیلی بزرگی هست...

به فانکشن و انوایشن زیر دقت کنید

به 6 خط اول که از انوتیشن استفاده شده دقت کنید.
به 6 خط اول که از انوتیشن استفاده شده دقت کنید.


به سه خط اول که از انوتیشن استفاده شده دقت کنید.
به سه خط اول که از انوتیشن استفاده شده دقت کنید.


در این متد یک پانل رو باید اضافه بکنه به دیتابیس اولا باید این کارو لاگ بکنه تا پس فردا مشکلی پیش اومد بتونیم پیگیری کنیم دوما بحث امنیتش هس که هر کاربری امکان اضافه کردن ندارد به غیر از ادمین و سوما باید دیتای داخل پنل درست باشد. و یا در فانکشن قبلی اگر دقت کنید کش 60 ثانیه و یا آسپکت ترزاکشن و... همانطور که مشاهده میکنید این نگرانی ها بین دیگر نگرانی های اصلی سیستم مشترک هس. اگر بخواهیم داخل متد اینارو بنوسیسم چه بلبشوری میشه و بدتر اینکه دیگر قسمت های سیستم هم همین نگرانی رو دارند و باید برای تک تکشون این کارهارو انجام بدیم که از دید معماری تمیز و کد نویسی تمیز کار درستی نیست پس باید وارد مفهوم آسپکت گرا بشیم. به دلیل اینکه پیاده سازی این موضوع در قالب مقاله سخت هست نوشتنش طی هفته های آینده یه فیلم اموزشی سری در این مقاله اضافه خواهم کرد.