برای پیاده سازی یک نرم افزار با قابلیت نگهداری و ماندگاری بالا، باید یک سری قواعد و اصول را یاد بگیرید که در توسعه نرم افزار دچار مشکل نشوید. سالید در لاراول یا Solid Principles به عنوان یک سری قواعد استاندارد معرفی شده تا توسعه دهندگان با یک زبان مشترک به خروجی قابل قبولی دست پیدا کنند.
SOLID مجموعه ای از پنج اصل طراحی است که طراحی نرم افزار قوی، قابل نگهداری و مقیاس پذیر را ترویج می کند. SOLID مخفف:
هر اصل به عنوان یک دستورالعمل برای ترویج شیوه های طراحی خوب عمل کرده و به اطمینان از اینکه کد مقیاس پذیر، قابل نگهداری و درک آسان است کمک می کند. در این مقاله، ما هر یک از اصول SOLID را به طور عمیق و نحوه اعمال آنها در لاراول را بررسی خواهیم کرد.
SRP بیان می کند که یک کلاس باید تنها یک دلیل برای تغییر داشته باشد. به عبارت دیگر، یک کلاس باید فقط یک مسئولیت داشته باشد و بر انجام یک کار به خوبی متمرکز باشد. این اصل به کاهش پیچیدگی کد کمک و نگهداری آن را آسان تر می کند.
در لاراول، SRP را می توان با ایجاد کلاس های کوچکتر متمرکز که وظایف خاصی را انجام می دهند، ایجاد کرد. به عنوان مثال، به جای داشتن یک کلاس واحد که احراز هویت (authorization) و مجوز کاربر را کنترل می کند، بهتر است کلاس های جداگانه ای برای احراز هویت و مجوز وجود داشته باشد.
class User { public function register($data) { // Register user logic } public function login($data) { // Login logic } } // Better implementation with SRP class UserRegistration { public function register($data) { // Register user logic } } class UserLogin { public function login($data) { // Login logic } }
OCP بیان می کند که یک کلاس باید برای توسعه باز باشد، اما برای تغییر کردن باید بسته شود. یعنی که کلاس ها باید به گونه ای طراحی شوند که امکان اضافه شدن قابلیت های جدید بدون تغییر کد موجود را فراهم کند.
در لاراول، این اصل را می توان با استفاده از اینترفیس ها و کلاس های انتزاعی اعمال کرد. با تعریف یک اینترفیس برای یک کار خاص، می توان چندین پیاده سازی از آن کار ایجاد کرد که هر کدام عملکرد منحصر به فرد خود را دارند.
class PaymentMethod { public function processPayment($amount) { // Payment processing logic } } // Better implementation with OCP interface PaymentMethodInterface { public function processPayment($amount); } class CreditCardPayment implements PaymentMethodInterface { public function processPayment($amount) { // Credit card payment processing logic } } class BankTransferPayment implements PaymentMethodInterface { public function processPayment($amount) { // Bank transfer payment processing logic } }
LSP بیان می کند که اشیا یک سوپر کلاس باید بتوانند با اشیا یک زیر کلاس جایگزین شوند بدون اینکه بر صحت برنامه تاثیر بگذارند. به عبارت دیگر، یک زیر کلاس باید جایگزینی برای سوپر کلاس خود باشد.
در لاراول می توان این اصل را با استفاده از وراثت و چندشکلی اعمال کرد. با ایجاد یک کلاس پایه که عملکرد مشترک را برای مجموعه ای از کلاس ها تعریف می کند، می توان زیر کلاس هایی را ایجاد کرد که از کلاس پایه به ارث می برند و عملکرد منحصر به فرد خود را اضافه کنند.
class Animal { public function makeSound() { return "Animal sound"; } } class Dog extends Animal { public function makeSound() { return "Bark"; } } // Example of LSP violation class Cat extends Animal { public function climb() { return "Climbing"; } } // Better implementation with LSP interface AnimalSoundInterface { public function makeSound(); } class Animal implements AnimalSoundInterface { public function makeSound() { return "Animal sound"; } } class Dog implements AnimalSoundInterface { public function makeSound() { return "Bark"; } } class Cat { public function climb() { return "Climbing"; } }
ISP بیان می کند که کلاس ها نباید مجبور به پیاده سازی اینترفیس هایی شوند که از آنها استفاده نمی کنند. این اصل به کاهش پیچیدگی کد کمک می کند و نگهداری آن را آسان تر می کند.
این اصل از سالید در لاراول را می توان با ایجاد اینترفیس های کوچکتر و متمرکزتر که وظایف خاصی را تعریف می کنند، اعمال کرد. به عنوان مثال، به جای داشتن یک اینترفیس واحد که تمام متدهایی را که یک ریپازیتوری کاربر باید پیادهسازی کند، تعریف میکند، بهتر است اینترفیسهای جداگانهای برای احراز هویت، مجوز دسترسی و مدیریت کاربر داشته باشیم.
interface UserRepositoryInterface { public function getUsers(); public function getUser($id); public function createUser($data); public function updateUser($id, $data); public function deleteUser($id); } // Better implementation with ISP interface ReadUserRepositoryInterface { public function getUsers(); public function getUser($id); } interface WriteUserRepositoryInterface { public function createUser($data); public function updateUser($id, $data); public function deleteUser($id); }
DIP بیان می کند که ماژول های سطح بالا نباید به ماژول های سطح پایین وابستگی داشته باشند، اما هر دو باید به انتزاع ها بستگی داشته باشند. این اصل به کاهش اتصال بین ماژول ها کمک می کند و حفظ و مقیاس کد را آسان تر می کند.
این اصل از سالید در لاراول را میتوان را با استفاده از تزریق وابستگی اعمال کرد. با تعریف وابستگیها بهعنوان انتزاعها به جای پیادهسازی عینی، میتوان اجرای یک وابستگی را بدون تاثیر بر کد وابسته به آن تغییر داد.
class UserController { public function showProfile($id) { $userRepository = new UserRepository; $user = $userRepository->getUser($id); return view('user.profile', ['user' => $user]); } } // Better implementation with DIP class UserController { protected $userRepository; public function __construct(UserRepositoryInterface $userRepository) { $this->userRepository = $userRepository; } public function showProfile($id) { $user = $this->userRepository->getUser($id); return view('user.profile', ['user' => $user]); } }
استفاده از اصول SOLID در توسعه نرم افزار چندین مزیت دارد:
SOLID مجموعه ای از اصول طراحی است که به ترویج شیوه های طراحی خوب کمک می کند و تضمین می کند که کد مقیاس پذیر، قابل نگهداری و درک آسان است. با اعمال این اصول سالید در لاراول، توسعهدهندگان میتوانند کدی ایجاد کنند که قوی، قابل نگهداری و مقیاسپذیری آسان باشد.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.