دیزان پترن
Dependency Injection یکی از دیزان پترن های نرمافزاری است که به کاهش وابستگیها (Dependencies) در بین کلاسها کمک میکند. این الگو، از جمله اصول اصلی SOLID است که به عنوان یک راهنمای خوب برای طراحی کد قابلخواندن، قابلتغییر و قابلتست در نظر گرفته میشود.فرض کنید که شما یک کلاس برای ارسال ایمیل در برنامه خود دارید. این کلاس ممکن است نیاز به ارتباط با سرویسهای ارسال ایمیل مختلف داشته باشد، مانند ارسال ایمیل از طریق
SMTP یا از طریق API های خارجی. اما شما نمیخواهید که کلاس اصلی ایمیل وابستگی مستقیم به این سرویسها داشته باشد. بلکه میخواهید وابستگیها را به شکلی منعطف و از خارج کلاس تعریف کنید.مثال:
به جای اینکه کلاس ایمیل از خود به دلیل نیاز به سرویسهای ارسال ایمیل، این وابستگیها را بخود ایجاد کند، آنها به عنوان پارامترهایی از طریق کانستراکتور دریافت میکند.
class EmailSender {
private $mailer;
public function __construct(MailerInterface $mailer) {
$this->mailer = $mailer;
}
public function sendEmail($to, $subject, $body) {
// Send email using $this->mailer
// ...
}
}
ابتدا یک Interface برای سرویس ارسال ایمیل تعریف میکنیم که تمام کلاسهایی که میخواهیم از آنها استفاده کنیم، باید از این Interface ارثبری کنند.interface MailerInterface {
public function send($to, $subject, $body);
}
حالا میتوانیم کلاسهای مختلفی برای سرویسهای ارسال ایمیل ایجاد کنیم که از اینترفیس MailerInterface ارثبری میکنند.class SmtpMailer implements MailerInterface {
public function send($to, $subject, $body) {
// Send email via SMTP
}
}
class ExternalApiMailer implements MailerInterface {
public function send($to, $subject, $body) {
// Send email via external API
}
}
// etc. for other email delivery services
حالا میتوانیم در زمان ایجاد شئ ایمیل، یکی از سرویسهای ارسال ایمیل را به عنوان وابستگی تزریق کنیم.// Use SmtpMailerدر این مثال، با استفاده از دیزاین پترن
$smtpMailer = new SmtpMailer();
$emailSender = new EmailSender($smtpMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');
// Use ExternalApiMailer
$externalApiMailer = new ExternalApiMailer();
$emailSender = new EmailSender($externalApiMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');
Dependency Injection، کلاس ایمیل از خود وابستگی به سرویسهای ارسال ایمیل را حذف کرده است و به جای آن از پارامترهای تزریق شده از طریق کانستراکتور برای ارتباط با سرویسها استفاده میکند. این کار باعث میشود که کلاس ایمیل قابلتغییر و باز است و ما میتوانیم به راحتی سرویسهای دیگر را برای ارسال ایمیل به برنامه اضافه کنیم بدون نیاز به تغییر در کلاس ایمیل خود. همچنین، این الگو به ما کمک میکند که کلاسهایمان را قابلتست کنیم.ادامه در پست بعدی ...
.