برنامه نویسی و طراحی وب

اصل تک مسئولیتی در اصول SOLID

اصول SOLID در برنامه نویسی شئ‌گرا چیست؟
اصل تک مسئولیتی (Single Responsibility Principle)
اصل باز – بسته (Open/Closed Principle)
اصل جایگزینی لیسکوف (Liskov Substitution Principle)
اصل تفکیک رابط‌ها (Interface Segregation Principle)
اصل وارونگی وابستگی (Dependency Inversion Principle)

اصل 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 است. با متمرکز نگه داشتن کلاس‌ها بر روی یک مسئولیت، می‌توانید کدهای قابل نگهداری و مقیاس پذیرتری بنویسید.

سیدرضا بازیار

من مهندس فناوری اطلاعات و توسعه دهنده Back end هستم. حس کنجکاوی، تمایل به کشف دنیاهای جدید و علاقه زیادی به حل چالش‌های گوناگون در زمینه‌های مختلف داشتم باعث شد وارد حرفه‌ی پرچالش و عمیق برنامه‌نویسی بشوم و هر روز بیشتر در این دنیای بزرگ غرق می‌شوم. در حال حاضر با مهارت هایی نرم مانند کار تیمی، قدرت مذاکره، خوش برخوردی، پرورش ایده و مهارت های سخت مانند PHP, OOP, Clean Code, Design Patterns و ... با علاقه مشغول به فعالیت در جامعه متن‌باز هستم. معتقدم هر روز بیشتر از دیروز، عمده کارهای انسان‌ها توسط ربات‌ها انجام خواهد شد، به همین دلیل سعی میکنم اسکریپت‌های زیادی با PHP ، Shell Scripting و Bash Scripting بنویسم و سعی می‌کنم کارهایی که برای انسان‌ها سخت و زمانبر هستند،‌ با ربات‌ها در سریعترین زمان و کمترین هزینه ممکن انجام بدهم. در این مسیر با زبان‌های برنامه نویسی مانند C++ و پایتون هم کمی کار کرده‌ام و با سیستم های مدیریت محتوای زیادی مانند وردپرس، جوملا، ویبولتین و... هم به صورت حرفه‌ای درگیر بوده‌ام. گهگاهی سعی میکنم ربات‌هایی طراحی کنم که اطلاعات عظیمی را از طریق اسکرپینگ به دیتابیس های مختلف منتقل میکنند و از طریق API در پلتفرم های مختلف پردازش می‌شوند. در 10 سال گذشته سابقه زیادی در طراحی سایت و فروشگاه‌های اینترنتی، سئو و بهینه سازی، تست امنیت وب‌سایت‌ها، دیجیتال مارکتینگ و... داشته‌ام. خوشحال میشم بتونم تجربیات خودم رو از طریق این وبلاگ در اختیار همه شما عزیزان قرار بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *