Hossein Yusuf-zadeh
Hossein Yusuf-zadeh
خواندن ۲ دقیقه·۶ سال پیش

AOP in PHP - Section one

سلام.من برنامه نویس متوسط رو به پایینی هستم و الان گیر یک سری مفاهیم پیچیده البته برای خودم افتادم. گفتم این جا بنویسم که خودم بهتر بفهمشون. برنامه نویسی جنبه گرا یکی از اون مفاهیم هست. ببینین ما دو تا روند داریم یکی برنامه نویسی شی گرا یکی برنامه نویسی جنبه گرا.

در برنامه نویسی جنبه گرا یا همون aspect oriented programming ما برنامه هامون رو بر اساس دغدغه های مشترک سیستم می نویسیم. ببینید ما یک سری دغدغه داریم مثل لاگ گیری از سیستم - امنیت و گرفتن خطاهای سیستم - احراز هویت - کش - بهینه سازی - اعمال دیتابیسی و ... . هر کدوم از این دغدغه ها گاهی با هم تداخل هم دارن که بهشون میگیم Cross-cutting Concerns. این دغدغه ها وقتی میخوان توی کلاس های ما پیاده بشن منجر به یک تولید یه سری کد کثیف میشن! چطوری؟ مثلا باید قبل و بعد بعضی کلاسا صداشون زد و باز داخل همون کلاس باید یک موجودیت از کلاس دیگری از همین دغدغه ها ایجاد کرد که بخش دیگری رو کنترل کنه. یعنی یک کد کثیف و با وابستگی های زیاد.

حالا تو همین برنامه های شی گرای عجیب و غریب ما میبینیم یک سری نقاط اتصال یا join point هست. یعنی چی؟ یعنی قبل یا بعد یا در قبل و بعد یک متد ما باید یک متد از یک کلاس دیگه رو صدا بزنیم! این جوری کدامون کثیف نمیشه. حالا میایم یک سری برش نقطه ای یا همون point cuts می نویسیم.

یک سری کد هستن که این قابلیت رو به ما میدن که برنامه نویسی جنبه گرا رو ساده بتونیم پیاده کنیم. البته فریمورک هایی هم هستن مثل li3 که این قضیه رو داخلی پیاده کردن.

AOP-PHP- Flow AOP- Go! AOP- JMSAopBundle

فرض بگیرید ما یک همچین کدی داریم:

class SecretService { public function getSecret($id) { return $this->storage->getById($id); } }

مثلا توی AOP-PHP داریم:

function logAfterGetSecret() { $this->logger->info('Secret accessed!'); } aop_add_after( 'SecretService->getSecret()', 'logAfterGetSecret' );

یا توی GO! AOP داریم:

class LoggingAspect implements Aspect { /** * @After("execution(public SecretService->getSecret(*))") */ public function logAfterGetSecret(MethodInvocation $invocation) { $args = $invocation->getArguments(); $this->logger->info('Secret ' . $args[0] . ' accessed!'); } }

البته یادتونه گفتم قبل و بعدش همزمان میتونید صدا بزنید. اینم مثالش:

class CachingAspect implements Aspect { /** * @Around("execution(public SecretService->getSecret(*))") */ public function cacheGetSecret(MethodInvocation $invocation) { $args = $invocation->getArguments(); if ($this->cache->has($args[0])) { return $this->cache->get($args[0]); } $secret = $invocation->proceed(); $this->cache->set($args[0], $secret); return $secret; } }
برنامه نویسیaopphp
شاید از این پست‌ها خوشتان بیاید