جفتگری (دانش رایانه)

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

در دانش رایانه جفتگری (به انگلیسی: Coupling) یاوابستگی (به انگلیسی: Dependancy) به میزان اتکای یک ماژول از برنامه به سایر ماژولها گفته می‌شود.

جفتگری عموماً با چسبندگی در تقابل است. جفتگری ضعیف معمولاً با چسبندگی زیاد همراه می‌شود و بالعکس. این دو مشخصه به عنوان معیارهای اندازه گیری کیفیت نرم‌افزار، توسط لری کنستانتین، از توسعه دهندگان اصلی طراحی ساختاریافته[۱] ابداع شدند. غالباً جفتگری ضعیف نشانهٔ یک طراحی خوب و یک سیستم خوش ساختار است واگر با چسبندگی بالا همراه شود خوانایی و قابلیت نگهداری سیستم افزایش می‌یابد.

جفتگری را می‌توان نقطه مقابل چسبندگی (Cohesion) دانست. جفتگری کم اغلب با چسبندگی زیاد متناظر است و بالعکس. چسبندگی و جفتگری به عنوان معیارهای اندازه گیری کیفیت نرم‌افزار توسط لری کنستانتین، یکی از توسعه دهنگان اصلی طراحی ساختاریافته،[۲] که از طرفداران اولیه این مفاهیم بود ابداع شد. جفتگری ضعیف غالباً نشانهٔ یک سیستم رایانه‌ای خوش ساخت و یک طراحی خوب است و اگر با چسبندگی بالا نیز همراه شود، باعث افزایش خوانایی و قابلیت نگهداری می‌شود.

انواع جفتگری در زبان‌های ساخت‌یافته[ویرایش]

مدل مفهومی جفتگری

جفتگری ممکن است زیاد (جفتگری قوی یا سفت) و یا کم (جفتگری ضعیف یا شل) باشد. برخی از انواع جفتگری به ترتیب نزولی از بیشترین تا کمترین میزان جفتگری عبارتند از:

جفتگری محتوا(Content Coupling)
در این نوع جفتگری یک ماژول از برنامه به جزئیات داخلی یک ماژول دیگر وابسته است و یا آن را تغییر می‌دهد.(مثلاً دسترسی به داده‌های محلی یک ماژول دیگر)
جفتگری مشترک (Common Coupling)
زمانی است که دو ماژول یک داده سراسری (مانند یک متغیر سراسری) را به اشتراک می‌گذارند.
جفتگری بیرونی(External Coupling)
زمانی رخ می‌دهد که دو ماژول به طور مشترک از یک پروتکل ارتباطی یا فرمت داده‌ای و مشابه آنها که از یک منبع بیرونی به سیستم تحمیل می‌شود استفاده می‌کنند.
جفتگری کنترلی(Control Coupling)
وقتی است که یک ماژول روند اجرای یک ماژول دیگر را از طریق ارسال اطلاعات مربوط به کاری که باید انجام شود کنترل می‌کند.
جفتگری ساختار داده(Data Structured Coupling)
وقتی که دو ماژول از یک ساختار داده‌ای مشترک استفاده می‌کنند اما هرکدام تنها به بخشی از آن نیاز دارند.
جفتگری پیام(Message Coupling)
ضعیفترین نوع جفتگری است که در آن ماژولها به یکدیگر وابسته نیستند بلکه تنها با استفاده از یک واسط عمومی به تبادل پیام‌های بدون پارامتر می‌پردازند.

استاندارد مؤسسه مهندسان برق و الکترونیک[ویرایش]

این استاندارد توسط مؤسسه مهندسان برق و الکترونیک ارایه شده و مشتمل بر ۶ جفتگری است این استاندارد تا حد زیاد با آنچه گلنفورد مِیِرز در سال ۱۹۷۴ ارایه داده شباهت دارد ولی تفاوت‌های نیز وجود دارد.

  • جفتگیری عِلی (Pathlogical Coupling): دو ماژول از طریق دادهٔ مشترک با یکدیگر به ارتباط می‌پردازند.
  • جفتگیری مشترک (Common couplin): یک ماژول محتوی ارجاعی به ماژول دیگر باشد. این رابطه می‌تواند در قالب رابطهٔ بخشی-از (part-of) و ارث‌بری رخ دهد.
  • جفتگیری ترکیبی (Hybrid Coupling): پارامتری که همزمان به عنوان داده و نیز کنترل کنندهٔ جریان عمل می‌نماید. برای مثال ارسال عدد صفر به صورتی که داده است و اعلام می‌نماید که پیغام فرستاده شده قابل درک نیست.
  • جفتگیری محیط مشترک (Common-Enviroment Coupling): از طریق دادهٔ مشترک با یکدیگر ارتباط برقرار می‌نمایند.
  • جفتگیری داده‌ای (Data copling): از طریق یک دادهٔ ساده ماژول‌ها ارتباط برقرار می‌نمایند.
  • جفتگیری کنترلی (Control Coupling): ماژول تاثیری در کنترل ماژول دیگری از طریق ارسال داده به هر نحو داراست.[۳]

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

جفتگری در زبان‌های شی‌ءگرا[ویرایش]

نورمن فنتون در کتاب «متریک‌های نرم‌افزاری: رویکردی سخت‌گیرانه و عملی»[۴] متریک نرم‌افزاری را به صورتِ:«در حقیقت متریک نرم‌افزاری عبارتی بنیادی برای توصیف دامنه‌ٔ وسیعی از فعالیتهای اندازه‌گیری است. این فعالیت‌ها از استخراج مشخصه‌هایی است که ویژگی‌های کدِ نرمافزار (تعریف کلاسیک «متریک» در نرم‌افزار) تا مدلهایی برای پیشبینی منابعِ لازم برای نرم‌افزار و کیفیت آن را در بر می‌گیرند. این موضوع همچنین شامل جنبه‌هایی از کنترل کیفیت و ضمانت است که پوشش دهنده‌ٔ فعالیت‌هایی از قبیل یافتن نقایص در طول توسعه و آزمایش است».[۵]همچنین وی درباره‌ٔ این موضوع که نباید به سرعت به دنبال انتزاعی کردن تعریف پیش رفت نیز گفته است:«...برای ایجاد نگاشت (ریاضی) تعجیل کرده و سپس اعداد را دستکاری می‌نماییم...» [۶].

با ارایه زبان‌های شیءگرا و ارایه ویژگی‌های آن از سوی «گریدی بوش»[۷] ویژگی‌های زبان‌های شی‌ءگرا بر شمرد. کلاس و شیء دو گونه‌‌ٔ جدید بود که دربرابر ساختارهای قدیمی قرار می‌گرفت. «شیام چیدامبر» و «کریس کمرر» چارچوبی را برای اندازه‌گیری کیفیت ارایه نمودند. این چارچوب شامل چندین متریک بود که هر یک یکی از وجوه نرم‌افزار را اندازه‌گیری می‌کرد. [۸]این چارچوبی یکی از اولین تلاش‌های در این زمینه بود.

نام متریک مخفف توصیف
کاپلینگ بین اشیاء CBO شیئ از کلاس استفاده کند یا مورد استفاده قرار گیرد
ارسال پیام RFC تعداد متدهایی که به صورت مستقیم فراخوان شدهاست
عمق درخت ارثبری DIT تعداد کلاس‌هایی که از کلاس مورد نظر به نحوی ارثبری کرده‌اند
متدهای وزن‌دار WMPC تعداد متدهای موجود در کلاس (شمارش براساس وزن‌دهی)

این متریک مورد انتقاد‌های زیادی قرار گرفت. «مارتین هیتز» و «بهزاد منتظری» نسبت به روش شمارش آن نقد داشتند [۹]. همچنین «تریسی هال» و «توبیاس میر» متریک‌های ارائه شده توسط چیدامبر را بدون منطق و کارایی خطاب کردند.[۱۰]. «هیتز» و «منتظری» چارچوبی جدید را ارائه کردند. ويژگی چارچوب آن‌ها پوشش دو موضوع ارایه شده توسط زبان‌های شی‌گرا بود. آن‌ها میان «شیء» و «کلاس» تفاوت قايل شدند و برای هریک متریکی جداگانه را پوشش دادند. هر دو متریک چدامبر-کمرر و هیتز-منتظری از نوع اعداد ترتیبی بودند. اما روش چیدامبر-کمرر به هیچ وجه اصول اعداد ترتیبی را رعایت نمی‌کرد که منجر به عدم عملیاتی شدن آن می‌گردد[۱۱]. تد فیسون از جهت دیگری به مسالهٔ جفتگری نگاه نموده و آن را از دو جهت بررسی نموده: «ذات» و «گونه». از لطاظ ذات، جفتگری به دو بخش ایستا و پویا تقسیم می‌گردد. در بخش ایستا، تا زمانی که تمام ماژول‌ها فراهم نباشد اصولاً برنامه قادر به کامپایل شدن نمی‌باشد. ذات پویا نیز خواستار کد اجرایی برنامه در حین اجراست.[۱۲]

از نظر گونه به سه زیر دستهٔ «جفتگری براساس گونه»، «جفتگری منطقی» و نیز «جفتگری براساس امضا» تقسیم می‌شوند.

نوع جفتگری زیر مجموعه شرح ذات مثال
منطقی الگوریتم دو ماژول براساس یک الگوریتم و به صورت غیر مستقیم با یکدیگر در ارتباط هستند، در صورت تغییر یک از آن‌ها دیگری نیز باید تغییر نماید پویا خواندن/نوشتن، رمزنگاری/رمزگشایی
لیترال دو ماژول بر روی داده‌هایی کار می‌نمایند که مستقیماً بین آن‌ها تبادل نمی‌شود اما ترتیب آن‌ها از نظر مفهومی بسیار مهم است و هر گونه تغییر در یکی منجر به ساقط اعتبار شدن فهم ماژول دیگر در فهم داده می‌شود پویا ارسال یک آرایه شامل نام و سال
گونه غیرمبهم ایجاد یک شی از کلاسی دیگر در همان ماژول یا ماژول متفاوت پویا ایجاد شی با استفاده از عملگر new در سی++
مبهم کلاسی محتوی یک ارجاع به شی دیگر بدون ایجاد مستقیم آن پویا دریافت ارجاع به شی از طریق پارمتری در یکی از متدها کلاس جاری
K کلاسی محتوی یک دادهٔ ثابت از کلاس دیگری باشد ایستا/پویا کامپایلر در نوع ایستا قادر به کشف و حذف آن است
سکو با فراخوانی هریک از کلاس‌های پایهٔ سکوی اجرای برنامه، برنامه/ماژول/کلاس به سکوی اجرایش جفت می‌گردد که قابل حذف و تعدیل نمی‌باشد پویا مثل cout<<"hello!" در سی++
امضا ندارد در این نوع جفت‌گری، به جای کلاس یا ماژول، دو متد از اشیا به یکدیگر جفت می‌شوند. این دو شی اطلاعی از وجود یکدیگر ندارند و توسط توسعه‌گر ثالث و با استفاده از یکسان بودن امضای دو متد صورت می‌گیرد پویا استفاده از delegate در C# و mirror در جاوا


منابع[ویرایش]

  1. W. Stevens, G. Myers, L. Constantine, "Structured Design", IBM Systems Journal, 13 (2), 115-139, 1974.
  2. W. Stevens, G. Myers, L. Constantine, "طراحی ساختار یافته"، مجله سیستمهای آی بی ام، ۱۳ (۲), ۱۱۵-۱۳۹, ۱۹۷۴.
  3. «استاندراد ۶۱۰-۱۲-۱۹۹۰: واژهه‌نامه مهندسی نرم‌افزار» (پی‌دی‌اف). بازبینی‌شده در ۱۴ آوریل ۲۰۱۲. 
  4. فنتون، نورمن. Software metrics: a rigorous and practical approach. PWS Publishing Co.، ۱۹۹۸. 
  5. فنتون و مارتین نیل: متریک‌نرم‌افزار-نقشه‌ٔ راه. صفحه ۲ و ۳.
  6. فنتون و مارتین نیل: متریک نرمذافزاری:رویکرد سخت‌گیرانه و عملی، صفحه‌ٔ ۳۷
  7. Booch، Grady. . Object-oriented Analysis and Design with Applications. Benjamin-Cummings، ۱۹۹۴. 
  8. چیدامبر و کمرر. «A Metric suit for Object oreinted Design». بازبینی‌شده در ۲۰ اسفند ۱۳۹۲. 
  9. «Chidamber & Kemerer's Metrics Suite:A Measurement Theory Perspective». بازبینی‌شده در ۲۰ اسفند ۱۲۹۳. 
  10. تریسی هال و توبیاس میر. [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.6306&rep=rep1&type=pdf «A Critical Analysis of Current OO Design Metrics»]. بازبینی‌شده در ۲۰ اسفند ۱۳۹۲. 
  11. لیونل برایاند و همکارانش. «A unified framework for coupling measurement in object-oriented systems». بازبینی‌شده در ۲۰ اسفند ۱۳۹۲. 
  12. فیسون، تد. «Event-Based Programming: Taking Events to the Limit». [برنامه‌نویسی رویدادگرا: حدنهایی رویدادگرایی]. ای‌پرس APress، ۲۰۰۶. شابک ‎۲-۶۴۳-۵۹۰۵۹-۱-۹۷۸.