سلام دوستان!
امروز میخوایم در مورد یه اصل خیلی مهم در برنامهنویسی صحبت کنیم: اصل تک وظیفهای (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, برنامهنویسی شیء گرا, کلاس, ماژول, طراحی نرم افزار, کد تمیز, قابلیت نگهداری
وقتی به SRP به عنوان مخفف Single Responsibility Principle اشاره می کنیم، منظور این است که SRP با گرفتن حروف اولیه هر کلمه مهم در Single Responsibility Principle تشکیل می شود. این فرآیند عبارت اصلی را به شکلی کوتاه تر و قابل مدیریت تر فشرده می کند و در عین حال معنای اصلی خود را حفظ می کند. بر اساس این تعریف، SRP مخفف Single Responsibility Principle است.
امتیاز شما به این مطلب
امتیاز: 5 از 5 (مجموع 1 رای)
اولین نفری باشید که در مورد این مقاله نظر می دهید!
techfeed.ir© 2024 All rights reserved