🧬 درس اول: اصول SOLID در PHP؛ پایههای مهندسی نرمافزار مدرن
🎯 هدف این درس: آشنایی با ۵ اصل بنیادین SOLID برای نوشتن کدهای تمیز، قابل نگهداری و مقیاسپذیر. یادگیری اینکه چگونه از کدهای اسپاگتی و وابستگیهای پیچیده جلوگیری کنیم.
مهمان عزیز! 👋
به دوره پیشرفته خوش آمدی. تا اینجا یاد گرفتی «چگونه» کد بنویسی که کار کند. اما در سطح پیشرفته، سوال مهمتر این است: «چگونه» کد بنویسی که تمیز، قابل فهم و قابل تغییر باشد؟
اصول SOLID مخفف ۵ قانون طراحی شیگرا هستند که توسط رابرت مارتین (Uncle Bob) معرفی شدند. رعایت این اصول باعث میشود کدهای تو در برابر تغییرات مقاوم باشند و باگهای کمتری داشته باشند.
💡 SOLID مخفف چیست؟
- S: Single Responsibility Principle (اصل مسئولیت یگانه)
- O: Open/Closed Principle (اصل باز/بسته)
- L: Liskov Substitution Principle (اصل جایگزینی لیسکوف)
- I: Interface Segregation Principle (اصل جداسازی رابطها)
- D: Dependency Inversion Principle (اصل وارونگی وابستگی)
S: اصل مسئولیت یگانه (SRP)
یک کلاس باید فقط یک دلیل برای تغییر داشته باشد. یعنی هر کلاس باید فقط یک وظیفه مشخص را انجام دهد.
BadCode.php
PHP
8.x
class UserManager {
public function createUser($data) {
// ۱. اعتبارسنجی دادهها
// ۲. ذخیره در دیتابیس
// ۳. ارسال ایمیل خوشآمدگویی
// ۴. لاگ کردن رویداد
}
}
در مثال بالا، اگر بخواهیم قالب ایمیل را تغییر دهیم، مجبوریم کلاس UserManager را دستکاری کنیم که خطرناک است. راه حل صحیح:
GoodCode.php
PHP
8.x
class UserRepository {
public function save($user) { // فقط ذخیرهسازی }
}
class EmailService {
public function sendWelcome($email) { // فقط ارسال ایمیل }
}
class UserService {
public function register($data) {
$user = new User($data);
(new UserRepository())->save($user);
(new EmailService())->sendWelcome($user->email);
}
}
O: اصل باز/بسته (OCP)
موجودیتهای نرمافزاری (کلاسها، ماژولها، توابع) باید برای توسعه باز اما برای اصلاح بسته باشند. یعنی باید بتوانیم رفتار جدید اضافه کنیم بدون اینکه کد موجود را تغییر دهیم.
PaymentProcessor.php
PHP
8.x
interface PaymentMethod {
public function pay($amount);
}
class Zarinpal implements PaymentMethod {
public function pay($amount) { // منطق زرینپال }
}
class PayPal implements PaymentMethod {
public function pay($amount) { // منطق پیپل }
}
// برای اضافه کردن درگاه جدید، فقط یک کلاس جدید میسازیم
// بدون دستکاری کلاسهای قبلی!
L, I, D: سایر اصول به صورت خلاصه
- L (Liskov): کلاسهای فرزند باید بتوانند جایگزین کلاس والد شوند بدون اینکه برنامه خراب شود. (مثلاً کلاس “پنگوئن” نباید از کلاس “پرنده” ارثبری کند اگر متد “پرواز” دارد!)
- I (Interface Segregation): بهتر است چندین رابط کوچک و تخصصی داشته باشیم تا یک رابط بزرگ و همهکاره. کاربر نباید مجبور باشد متدهایی را پیادهسازی کند که به آنها نیاز ندارد.
- D (Dependency Inversion): ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابسته باشند. هر دو باید به انتزاعات (Interfaces) وابسته باشند. این اصل پایهی اصلی تزریق وابستگی (Dependency Injection) است.
⚠️ هشدار مهم:
رعایت کورکورانه SOLID ممکن است باعث پیچیدگی بیش از حد (Over-engineering) در پروژههای کوچک شود. این اصول برای سیستمهای بزرگ و بلندمدت طراحی شدهاند.
🏁 جمعبندی درس اول
مهمان عزیز، در این درس یاد گرفتی:
- ✅ چرا تفکیک مسئولیتها (SRP) حیاتی است.
- ✅ چگونه با استفاده از Interfaceها کد را برای توسعه باز نگه داریم (OCP).
- ✅ اهمیت طراحی صحیح سلسله مراتب کلاسها (LSP).
- ✅ مزایای استفاده از رابطهای کوچک (ISP) و وارونگی وابستگی (DIP).
🎓 تمرین عملی درس اول
یک کلاس قدیمی یا پیچیده از پروژههای قبلی خودت را انتخاب کن و سعی کن با اعمال اصل SRP و OCP، آن را بازنویسی و تمیزتر کنی.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | اصول SOLID در PHP | تکمسئولیتی، باز/بسته، جایگزینی لیسکوف، جداسازی رابط، وارونگی وابستگی |
| ۲ | الگوهای طراحی (Design Patterns) | Singleton, Factory, Strategy, Observer, MVC پیشرفته |
| ۳ | برنامهنویسی تابعی در PHP | توابع ناشناس (Closures)، Arrow Functions، Map/Filter/Reduce |
| ۴ | مدیریت وابستگی با Composer | نصب پکیجها، مدیریت نسخهها، Autoloading (PSR-4) |
| ۵ | تستنویسی حرفهای (TDD) | آشنایی با PHPUnit، نوشتن Unit Test، Mocking |
| ۶ | کار با Redis و Caching | کش کردن دادهها، Session Handler با Redis |
| ۷ | پردازشهای پسزمینه (Queue & Jobs) | استفاده از صفها برای ایمیلزنی یا پردازش سنگین |
| ۸ | API نویسی حرفهای (RESTful) | استانداردهای REST، احراز هویت با JWT، Rate Limiting |
| ۹ | امنیت سایبری پیشرفته | تحلیل حملات پیچیده، Secure Headers، CSP |
| ۱۰ | پروژه نهایی پیشرفته | ساخت یک CMS ماژولار با قابلیت نصب پلاگین و تم |



