آخرین بروزرسانی 1 ماه قبل

اصل مسئولیت واحد (SRP) چیست؟

اصل تک وظیفه‌ای: هر کلاس فقط یک کار

سلام دوستان!

امروز می‌خوایم در مورد یه اصل خیلی مهم در برنامه‌نویسی صحبت کنیم: اصل تک وظیفه‌ای (Single Responsibility Principle) یا به اختصار SRP. این اصل به ما میگه که هر کلاس یا ماژول در برنامه‌مون باید فقط یک دلیل برای تغییر داشته باشه. یعنی فقط یه کار رو به درستی انجام بده. شاید بپرسید خب این یعنی چی؟ و چرا مهمه؟

مشکل وقتی که یک کلاس چند کار انجام میده

تصور کنید یه کلاسی داریم که هم اطلاعات کاربر رو ذخیره می‌کنه، هم ایمیل می‌فرسته، هم گزارش تولید می‌کنه. اگه یه روز بخوایم روش ایمیل فرستادن رو تغییر بدیم، باید این کلاس رو تغییر بدیم. اگه یه روز بخوایم فرمت گزارش رو عوض کنیم، باز هم باید این کلاس رو تغییر بدیم. این یعنی کلاس ما خیلی شلوغه و هر تغییری در هر کدوم از این وظیفه‌ها، میتونه روی بقیه وظیفه‌ها هم تاثیر بزاره و باعث بروز مشکل بشه.

یه مثال ساده‌تر:


class User {
  public $name;
  public $email;

  public function __construct($name, $email) {
    $this->name = $name;
    $this->email = $email;
  }

  public function saveToDatabase() {
    // کد ذخیره اطلاعات کاربر در پایگاه داده
    echo "ذخیره کاربر در پایگاه داده...\n";
  }

  public function sendWelcomeEmail() {
    // کد ارسال ایمیل خوشامدگویی به کاربر
    echo "ارسال ایمیل خوشامدگویی...\n";
  }
}

$user = new User("علی", "[email protected]");
$user->saveToDatabase();
$user->sendWelcomeEmail();

این کلاس `User` دو تا وظیفه داره: ذخیره اطلاعات کاربر و ارسال ایمیل. اگه یه روز بخوایم روش ذخیره کردن اطلاعات رو تغییر بدیم، باید این کلاس رو دستکاری کنیم. همینطور برای تغییر روش ایمیل فرستادن. این خوب نیست! چون این کلاس بیشتر از یه دلیل برای تغییر داره.

راه حل: جدا کردن وظیفه‌ها

بهترین راه اینه که وظیفه‌ها رو از هم جدا کنیم. به جای اینکه همه کارها رو توی یه کلاس انجام بدیم، کلاس‌های جداگانه برای هر وظیفه درست می‌کنیم. اینطوری هر کلاس فقط یه کار رو انجام میده و فقط یه دلیل برای تغییر داره. این باعث میشه کد ما خواناتر، قابل فهم‌تر، و قابل نگهداری‌تر بشه.

حالا همون مثال بالا رو با رعایت اصل SRP دوباره می‌نویسیم:


class User {
  public $name;
  public $email;

  public function __construct($name, $email) {
    $this->name = $name;
    $this->email = $email;
  }
}

class UserRepository {
  public function save(User $user) {
    // کد ذخیره اطلاعات کاربر در پایگاه داده
    echo "ذخیره کاربر در پایگاه داده...\n";
  }
}

class EmailService {
  public function sendWelcomeEmail(User $user) {
    // کد ارسال ایمیل خوشامدگویی به کاربر
    echo "ارسال ایمیل خوشامدگویی...\n";
  }
}

$user = new User("علی", "[email protected]");
$userRepository = new UserRepository();
$emailService = new EmailService();

$userRepository->save($user);
$emailService->sendWelcomeEmail($user);

حالا سه تا کلاس داریم: `User` فقط اطلاعات کاربر رو نگهداری می‌کنه، `UserRepository` اطلاعات کاربر رو ذخیره می‌کنه، و `EmailService` ایمیل می‌فرسته. هر کدوم از این کلاس‌ها فقط یه کار رو انجام میدن و فقط یه دلیل برای تغییر دارن.

مزایای استفاده از اصل تک وظیفه‌ای

  • خوانایی و قابلیت فهم بیشتر: کد خواناتر میشه چون هر کلاس فقط یه کار رو انجام میده.
  • قابلیت نگهداری بهتر: تغییرات کوچکتر و ایزوله‌تر هستند و خطر ایجاد مشکل در قسمت‌های دیگه کد کمتر میشه.
  • قابلیت استفاده مجدد: کلاس‌ها رو میشه به راحتی در قسمت‌های دیگه برنامه استفاده کرد.
  • آزمایش پذیری بهتر: تست کردن کلاس‌ها آسون‌تر میشه چون هر کلاس فقط یه چیز رو تست می‌کنیم.

یه مثال دیگه: کلاس گزارش

فرض کنید یه کلاس گزارش داریم که هم گزارش رو تولید می‌کنه، هم اون رو به صورت PDF ذخیره می‌کنه، و هم اون رو به ایمیل ارسال می‌کنه. این کلاس سه تا وظیفه داره! بهتره این وظیفه‌ها رو جدا کنیم:

وظیفه کلاس مربوطه
تولید گزارش `ReportGenerator`
ذخیره گزارش به صورت PDF `PdfReportSaver`
ارسال گزارش از طریق ایمیل `EmailReportSender`

خلاصه

اصل تک وظیفه‌ای میگه که هر کلاس باید فقط یه کار رو انجام بده. این کار باعث میشه کد ما خواناتر، قابل نگهداری‌تر، و قابل استفاده مجدد بشه. سعی کنید همیشه این اصل رو در برنامه‌نویسی رعایت کنید. این کار باعث میشه کد بهتری بنویسید و در آینده دچار مشکل نشید. به امید دیدار در آموزشای بعدای!

نکته: هدف از این اصل این نیست که همه کلاس‌ها رو خیلی کوچیک کنیم. هدف اینه که کلاس‌ها رو به صورتی سازماندهی کنیم که هر کدوم فقط یه دلیل برای تغییر داشته باشند. گاهی اوقات یه کلاس میتونه چند تا کار مرتبط رو انجام بده، اما مهم اینه که همه این کارها به یه هدف واحد خدمت کنند.

کلمات کلیدی:

اصل تک وظیفه‌ای, SRP, برنامه‌نویسی شیء گرا, کلاس, ماژول, طراحی نرم افزار, کد تمیز, قابلیت نگهداری

اصل تک وظیفه‌ای دقیقا چی میگه؟
اصل تک وظیفه‌ای میگه که هر کلاس یا ماژول باید فقط یک دلیل برای تغییر داشته باشه. یعنی فقط یه کار رو به درستی انجام بده.
چرا رعایت اصل تک وظیفه‌ای مهمه؟
رعایت این اصل باعث میشه کد ما خواناتر، قابل نگهداری‌تر، قابل استفاده مجدد، و قابل تست‌تر بشه.
چطور می‌تونیم اصل تک وظیفه‌ای رو رعایت کنیم؟
با جدا کردن وظیفه‌ها و ایجاد کلاس‌های جداگانه برای هر وظیفه.
آیا میشه یه کلاس چند تا کار مرتبط رو انجام بده؟
بله، گاهی اوقات یه کلاس میتونه چند تا کار مرتبط رو انجام بده، اما مهم اینه که همه این کارها به یه هدف واحد خدمت کنند. مهم اینه که کلاس فقط یه *دلیل* برای تغییر داشته باشد، نه اینکه فقط یک خط کد داشته باشد.
آیا رعایت این اصل در همه پروژه ها لازم است؟
بله. رعایت این اصل به خصوص در پروژه های بزرگ و پیچیده بسیار مهم است. هرچه کد تمیزتر باشد، نگهداری و گسترش آن آسان‌تر است. در پروژه های کوچکتر ممکن است تاثیر آن کمتر دیده شود، اما عادت به رعایت آن در همه موارد، باعث می شود که به صورت ناخودآگاه کد بهتری بنویسید.
مخفف Single Responsibility Principle چیست؟
مخفف Single Responsibility Principle کلمه SRP می باشد.
SRP مخفف چیست؟
SRP مخفف Single Responsibility Principle می باشد.

کلمه SRP مخفف چیست؟

وقتی به SRP به عنوان مخفف Single Responsibility Principle اشاره می کنیم، منظور این است که SRP با گرفتن حروف اولیه هر کلمه مهم در Single Responsibility Principle تشکیل می شود. این فرآیند عبارت اصلی را به شکلی کوتاه تر و قابل مدیریت تر فشرده می کند و در عین حال معنای اصلی خود را حفظ می کند. بر اساس این تعریف، SRP مخفف Single Responsibility Principle است.

به اشتراک گذاشتن این مطلب در شبکه های اجتماعی

امتیاز شما به این مطلب

امتیاز: 5 از 5 (مجموع 1 رای)

اولین نفری باشید که در مورد این مقاله نظر می دهید!

9703- V12
Terms & Conditions | Privacy Policy

techfeed.ir© 2024 All rights reserved