اصول سالید در لاراول

Solid Principles in Laravel

28 شهریور 1402
Solid Principles in laravel

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

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

  • اصل مسئولیت واحد (SRP)
  • اصل باز/بسته (OCP)
  • اصل جایگزینی لیسکوف (LSP)
  • اصل جداسازی اینترفیس (ISP)
  • اصل وارونگی وابستگی (DIP)

آموزش اصول سالید در لاراول

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

اصل Single Responsibility Principle یا SRP

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
  }
}

اصل Open Clouse یا OCP

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
  }
}

اصل جایگزینی لیسکوف یا Liskov Substitution Principle (LSP)

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";
  }
}

 

اصل جداسازی اینترفیس یا Interface Segregation Principle (ISP)

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) یا Dependency Inversion Principle

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 به ایجاد کدی کمک می کند که نگهداری و اصلاح آن در طول زمان آسان تر باشد. هنگامی که هر کلاس یا ماژول یک مسئولیت دارد و از اصل باز/بسته پیروی می کند، می توان تغییرات را بدون تاثیرگذاری بر سایر قسمت های کد انجام داد.
  • افزایش تست پذیری: اصول SOLID همچنین تست کد را آسان تر می کند. کدی که از اصل مسئولیت منفرد پیروی می کند معمولا آزمایش آسانتر است زیرا وابستگی های کمتر و عوارض جانبی احتمالی کمتری وجود دارد.
  • افزایش انعطاف پذیری: با رعایت اصل باز/بسته، می توانید کدی ایجاد کنید که انعطاف پذیرتر و توسعه پذیرتر باشد. هنگامی که نیاز به افزودن عملکرد جدید دارید، می توانید این کار را با افزودن کلاس ها یا اینترفیس های جدید به جای اصلاح کد موجود انجام دهید.
  • سازماندهی بهتر کد: با پیروی از اصول SOLID، می توانید کد خود را بهتر سازماندهی کنید و آن را برای سایر توسعه دهندگان قابل درک تر کنید. کدی که به خوبی سازماندهی شده و از الگوهای طراحی واضح پیروی می کند، نگهداری و گسترش آن آسان تر است.

نتیجه گیری

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

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.