cohesion چیست؟

در شئگرایی دو ملاک اصلی ارزیابی ماژولهای پیشبینی شده، coupling و cohesion (همبستگی) هستند. در این مطلب در مورد coupling توضیح داده شد که معیاری برای سنجش وابستگی ماژولهاست و در ادامه با همبستگی که میزان یکپارچه بودن یک ماژول منفرد را بررسی میکند و سطوح مختلف آشنا میشویم.
یک راه برای ارزیابی استقلال کارایی ماژولها یافتن سطح cohesion و همبستگی آنهاست. سطوح همبستگی در سه دسته کلی پایین،متوسط و بالا قرار میگیرند که هرکدام نیز یک یا چند زیردسته دارند:
پایین (بسیار نامطلوب)
ماژولها با این سطح از همبستگی حتما لازم است تغییر داده شوند و جایگزین شوند.
همبستگی تصادفی
یک ماژول با این سطح از همبستگی یکی از کارهای پشتیبان است که هیج ارتباط با معنی با دیگران ندارد. به عنوان مثال فرض کنید این کارها را داریم:
- تعمیر ماشین
- پخت کیک
- گرداندن سگ
- از رختخواب بیدار شدن
- سینما رفتن
یک برنامهنویس افسانهای ممکن است که بعد از هر ۲۰ خط کد مربوط به هر کار یک خط بکشد و در یک ماژول همه را قرار دهد. در حالی که نمیداند که همبستگی تصادفی ایجاد کرده است. اگر جایی متوجه شدید که بهترین اسم یک ماژول “کارهای گوناگون” است، یک زنگ خطر برای همبستگی سطح پایین است. در پیادهسازی نرمافزارها با زبانهای سطح بالا هیچ بهانه و دلیلی برای همبستگی تا این حد پایین برای ماژولهای یک سیستم وجود ندارد.
همبستگی منطقی
ماژول با این سطح از یکپارچگی المانی است که با فعالیتهای سایر المانها از خارج از ماژول در تعامل است. این مثال را در نظر داشته باشید. کسی که به یک سفر فکر میکند ممکن است به چنین لیستی برسد:
- رفتن با ماشین
- رفتن با قطار
- رفتن با کشتی
- رفتن با هواپیما
چه چیزی این فعالیتها را به هم متصل میکند؟ مسلما، همه اینها وسیلهای برای مسافرت هستند اما یک فرد باید یک زیر مجموعهای از این وسایل را انتخاب کند و کسی نیست که از همه آنها با هم استفاده کند.
یک ماژول همبسته منطقی مجموعهای از فعالیتها از نوع یکسانی را دارد. برای استفاده از ماژول، تنها تکهای که نیاز داریم را بر میداریم. بنابراین، یک ماژول همبسته منطقی، یک کیسه از فعالیتهاست. این فعالیتها هرچند متفاوت هستند، اما یک واسط کاربری یکسان دارند. معنای هر پارامتر به این بستگی دارد که چه فعالیتی انتخاب میشود. برای بعضی از فعالیتهای خاص، بعضی از پارامترها ممکن است استفاده نشوند.
ماژولهایی با اسمهای مثل “ورودی/خروجی سیستم را انجام بده” احتمالا ماژولی با همبستگی منطقی است. ماژولهایی که همبستگی پایینی دارند کار را به شدت برای پیادهسازی، تست و مراقبت و نگهداری سیستم سخت میکنند و به همین دلیل لازم است از آنها اجتناب شود.
همبستگی موقتی
یک ماژول با همبستگی موقتی، تسکهایی هست که در طول زمان به یکدیگر مربوطند. به عنوان مثال تسکهای زیر را در نظر بگیرید:
- بطریهای شیر را بیرون بگذار.
- گربه را بیرون بذار.
- تلویزیون را خاموش کن.
- مسواک بزن.
همه اینها کارهایی است که قبل از خواب انجام میشوند. ماژولهایی به اسمهای “همه این کارها را در شروع انجام بده ” یا “در خاتمه این کارها را انجام بده” ممکن است با همبستگی موقتی همراه باشند.
متوسط
این سطح همبستگی قابل قبول است اما ایدهآل نیست. خوب است که آن را بهبود داد، هرچند ممکن است مشکلات طراحی دیگری ایجاد شود.
همبستگی زیربرنامهای procedural
یک ماژول با این سطح از همبستگی، ماژولی است که فعالیتهای مختلف و نامرتبط را پشتیبانی میکند که در آن کنترل از یک فعالیت به دیگری منتقل میشود. یک مثال از این ماژول که احتمالا اسمی در حدود “آماده کردن غذای عید” خواهد داشت را در نظر بگیرید.
- ظرفهای غذای قبل را بشور
- ماهی را سرخ کن
- تلفن بزن
- دوش بگیر
- سبزیها را خرد کن
- میز را بچین
به دلیل یک ترتیب خطی ثابت از فعالیتها، این سطح از همبستگی از همبستگی موقتی بهتر است. هرچند باز هم دلیل زیادی برای قرار دادن این فعالیتها در کنار یکدیگر در یک ماژول وجود ندارد.
همبستگی ارتباطی
یک ماژول همبستگی ارتباطی دارد اگر همه فعالیتهایی که از آنها پشتیبانی میکند از یک داده ورودی و خروجی استفاده کنند یا یک بخش یکسان از ساختار داده را تغییر داده و به آن دسترسی داشته باشند.
مثال این سطح از همبستگی، ماژولی است که فعالیتهای زیر را دارد:
- پیدا کردن عنوان کتاب
- پیدا کردن قیمت کتاب
- پیدا کردن ناشر کتاب
- پیدا کردن نویسنده کتاب
یا یک ماژولی که همه واسطهای کار با یک پشته را در اختیار قرار میدهد.
همبستگی ترتیبی
یک ماژول با این سطح از همبستگی ماژولی است که المانهای آن در فعالیتهایی شرکت دارند که خروجی یکی ورودی دیگری است. مثال؛
- بدنه ماشین را تمیز کن.
- سوراخهای ماشین را پر کن.
- بدنه را سمباده بزن.
- رنگ بزن.
که در این جا ماشین یک ورودی است که مرحله به مرحله به عنوان پارامتر پاس میشود.
بالا
این سطح از همبستگی ایدهآل است و نیاز به تغییر ندارد.
همبستگی تابعی
ماژولها در این سطح یک و تنها یک کار انجام میدهند. اسم ماژولها در این سطح چیزی شبیه موارد زیر خواهد بود
- محاسبه کسینوس زاویه
- محاسبه سود خالص درآمد کارمندان
- انتساب صندلی به مشتریان هواپیما
حتما متوجه شدید که هرچه بالاتر بودن cohesion و پایینتر بودن coupling در ایدهآلهای طراحی شئگرایی به حساب میآیند و لازم است در هنگام طراحی این معیارها را نیز در گوشه ذهن خود داشته باشیم وگرنه کدنویسی و مراقبت و نگهداری از نرمافزار در آینده به کابوس همیشگیتان تبدیل خواهد شد.
در شکل زیر نیز یک نمایش شماتیک از این دو مفهوم را میتوانید ببینید.
منبع:
http://pages.cpsc.ucalgary.ca/~eberly/Courses/CPSC333/Lectures/Design/cohesion.html