coupling چیست؟
مفهوم coupling برای هرکسی که پیش زمینهای از طراحی نرمافزار دارد جدید نیست اما یادآوری آن و آموزش آن به افراد ناآشنا خالی از لطف نیست.
coupling یک متریک نرمافزاری است که مشخص میکند چقدر دو ماژول یا دو تابع بهم وابسته هستند. در واقع یک معیار کیفیت به حساب میآید. این مفهوم توسط Larry Constantine در سال ۱۹۶۰ معرفی شد و در سال ۱۹۷۴ در مقاله IBM Systems Journal, Structured Design و در سال ۱۹۷۹ در کتابی به همین نام رسما مطرح گردید.
دو ماژول A و B را در نظر بگیرید. هرچه برای فهم A به دانش بیشتری از B نیاز باشد، A به B بیشتر وابسته است. به طور کلی این مساله که برای فهم یک ماژول لازم است ماژولی دیگر بررسی شود یک درجهای از ارتباطات داخلی را نشان میدهد.
مفهوم coupling یک معیار از شدت ارتباط داخلی را نشان میدهد. coupling تحت تاثیر نوع اتصال ماژولها، پیچیدگی واسطها، جریان اطلاعات بین دو ماژول و زمان اتصال دو ماژول قرار میگیرد. coupling معمولا در مقابل cohesion قرار میگیرد. cohesion میزان یکپارچگی و همبستگی مسئولیتهای مختلف یک ماژول نرمافزاری را نشان میدهد برای مثال coupling کم به معنی cohesion زیاد است و بالعکس.
سطوح coupling
coupling زیاد علاوه بر دشواریهایی که در فهم کد به وجود میآورد، تغییر کد را بسیار سخت میکند. خطاها بین ماژولهای به هم وابسته منتشر میگردد و عملیات خطایابی و حل آنها را نیز مشکل میگرداند.
در عوض در صورتی که coupling زیاد نباشد میتوان به راحتی یک ماژول را به صورت مجزا مطالعه کرد و تغییر داد بدون آنکه نیاز به در نظر گرفتن اطلاعات از دیگر ماژولها باشد. خطاها بسیار سادهتر میتوانند پیدا شوند. خطایابی سریعتر صورت میگیرد و احتمال انتشار خطا کمتر میشود.
سطوح coupling از زیاد به کم در ادامه توضیح داده میشود.
Highest
content coupling یا pathological coupling
وقتی یک ماژول به کارکرد درونی ماژولی دیگر اتکا کند یا آن را تغییر دهد رخ میدهد. در واقع در صورتی دو ماژول content coupling دارند که یک ماژول به درون (بخش private یا داخلی) ماژول دیگری ارجاع دهد. مثالهای این نوع coupling عبارتند از:
- ماژول A اجرای خود را به درون ماژول B انشعاب میدهد مثلا با GOTO کنترل را به جایی میان B میفرستد.
- ماژول A داده شخصی و درونی B را تغییر میدهد.
- ماژول A یکی از عبارات B را در کد آن تغییر میدهد.
خوشبختانه زبانهای برنامهنویسی سطح بالا انجام چنین کارهایی را دشوار کردهاند اما در زبانهای مثل assembly یا سی هنوز امکان آن وجود دارد.
یکی از دلایل به وجود آوردن این سطح از coupling گفته میشود که به خاطر بهینهسازی است که البته در صورتی که تمام راههای دیگر برای رسیدن به کارایی مورد نیاز در برنامه به بنبست بخورد شاید بتوان به آن فکر کرد چرا که شاید این بهینهسازی انقدر ارزش این را نداشته باشد که قابلیت پشتیبانی از نرمافزار و تغییر در آن را سخت و غیر ممکن کنید.
High
common coupling یا global coupling
وقتی دو یا چند تابع داده global مشترکی استفاده میکنند، هر تغییری در آنها میتواند تاثیر در دیگری بگذارد. این مساله در نمودارهای DFD در دادههایی که لازم است در بخشهای مختلف فرآیند به اشتراک گذاشته شود ممکن است پدیدار شود.
Moderate
control coupling
دو ماژول A و B گفته میشود که control coupling دارند اگر یکی (A) به دیگری (B) قطعهای از اطلاعات دهد که بخواهد با آن منطق دیگری را کنترل کند. اغلب این اطلاعات دادهای است که برای عبارات case یا if-then یا حلقه while در ماژول B مورد استفاده قرار میگیرند.
External coupling
دو یا تعداد بیشتر ماژول را گوییم external coupling دارند در صورتیکه به یک وسیله خارجی یکسان هردو دسترسی داشته باشند و به نوعی همبستگی به یک محیط یا نرمافزار خارجی مشترک داشته باشند.
Low
stamp coupling یا data structure coupling
این حالت یک حالت خاص از data coupling است پس میتوانید ابتدا آن را بخوانید.
دو ماژول stamp coupling دارند اگر یکی به دیگری مستقیما یک داده مرکب (که دارای ساختار بامعنی است) را بدهد مثل یک رکورد، آرایه یا اشارهگری به لیست یا درخت.
data coupling
دو ماژول data coupling دارند در صورتی که یکی دیگری را مستقیما فراخوانی کرده و با استفاده از پارامترها (مجموعهای از ورودیها و خروجیها) با هم ارتباط داشته باشند که هر پارامتر یک تکه داده ساده مثل integer، floot و boolean و … باشد. در صورتی که این پارامترها داده مرکب باشند گوییم stamp coupling وجود دارد.
در حالت ایدهآل این سطح از coupling یک سطح معمول از تعاملات بین ماژولهایی است که نیاز به تعامل دارند. ماژولهایی با سطوح بالاتر از coupling تنها در صورت لزوم استفاده میشوند.
Lowest
message coupling
ماژول A و B پایین ترین سطح coupling را دارند در صورتیکه اصلا ارتباط مستقیمی بین آنها وجود نداشته باشد و به وسیله یک داده مشترک یا وسیله خارجی هم به هم مرتبط نشده باشند.
این حالت ایدهآلترین حالت است چرا که نشان میدهد که A و B میتوانند کاملا مستقل پیادهسازی، تست و نگهداری شوند و هیچ کدام بر رفتار دیگری تاثیری نمیگذارد.
البته مسلما در هر سیستم منطقی نیاز به سطحی از تعاملات بین ماژولها وجود دارد.
حال که با مفهوم coupling آشنا شدید یک معادل فارسی خوب برای آن پیشنهاد کنید. وابستگی؟ ارتباط؟ اتصال؟ پیوند؟
شما هم با معضلات coupling بالای یک کد روبرو شدهاید؟
منابع: