اتصال و انسجام (Coupling & Cohesion) در طراحی نرم افزار

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

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

Seven Item

زمانی که در حال برنامه نویسی هستید، باید با نهایت سعی و تلاش خود کلاس ها و متد های پیاده سازی شده خود را ساده نگه دارید. زمانی که پیچیدگی طراحی شما از چیزی که توسعه دهندگان وب میتوانند به طور ذهنی تحلیل کنند، افزایش بیشتری می یابد، اشکالات و خطاها خود را بیشتر نشان می دهند. بنابراین باید راهی برای ارزابی پیچیدگی طراحی و پیاده سازی داشته باشید.

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

Module

دو نمونه از معیار هایی که برای ارزیابی پیچیدگی طراحی در حوزه نرم افزار استفاده می کنیم اتصال (Coupling) و انسجام(Cohesion) هستند.

CouplingAndCohesion

اتصال(Coupling) بر پیچیدگی ما بین یک ماژول و بقیه ماژول ها اطلاق می شود.

Coupling

انسجام(Cohesion) بر پیچیدگی درون یک ماژول تمرکز دارد.

Cohesion

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

Puzzle

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

Lego

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

اتصال(Coupling) مورد بحث در رابطه با یک ماژول، به پیچیدگی اتصال آن به دیگر ماژول ها اشاره می کند. اگر ماژول شما  وابستگی شدیدی به دیگر ماژول ها داشته باشد، در این صورت می گوییم که ماژول مورد نظر اتصال سخت (Tight Coupling) با دیگر ماژول ها دارد. همانند تکه های یک پازل.

TightlyCoupled

در حالت دیگر، اگر ماژول شما قادر باشد به راحتی به دیگر ماژول ها متصل شود، در این صورت می گوییم که ماژول مورد نظر اتصال شل(Loose Coupling) با دیگر ماژول ها دارد. مانند لگو.

LooslyCoupled

باید اتصال ماژول های ما شل و یا کم باشد و سخت نباشد. وقتی اتصال یک ماژول بررسی می شود، باید سه ویژگی را در نظر گرفت، این سه ویژگی عبارتند از: درجه(Degree)، سهولت(Ease) و انعطاف(Flexibility).

Degree-Ease-Flexibitily

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

سهولت(Ease) بدین معنی است که اتصال ما بین ماژول ها چقدر ساده و آشکار است. با مفهوم اتصال، ما باید بدون این که نیاز داشته باشیم که بدانیم نحوه پیاده سازی بقیه ماژول ها چگونه بوده و یا داخل آنها چه خبر است، بتوانیم ماژول ها را به هم وصل کنیم.

انعطاف(Flexibility) بدین معنی است که چگونه می توانیم ماژول هایی را که به ماژول خود متصل کرده ایم، بتوانیم با ماژول های جدید تر جایگزین کنیم. با مفهوم اتصال ما باید قادر باشیم در آینده، به راحتی یک ماژول را با نسخه جدید تر و بهتر آن جایگزین کنیم. مانند لگو.

همانطور که اشاره کردیم، اتصال بر روی پیچیدگی رابطه مابین یک ماژول و دیگر ماژول ها تمرکز می کند. اما ما باید پیچیدگی درون یک ماژول را نیز در نظر داشته باشیم. این جاست که مفهوم انسجام مطرح می شود.

Cohesion

انسجام(Cohesion) بیانگر واضح، آشکار و مشخص بودن مسئولیت ها و وظایف یک ماژول است.

اگر ماژول شما فقط و فقط یک وظیفه را بر عهده داشته و  و هدف کاملا مشخصی را داشته باشد، در این صورت ماژول شما از انسجام بالایی برخوردار است.

HighCohesion

اما اگر ماژول شما بیش از یک وظیفه را بر عهده دارد، و یا هدف کاملا مشخص و دقیقی ندارد، در این صورت ماژول شما از انسجام پایینی برخوردار است.

LowCohesion

اگر دیدید که ماژول شما بیش از یک کار را انجام می دهد، زمان آن رسیده که ماژول خود را به دو یا چند ماژول دیگر تقسیم کنید.

حال برای درک بهتر مفهوم اتصال و انسجام به یک مثال توجه می کنیم.
فرض کنیم ما یک کلاس سنسور داریم که این کلاس دو وظیفه دارد، میزان رطوبت و میزان دمای محیط را برای ما برمیگرداند.

SensorClass

داخل این کلاس متدی با نام get داریم که یک flag از ورودی می گیرد. اگر flag برابر با 0 باشد، مقدار رطوبت را بر میگرداند و اگر برابر با 1 باشد، میزان دما را بر خواهد گرداند.

SensorClassBody

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

حال به یک طراحی دیگر در همان سیستم توجه کنید. کلاس سنسور به دو کلاس مجزای دیگر به نام های سنسور رطوبت و سنسور دما جایگزین شده است.

RedesignedClasses

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


منابع:
   
Coupling and Cohesion - Design Principles | Coursera



آخرین بروزرسانی
۱۶ اسفند ۱۴۰۲ 
تعداد کلیک
۷,۵۳۹

فهرست نظرها و ارسال نظر جدید

نام را وارد کنید
ایمیل را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید