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

سمت چپ تصویر یک ابزار میبینید که همزمان کار «چاقو»، «ارّه» و «قیچی» را انجام میدهد. در اینجا اصل تک مسئولیتی رعایت نشده است. پس در نهایت این ابزار نمیتواند کار هیچ کدام رو به خوبی خودشان انجام بدهد، چون بر روی وظایف مختلفی تمرکز کرده است. حالا تصور کنید چاقو در این ابزار خراب میشود و نیاز به تعمیر دارد، اگه این ابزار را به تعمیرکار بسپارید، همزمان همه این ابزار دچار تعمیر میشوند و تا زمانی که چاقو تعمیر نشده است، شما از سایر ابزار ها هم نمیتوانید استفاده کنید.
حالا راه حل چیست؟ اینکه هر کدام از این ابزارها را جداگانه تهیه کنیم. مانند سمت راست تصویر که اصل تک مسئولیتی رعایت شده است. در این صورت، هر یک از این ابزار به صورت مجزا بر روی وظیفه خود تمرکز میکنند و اگر یکی از این ابزار خراب شود، فقط همان ابزار را به تعمیرکار میسپاریم و میتوانیم از سایر ابزار استفاده کنیم.
یک مثال از اصل تک مسئولیتی در زبان برنامه نویسی
فرض کنید یک پلتفرم داریم که در آن سه وظیفه «ارسال ایمیل»، «ارسال پیامک» و «ارسال نوتیفیکیشن» وجود دارد. اگر بدون رعایت اصل تک مسئولتی اقدام به نوشتن کد کنیم، یک کد شبیه به کد زیر خواهیم نوشت:
class MessageHandler {
public function handleMessage($messageData) {
// Send an email to the recipient
// Send an SMS to the recipient
// Send a notification to the recipient
}
}
در این کد یک کلاس با نام MessageHandler داریم که دارای متدی به نام handleMessage است، این متد وظیفه ارسال «ایمیل»، «پیامک» و «نوتیفیکیشن» را دارد. پس در صورتی که نیاز به ویرایش هر کدام از این سه قسمت داشته باشیم، مجبوریم این کلاس را ویرایش کنیم. پس به مرور زمان، هر چقدر تعداد این وظایف بیشتر شود، کلاس ما پیچیدهتر خواهد شد.
حالا همین مثال را ریفکتور کنیم و با رعایت اصل تک مسئولیتی بنویسیم:
class MessageHandler {
public function sendMail($messageData) {
// Send an email to the recipient
}
public function sendSMS($messageData) {
// Send an SMS to the recipient
}
public function sendNotification($messageData) {
// Send a notification to the recipient
}
}
در کد بالا یک کلاس به نام MessageHandler داریم که دارای سه متد است:
1- متد sendMail که وظیفه «ارسال ایمیل» را بر عهده دارد.
2- متد sendSMS که وظیفه «ارسال پیامک» را بر عهده دارد.
3- متد sendNotification که وظیفه «ارسال نوتیفیکیشن» را بر عهده دارد.
هر یک از این متدها یک مسئولیت واحد دارند و تنها بر یک جنبه از مدیریت پیام تمرکز دارند. این باعث میشود کلاس به راحتی قابل درک و نگهداری شود.
حالا اگر اشکالی در متد sendSMS پیدا شود، روی بقیه کلاس تاثیری نخواهد داشت و میتوانید بدون نگرانی از خراب شدن سایر قسمتهای سیستم، روی رفع باگ تمرکز کنید.
علاوه بر این، با متمرکز نگه داشتن کلاس تنها بر روی یک مسئولیت، استفاده مجدد از کلاس در بخشهای دیگر سیستم یا در پروژههای دیگر آسانتر میشود. به عنوان مثال، می توانید از همان کلاس MessageHandler برای پروژههای مختلف با حداقل تغییرات استفاده کنید.
این نمونهای از نحوه اعمال اصل تک مسئولیتی در برنامه نویسی PHP است. با متمرکز نگه داشتن کلاسها بر روی یک مسئولیت، میتوانید کدهای قابل نگهداری و مقیاس پذیرتری بنویسید.