campaign-off40

اصل Single Responsibility در SOLID چیست؟



visibility  
mode_comment   ۴

افراد زیادی در حوزه های مختلف مشغول برنامه نویسی هستند، اما چیزی که یک برنامه نویس حرفه ای را از یک برنامه نویس متوسط یا بد متمایز می کند، یادگیری طراحی کد خوب (Good Design) است. طراحی خوب و استاندارد در برنامه نویسی بخاطر ویژگی هایی که در برنامه ایجاد می کند باعث راحت شدن فرآیند تغییر در کدها می شود. با این کار، هزینه های مالی و زمانی تغییر کدها و نگهداری از برنامه به شدت کاهش پیدا می کند.

دنیایی که درآن زندگی می کنیم دنیای پیچیدگی ها است و نیاز به تغییرات و همگام و سازگار شدن با آن تغییرات امری ضروری است. این دنیا، برای برنامه نویس هایی که از ایجاد تغییر در کدهای خود وحشت زده می شوند و یا زمان زیادی را برای آن به هدر می دهند مکان بی رحمی است! بنابراین بهتر است هر چه زودتر با یادگیری اساس طراحی کد خوب، برنامه های خود را برای ایجاد تغییرات و feature ها یا امکانات جدید، ساده و استاندارد و تمیز کنیم.

طراحی کد خوب به ما کمک می کند با تغییرات برنامه ها به راحتی کنار بیاییم و از پیچیدگی برنامه های خود کم کرده و خوانایی کد را افزایش دهیم. شاید تصور بعضی ها این باشد که کدهای پیچیده که هیچکسی از آن سر در نیاورد نشانه یک برنامه نویس باهوش و خوب است. خیر! باید بدانید برنامه نویس خوب کسی نیست که کدهایش توسط کامپیوتر قابل فهم باشد بلکه برنامه نویسی است که کدهایش به راحتی توسط انسان قابل خواندن و تفسیر کردن باشد.

چندین بار از عبارت طراحی کد استفاده کردیم! شاید برایتان سوال باشد که طراحی چه ارتباطی با برنامه نویسی دارد! پس برای شروع آشنایی با اصطلاح Single Responsibility، بهتر است در ابتدا با دیزاین یا طراحی و چیستی آن آشنا شویم. منظور از طراحی در برنامه نویسی، در واقع فرآیند کدنویسی، تست کردن و بازتولید یا ریفکتور (Refactoring) آن است. بنابراین با این دیدگاه، برنامه نویس یک طراح نرم افزار محسوب می شود.

single responsibility چیست

به طور خلاصه برای رسیدن به یک طراحی خوب، به تک منظوره بودن و انسجام درونی ماژول ها (که در برنامه نویسی شی گرا همان کلاس ها هستند) و همینطور پرهیز از در هم تنیدگی آن ها احتیاج داریم. باید بدانید که Single Responsibility راه حل رسیدن به شرط اول است. Single Responsibility از اصول پنجگانه SOLID (بخوانید سالید) و اولین آن ها است. در SOLID به این اصل Single Responsibility Principle یا به اختصار SRP می گویند.

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

به عنوان مثال گوشی های تلفن همراه هوشمند را در نظر بگیرید. این گوشی ها معمولا امکانات زیادی مانند دوربین عکاسی و فیلم برداری، رادیو، ضبط کننده صدا و... در خود دارند. اما چه کسی می تواند ادعا کند که یک تلفن همراه می تواند از یک دوربین حرفه ای عکاسی و فیلم برداری بهتر عمل کند؟ چه کسی برای ضبط تخصصی پادکست و یا قطعات موسیقی از تلفن همراه خود استفاده کرده و دستگاه های تخصصی ضبط را نادیده می گیرد؟

در اصل Single Responsibility به عنوان مثال اگر یک کلاس Authentication یا احراز هویت داشته باشیم، لازم است که تمام متدهای کلاس در راستای احراز هویت کاربر باشند. مثلا می توانیم متدهای Login() و یا Logout() داشته باشیم ولی داشتن متدهایی مانند showPosts() برای نمایش پست های کاربر در این اصل، عملی اشتباه است.

single responsibility چیست

به مثال زیر دقت کنید:

در این مثال یک Interface مودم تعریف کرده ایم. در کلاس Modem، دو متد با نام dial() و hangUp() برای اتصال و قطع اتصال مودم و دو متد send() و Receive() برای ارسال و دریافت داده داریم. بنابراین در این کلاس در حال انجام دو وظیفه هستیم:

  • مدیریت اتصال مودم
  • انتقال داده ها از طریق مودم

اما همانطور که گفتیم این کار اصل Single Responsibility را نقض می کند. بنابراین به جای داشتن یک Interface بزرگ با دو مسئولیت، آن را به دو Interface کوچک تر تک منظوره می شکنیم. با این کار کدمان به این شکل در می آید:

همانطور که مشاهده می کنید Interface بزرگ Modem، به دو Interface با نام های DataChannel و Connection شکسته شده است. با این عمل حالا دو ماژول داریم که یکی وظیفه مدیریت اتصال مودم و دیگری وظیفه انتقال داده ها را پشتیبانی و مدیریت می کنند.

نتیجه گیری

در این مطلب با اولین اصل از اصول مهم SOLID در طراحی نرم افزار آشنا شدیم. اصل Single Responsibility یا تک وظیفگی می گوید که هر ماژول یا کلاس برنامه فقط باید در راستای یک هدف فعالیت کند و داشتن متدهایی که وظایف حاشیه ای یا نامربوط دارند اشتباه است. این قانون در مورد متدها نیز برقرار است. یعنی هر متد کلاس باید تنها یک وظیفه را به عهده داشته باشد. با رعایت کردن این اصل می توانیم به اولین نشانه طراحی خوب که همان انسجام در ماژول های برنامه است برسیم. آیا شما تجربه ای از اشتباه در رعایت نکردن این اصل داشته اید؟ این اشتباه چه مشکلاتی برای شما ایجاد کرد؟ از خواندن نظرات شما خوشحال می شویم!

7Learn Experts
comment دیدگاه کاربران
امیرحسین ضیایی replyپاسخ

میشه توی پستای بعدی درمورد abstract interface و… توضیح بدید.

لقمان آوند

سلام جناب ضیایی
بله حتما
پست اینترفیس منتشر شد الان

مشایخی replyپاسخ

احسنت این مطالب را زیاد کنید کل solid و design pattern ها را ذکر کنید عالیه

لقمان آوند

ممنون از دیدگاهتون
حتما در ادامه این مقالات رو بیشتر خواهیم داشت

add_circle ارسال دیدگاه

خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :