اصل Single Responsibility در SOLID چیست؟
افراد زیادی در حوزههای مختلف مشغول برنامه نویسی هستند، اما چیزی که یک برنامه نویس حرفه ای را از یک برنامه نویس متوسط یا بد متمایز میکند، یادگیری طراحی کد خوب (Good Design) است. طراحی خوب و استاندارد در برنامه نویسی بخاطر ویژگی هایی که در برنامه ایجاد میکند باعث راحت شدن فرآیند تغییر در کدها میشود. با این کار، هزینههای مالی و زمانی تغییر کدها و نگهداری از برنامه به شدت کاهش پیدا میکند.
دنیایی که درآن زندگی میکنیم دنیای پیچیدگیها است و نیاز به تغییرات و همگام و سازگار شدن با آن تغییرات امری ضروری است. این دنیا، برای برنامه نویس هایی که از ایجاد تغییر در کدهای خود وحشت زده میشوند و یا زمان زیادی را برای آن به هدر میدهند مکان بی رحمی است! بنابراین بهتر است هر چه زودتر با یادگیری اساس طراحی کد خوب، برنامههای خود را برای ایجاد تغییرات و featureها یا امکانات جدید، ساده و استاندارد و تمیز کنیم.
طراحی کد خوب به ما کمک میکند با تغییرات برنامهها به راحتی کنار بیاییم و از پیچیدگی برنامههای خود کم کرده و خوانایی کد را افزایش دهیم. شاید تصور بعضیها این باشد که کدهای پیچیده که هیچکسی از آن سر در نیاورد نشانه یک برنامه نویس باهوش و خوب است. خیر! باید بدانید برنامه نویس خوب کسی نیست که کدهایش توسط کامپیوتر قابل فهم باشد بلکه برنامه نویسی است که کدهایش به راحتی توسط انسان قابل خواندن و تفسیر کردن باشد.
اصل Single Responsibility در SOLID
چندین بار از عبارت طراحی کد استفاده کردیم! شاید برایتان سوال باشد که طراحی چه ارتباطی با برنامه نویسی دارد! پس برای شروع آشنایی با اصطلاح Single Responsibility، بهتر است در ابتدا با دیزاین یا طراحی و چیستی آن آشنا شویم. منظور از طراحی در برنامه نویسی، در واقع فرآیند کدنویسی، تست کردن و بازتولید یا ریفکتور (Refactoring) آن است. بنابراین با این دیدگاه، برنامه نویس یک طراح نرم افزار محسوب میشود.
به طور خلاصه برای رسیدن به یک طراحی خوب، به تک منظوره بودن و انسجام درونی ماژول ها (که در برنامه نویسی شی گرا همان کلاسها هستند) و همینطور پرهیز از در هم تنیدگی آنها احتیاج داریم. باید بدانید که Single Responsibility راه حل رسیدن به شرط اول است. Single Responsibility از اصول پنجگانه SOLID (بخوانید سالید) و اولین آنها است. در SOLID به این اصل Single Responsibility Principle یا به اختصار SRP میگویند.
Reusability
در این اصل، گفته میشود که برای رسیدن به یک طراحی خوب، نیاز داریم که هر کلاس تنها و تنها یک هدف و وظیفه را در برنامه ایفا کند. کار تمام متدهای کلاس باید در راستای رسیدن به آن هدف باشد و استفاده از هر متدی با وظایف منحرف از هدف اصلی اشتباه است و باعث در هم تنیدگی وظایف در برنامه و بنابراین پیچیدگی کد و در نتیجه کم کردن Reusability یا قابلیت استفاده مجدد از کدها میشود. همینطور هر متد کلاس باید تنها و تنها یک وظیفه را ایفا کند.
به عنوان مثال گوشیهای تلفن همراه هوشمند را در نظر بگیرید. این گوشیها معمولا امکانات زیادی مانند دوربین عکاسی و فیلم برداری، رادیو، ضبط کننده صدا و… در خود دارند. اما چه کسی میتواند ادعا کند که یک تلفن همراه میتواند از یک دوربین حرفه ای عکاسی و فیلم برداری بهتر عمل کند؟ چه کسی برای ضبط تخصصی پادکست و یا قطعات موسیقی از تلفن همراه خود استفاده کرده و دستگاههای تخصصی ضبط را نادیده میگیرد؟
اصل Single Responsibility
در اصل Single Responsibility به عنوان مثال اگر یک کلاس Authentication یا احراز هویت داشته باشیم، لازم است که تمام متدهای کلاس در راستای احراز هویت کاربر باشند. مثلا میتوانیم متدهای Login() و یا Logout() داشته باشیم ولی داشتن متدهایی مانند showPosts() برای نمایش پستهای کاربر در این اصل، عملی اشتباه است.
نتیجه گیری
در این مطلب با اولین اصل از اصول مهم SOLID در طراحی نرم افزار آشنا شدیم. اصل Single Responsibility یا تک وظیفگی میگوید که هر ماژول یا کلاس برنامه فقط باید در راستای یک هدف فعالیت کند و داشتن متدهایی که وظایف حاشیه ای یا نامربوط دارند اشتباه است. این قانون در مورد متدها نیز برقرار است. یعنی هر متد کلاس باید تنها یک وظیفه را به عهده داشته باشد. با رعایت کردن این اصل میتوانیم به اولین نشانه طراحی خوب که همان انسجام در ماژولهای برنامه است برسیم.