اصول جامد

A circular table SOLID principlesa globe on top of it

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

1. اصل مسئولیت واحد (SRP)

  • تعریف: یک کلاس باید فقط یک دلیل برای تغییر داشته باشد، یعنی فقط یک مسئولیت یا شغل داشته باشد.

مثال:

// Bad example
class UserService {
  createUser() { /* logic for creating user */ }
  sendEmail() { /* logic for sending email */ }
}

// Good example
class UserService {
  createUser() { /* logic for creating user */ }
}

class EmailService {
  sendEmail() { /* logic for sending email */ }
}

2. اصل باز/بسته (OCP)

  • تعریف: موجودیت های نرم افزار (کلاس ها، ماژول ها، توابع) باید برای گسترش باز باشند اما برای اصلاح بسته باشند.

مثال:

// Bad example: Modifying existing class for adding new features
class Shape {
  draw() { /* logic for drawing a shape */ }
}

// Good example: Extending class without modifying original code
interface Shape {
  draw(): void;
}

class Circle implements Shape {
  draw() { /* logic for drawing a circle */ }
}

class Rectangle implements Shape {
  draw() { /* logic for drawing a rectangle */ }
}

3. اصل جایگزینی لیسکوف (LSP)

  • تعریف: اشیاء یک سوپرکلاس باید با اشیاء یک زیر کلاس بدون تأثیر بر صحت برنامه قابل تعویض باشند.

مثال:

// Bad example
class Bird {
fly() { /* logic for flying */ }
}

class Ostrich extends Bird {
fly() { throw new Error("Ostriches can't fly"); }
}

// Good example
class Bird {
// common bird behavior
}

class FlyingBird extends Bird {
fly() { /* logic for flying */ }
}

class Ostrich extends Bird {
// logic for ostrich behavior without flying
}

4. اصل جداسازی رابط (ISP)

  • تعریفپایان سمت چپ

مثال:

// Bad example
interface Animal {
  fly(): void;
  swim(): void;
}

class Dog implements Animal {
  fly() { throw new Error("Dogs can't fly"); }
  swim() { /* logic for swimming */ }
}

// Good example
interface Swimmable {
  swim(): void;
}

interface Flyable {
  fly(): void;
}

class Dog implements Swimmable {
  swim() { /* logic for swimming */ }
}

اصل وارونگی وابستگی (DIP)

  • تعریف: ماژول های سطح بالا نباید به ماژول های سطح پایین وابسته باشند. هر دو باید به انتزاعات بستگی داشته باشند. انتزاع ها نباید به جزئیات بستگی داشته باشند، جزئیات باید به انتزاع ها بستگی داشته باشند.

مثال:

// Bad example
class MySQLDatabase {
  connect() { /* MySQL connection logic */ }
}

class UserService {
  db: MySQLDatabase;
  constructor() {
    this.db = new MySQLDatabase();
  }
}

// Good example
interface Database {
  connect(): void;
}

class MySQLDatabase implements Database {
  connect() { /* MySQL connection logic */ }
}

class UserService {
  db: Database;
  constructor(db: Database) {
    this.db = db;
  }
}

این مثال ها نشان می دهد که چگونه استفاده از اصول SOLID به ایجاد سیستم های نرم افزاری قوی تر، قابل نگهداری و مقیاس پذیرتر کمک می کند.