نمودار ۲۲: قیاس نتیجه «معیار F» در دستهبندی بر روی کل دادهها ۶۶
نمودار ۲۳: قیاس نتیجه «منحنی مشخصه عملکرد» در دستهبندی بر روی کل دادهها ۶۷
نمودار ۲۴: قیاس نتیجه «کاپا» در دستهبندی بر روی کل دادهها ۶۷
نمودار ۲۵: قیاس نتیجه «انحراف معیار» در دستهبندی بر روی کل دادهها ۶۸
۱-مقدمه:
یکی چالش بر انگیزترین موضوعات مطرح در تضمین کیفیت[۱]، در شرکتهای سازنده نرم افزار، موضوع رفع خطاهای نرم افزار است. خطاهای نرم افزاری میتوانند در زمان پیش و یا پس از انتشار[۲] نرم افزار تشخیص داده شوند. اما منابعی که میتوان برای تشخیص و تصحیح خطاها در نظر گرفت محدود است (Kamyabi et al.).
خطاها را میتوان به دو دسته کلی تقسیم کرد. خطاهای نحوی[۳] و خطاهای مفهومی[۴]. با توجه بهاین که ابزارهای خودکار بسیار قدرتمندی برای تشخیص خطاهای نحوی وجود دارند، احتمالاین که خطایی ازاین دست تا زمان انتشار تشخیص داده نشود، بسیار کم است. خطاهای مفهومی به آن دسته از خطاها اشاره دارد که در اثر مشکلاتی جدای از اشتباهات نحوی و خطاهای انسانی ملموس اتفاق میافتند و معمولاً در اثر عدم هماهنگی در بخشهای مختلف کد و گاهی به صورت بسیار ناملموس به وجود میآیند که در اینجا به سادگی نمیتوان با بررسی کد، اینگونه خطاها را تشخیص داد. بنا بر این در مورد خطاهای مفهومی داستان فرق میکند چرا که عوامل بسیار زیادی میتوانند در بروزاینگونه از خطاها دخیل باشند. (Zimmermann & Nagappan, 2008) بنا براین همواره سعی شده است که با اندازه گیری معیارهای[۵] مختلف و استفاده از آن ها در روشهای پیشبینی خودکار خطا، سرعت و دقت را در امر تست نرم افزار افزایش دهند. طی تحقیقاتی که تا کنون صورت گرفته، متداولترین معیارهای استفاده شده در پیشبینی اتوماتیک خطا، معیارهای پیچیدگی[۶] است. (Zimmermann & Nagappan, 2008) اما جدیدترین روشی که مطرح شده است، مسأله مربوط به وابستگیهای بین کلاسها[۷] و همچنین بین ماژولها میباشد. انواع وابستگیها میتوانند بین دو کلاس و یا دو ماژول[۸] مطرح شوند که تحقیقات نشان داده است که این وابستگیها ارتباط بسیار زیادی با وجود خطاهای مفهومی دارند.
برای اجرای روشمند و علمی روند یافتن روابط و الگوهای مناسب برای پیش بینی خطا بر اساس معیارهای قابل اندازه گیری، از مفهومی به نام دادهکاوی استفاده خواهیم کرد که در تشریح و بیان مسأله به آن خواهیم پرداخت.
دراین پایان نامه، سعی میکنیم که به بررسی چنین وابستگیهایی بپردازیم و بر اساس روابط موجود بین وابستگی و وجود خطا در نرم افزار، وجود خطا در کد را پیش بینی نماییم.
در ادامه این رساله در بخش دوم به بررسی تحقیقات قبلی انجام شده در این زمینه میپردازیم، در بخش سوم به بیان انگیزش و نحوه به وجود آمدن ایده کار شده در این رساله میپردازیم، در بخش چهارم فرضیات مورد بررسی را مطرح میکنیم، در بخش پنجم دادهها و ابزارهای جمع آوری شده برای انجام عملی آزمایشات را معرفی میکنیم، در بخش ششم به بیان شیوه و نوع آزمایشات و بیان نتایج آنالیزها و نتایج میپردازیم و در بخش هفتم و پایانی این رساله سعی در نتیجهگیری از آزمایشات انجام شده خواهیم داشت.
۲- پیشینه پژوهشی:
تلاشهای گذشته با هدف پیشبینی خطا را در سه گروه مورد بررسی قرار میدهیم: معیارهای نرمافزار[۹]، معیارهای وابستگی[۱۰] و معیارهای تاریخی[۱۱]. ابتدا به بیان توضیحی در مورد شیوه کار کردن این معیارها میپردازیم.
۲-۱ معیارهای نرمافزار:
معیارهای نرمافزار برای اندازهگیری درجه پیشرفته بودن یک محصول و یا یک فرایند نرمافزاری به کار میروند. معیارهای نرمافزاری به چندین گروه تقسیم میشوند: معیارهای محصول[۱۲]، معیارهای فرایند[۱۳]، معیارهای پروژه[۱۴] و معیارهای منبع[۱۵]. معیارهای نرمافزاری که در پیشبینی خطا به کار میروند معیارهای محصول میباشند که از مشخصات کد سیستم نرمافزاری استخراج میشوند. این معیارها به سه گروه تقسیم میشوند: معیارهای اندازه[۱۶]، معیارهای پیچیدگی[۱۷] و معیارهای کیفیت[۱۸]. (Mills, 1988) معیارهای اندازه بر اساس تعداد خطوط کد برنامه محاسبه میشوند مانند تعداد کل خطوط برنامه[۱۹]، تعداد خطوط توضیحات[۲۰] و … معیارهای میزان نگهداشتپذیری[۲۱] و قابلیت تست برنامه وابسته است از جمله معروفترین معیارهای پیچیدگی معیارهای پیچیدگی مک کیب[۲۲] و معیارهای هالستد[۲۳] میباشند. معیارهای مککیب پیچیدگی کد را بر اساس تعداد مسیرهای کنترلی محاسبه می کند. (McCabe, 1976) هالستد معیارهای خود را بر اساس ارتباطات ریاضی بین اجزای کد، پیچیدگی کد و نوع زبان برنامه نویسی مطرح کرد. (Halstead M. H., 1975) معیارهای اتصال[۲۴] و پیوستگی[۲۵] از معروفترین معیارهای کیفیت میباشند که بالا و یا پایین بودن اندازه این دو معیار نشان دهنده کیفیت محصول و یا فرایند نرمافزاری است. (Pressman, 1982) معیارهای کیفیت معیارهایی میباشند که درجه آن ها میتواند تولیدکنندگان نرمافزار را در مورد توانایی دست کار کردن سیستمشان مطمئن سازد.
معیارهای وابستگی:
معیارهای وابستگی معیارهایی هستند که بر اساس ارتباط اجزای کد نرمافزار محاسبه میشوند. این ارتباط میتواند بین سطوح مختلف کد مطرح شود مانند سطح فایل، کلاس، تابع … نوع ارتباط و یا به عبارت دیگر وابستگی موجود بین اجزای کد نیز میتواند متفاوت باشد مانند وابستگی داده[۲۶] که بر اساس تعریف و استفاده از داده میباشد و یا وابستگی صدا زدن[۲۷] که بر اساس تعریف و صدا زدن مؤلفهها میباشد. (Zimmermann, 2008 & Nagappan )
معیارهای تاریخی:
این دسته از معیارهای بر اساس تغییراتی که در بین چندین انتشار[۲۸] مختلف از یک سیستم نرمافزاری رخ میدهد تعریف میشوند. این تغییرات میتوانند اضافه شدن، حذف شدن، تغییر یافتن مؤلفههای جز مربوطه در بین چندین انتشار باشند. محدودیتی که در به کار بردن این معیارها وجود دارد این است که محاسبه این معیارهای تنها برای محصولات نرمافزاری مقدور میباشد که دارای چندین انتشار باشند و همچنین اطلاعات کامل در مورد انتشارات قبلی موجود باشد.
بررسی فعالیتهای گذشته:
در ادامه به بررسی تلاشهای گذشته در زمینه پیشبینی خطا میپردازیم.
۲-۳-۱- بررسی فعالیتها در زمینه معیارهای کد :
در اولین مطالعات در زمینه پیشبینی خطا، آکیاما در سال ۱۹۷۱ بر روی یک سیستم که در فوجیتسو ژاپن توسعه یافته بود کار کرد و نشان داد معیارهای پیچیدگی نرمافزار و معیارهای اندازه نرمافزار در پیشبینی خطا موفق عمل مینمایند. (Akiyama, 1971) فردینند در سال ۱۹۷۴ ارتباط تعداد خطا با تعداد اجزای کد را بررسی نمود و به این نتیجه رسید که تعداد اجزای کد با تعداد خطا در ارتباط است. (Ferdinand A. , 1974) در سال ۱۹۷۵ هالستد معیارهای نرمافزاری را ارائه داد که بر اساس پیچیدگی زبان برنامهنویسی عمل مینمودند. هالستد از این معیارها برای پیشبینی خطا استفاده کرد و نشان داد معیارهای پیچیدگی هالستد در پیشبینی خطا موفق عمل مینمایند. این معیارها با نام معیارهای هالستد شناخته میشوند. (Halstead M. H., 1975) چیدمبر و کمرر در سال ۱۹۹۴ بر روی سیستمهای شی گرا کار کردند و شش معیار طراحی برای این نوع سیستم معرفی کردند. این معیارها با نام معیارهای طراحی چیدمبر و کمرر شناخته میشوند. (Chidamber & Kemerer, 1994) باسیلی در سال ۱۹۹۶ از معیارهای چیدمبر و کمرر به منظور پیشبینی خطا استفاده نمود و نشان داد معیارهای چیدمبر و کمرر عملکرد موفقی در پیشبینی خطا دارند. (Basili et al., 1996) در سال ۱۹۹۶ اوهلسون و آلبرگ معیارهای پیچیدگی را به منظور پیشبینی ماژولهای از کد به کار بردند که در طول اجرا دچار خطا میشدند. مدل پیش گویی کننده آن ها ۲۰ درصد از ماژولهایی از کد را شناسایی میکرد که شامل ۴۷ درصد از کل خطاها بودند. (Ohlsson & Alberg, 1996) زائو در سال ۱۹۹۸ به بررسی معیارهای طراحی نرمافزار پرداخت و عملکرد آن ها در پیشبینی خطا را محاسبه نمود. زائو نشان داد که معیارهای طراحی به خوبی در پیشبینی خطا عمل مینمایند. (Zhao M. et al., 1998) در سال ۲۰۰۶، ناپاگان معیارهایی برای پیشبینی خطاهای پس از زمان انتشار شناسایی را کرد و گزارش مبنی بر اینکه چگونه به طور سیستماتیک پیشبینی کنندههای خطاهای پس از زمان انتشار بر اساس تاریخچه[۲۹] ساخته شوند، را ارائه داد. (Nagappan et a., 2006) شروتر، زیمرمن و زلر در سال ۲۰۰۶ با بهره گرفتن از مهندسی معکوس[۳۰] نشان دادند معیارهای طراحی در پیشبینی خطاهای پس از اجرا موفق عمل مینمایند (Schröter et al., 2006) منزیس در سال ۲۰۰۷ با کار بر روی چند پروژه و با بهره گرفتن از معیارهای نرمافزار مدل پیشبینی خطایی طراحی نمود که توانست ۷۱ درصد از کل خطاهای برنامه را با نرخ خطای ۲۵ درصد شناسایی نماید (Menzies et al., 2007) در سال ۲۰۰۸ جیانگ کارکرد معیارهای سطح کد[۳۱] و معیارهای سطح طراحی[۳۲] را بر روی ۱۳ محصول نرمافزاری با یک دیگر مقایسه نمود. نتایج حاکی از عملکرد بهتر معیارهای سطح طراحی نسبت به معیارهای سطح کد و ترکیب دو گروه معیار در پیشبینی خطا بود. (Jiang et al, 2008) در سال ۲۰۱۰ منزیس و گروهی دیگر با تلاشهای گذشته نشان دادند که معیارهای کد معیارهای موفقی در پیشبینی کد هستند و این معیارها را به عنوان معیارهای با استفاده راحت و مفید معرفی نمودند. (Menzies et al., 2010) در مطالعهای که بر روی چندین پروژه عظیم نرمافزاری در ترکیه انجام (Menzies et al., 2010)، مدل پیشبینی کننده که بر اساس معیارهای کد عمل مینمود را از طریق طبقه بندی نایو بیز[۳۳] اصلاح نموده و به بهبود ۸ درصدی نسبت به گذشته دست یافتند. در یکی از تحقیقاتی که در سال ۲۰۱۰ بر روی پروژههای متن باز[۳۴] صورت گرفت توانایی معیارهای اندازهگیری متن با طبقه بندی نایو بیز و معیارهای پیچیدگی با آنالیز رگرسیون[۳۵] در پیشبینی خطاهای نرمافزار مورد مقایسه قرار گرفتند. این پژوهش نشان داد معیار اندازه گیری متن از فراخوانی[۳۶] بالاتر و معیار پیچیدگی از دقت[۳۷] بالاتری برخوردار هستند. (Hideaki & Osamu, 2010) معیارهای طراحی معیارهای موفقی در پیشبینی خطا هستند اما در بسیاری از پروژههای نرمافزاری معیارهای سطح کد موجود نیستند از اینرو سامی و فخراحمد در سال ۲۰۱۰ معیارهای طراحی را بر اساس معیارهای کد تخمین زدند که این معیارها با معیارهای واقعی سطح طراحی تفاوت اندکی دارند. (Sami & Fakhrahmad, 2010)
۲-۳-۲- بررسی فعالیتها در زمینه معیارهای تاریخی:
خوش گفتار در سال ۱۹۹۶ بر روی دو سیستم بزرگ ارتباطی کار کرد و در مدل پیش بینی خود ماژولهایی را به عنوان ماژول معیوب پیشبینی نمود که تعداد خطوط کد آن در انتشارهای مختلف تغییر میکند. (McMullan et al., 1996) هودپل (Hudepohl et al., 1996) توانست با بهره گرفتن از ترکیب معیارهای پیچیدگی و دادههای تاریخی پیشبینی نماید آیا یک ماژول دارای خطا میباشد یا خیر. در این تحقیق همانگونه که از اطلاعات با استفاده مجدد[۳۸]، استفاده شد معیارهای طراحی نرمافزار نیز در پیشبینی خطا مورد استفاده قرار گرفت با این فرض که ماژولهای جدید و یا تغییر یافته چگالی خطای بالاتری دارند. گریوز با بهره گرفتن از یک سیستم بسیار بزرگ و با طول عمر طولانی، نشان داد که معیارها بر اساس اطلاعات تاریخی بهتر از معیارهای پیچیدگی کد عمل مینمایند. (Graves T. L et al., 2000) در سال ۲۰۰۴ اوستراند در ادامه مطالعات خود از اطلاعات وضعیتی فایلهای برنامه که در طول انتشارهای مختلف تغییر میکند مانند تعداد خطوط اضافه شده، حذف شده و تغییر یافته در فایلها برای پیشبینی تعداد خطاهای برنامه استفاده نمود. (Ostrand et al., 2004) این مدل پیشگویی کننده برای یافتن خطا چه در مرحله توسعه و چه در مراحل پایانی پروژه از دقت بالایی برخوردار بود. اوستراند در سال ۲۰۰۵ مطالعات خود را بر اساس اطلاعات تاریخی بر روی ۲ سیستم نرمافزاری بزرگ تا ۱۷ انتشار برای پیشبینی فایلهایی با بالاترین چگالی خطا انجام داد. (Ostrand et al., 2005) مدل پیشبینی کننده خطاها ۲۰ درصد از کل فایلهای ۲ سیستم نرمافزاری را به عنوان فایلهای حاوی خطا پیشبینی کرد و موفق به شناسایی ۷۱ درصد و ۹۲ درصد از کل خطاها شد. زیمرمن در سال ۲۰۰۵ یکی از بزرگترین تحقیقات را بر روی اطلاعات تاریخی سیستمهای نرمافزاری انجام داد. (Zimmermann et al., 2005). او بر روی اطلاعات تاریخی ۸ سیستم بزرگ کار کرد تا بتواند محلی که تغییرات بعدی در انتشار بعدی رخ میدهد را پیشبینی کند. در این تحقیق او توانست محل تغییرات در آینده را با احتمال ۷۰% به درستی تشخیص دهد. در سال ۲۰۰۵ نگاپان و بال با کار بر روی ویندوز سرور ۲۰۰۳، از تغییرات کد برای پیشبینی زود هنگام چگالی خطا در سیستمهای نرمافزاری استفاده نمودند. (Ball & naggapan, 2005) آن ها نشان دادند که معیارهای مطلق تغییرات کد در پیشبینی چگالی خطا ضعیف عمل میکند در صورتی که معیارهای نسبی تغییرات کد که توسط آن ها مطرح شد توانست با دقت ۸۹% بالاترین چگالی خطا را شناسایی نماید. آن ها نشان دادند افزایش معیار نسبی تغییرات با افزایش چگالی خطا توأم است و همچنین معیار نسبی تغییرات علاوه بر چگالی در شناسایی اجزای معیوب نیز موفق است. آن ها همچنین بیان کردند که تغییرات در کد و وابستگی به کدهای تغییر داده شده میتواند باعث بروز خطاهای پس از زمان انتشار شود. این پیشبینی به کمک معیارهای پیچیدگی نظیر سایز اجزای کد و اندازه موقتی[۳۹] کد تغییر یافته صورت گرفت. در سال ۲۰۰۶ تحقیقی بر روی ویندوز ایکس پی- سرویس پک ۱[۴۰] و ویندوز سرور ۲۰۰۳ صورت گرفت. در این تحقیق نشان داده شد که معیارهایی که بر اساس اطلاعات تاریخی در سطح پروژه و محصول عمل مینمایند معیارهای مناسبی برای پیشبینی خطاهای پس از زمان اجرا هستند و همچنین کارایی این متریکها در سطح پروژههای بسیار بزرگ نیز نشان داده شد. (Nagappan et al., 2006).
۲-۳-۳- بررسی فعالیتها در زمینه معیارهای وابستگی:
در سال ۱۹۸۱ هنری و کافورا معیارهایی تحت عنوان معیار ورودی[۴۱] و معیار خروجی مطرح کردند. معیارهای ورودی تعداد ماژولهایی است که یک ماژول خاص را صدا میزنند و معیار خروجی تعداد ماژولهایی است که توسط یک ماژول خاص صدا زده میشوند. هنری و کافورا از این دو معیار برای محاسبه پیچیدگی کد استفاده نمودند و نشان دادند اجزایی از کد که دارای معیار ورودی و معیار خروجی بزرگی باشند دارای طراحی ضعیفی هستند. (Kafura & Henry, 1981) در سال ۱۹۸۹ سلبی و پورتر با بهره گرفتن از یک الگوریتم بازگشتی درختهای دستهبندی[۴۲] استخراج کردند که گرههای آن ها تابعهای چند ارزشی بر اساس معیارهای کد هستند. هدف از تشکیل این درختها شناسایی اجزای معیوب کد بود. سلبی و پورتر بر روی ۱۶ پروژهی ناسا کار کردند و موفق به شناسایی ۷۹٫۳% از کل اجزای معیوب شدند. (Porter & Selby, 1989) پدولسکی و کلارک در سال ۱۹۹۰ یک مدل رسمی بر اساس وابستگیهای برنامه ارائه کردند. این وابستگیها بر اساس ارتباط دو قسمت متن کد برنامه استخراج میشود. (Clarke & Pogdurski, 1990) در سال ۱۹۹۸ بینکلی و اسکاچ بر روی خطاهای زمان اجرا کار کردند و همچنین معیارهای وابستگی متصل[۴۳] را مطرح کردند. .آن ها کار خود را بر روی ۴ پروژه به زبانهای جاوا[۴۴]، کوبول[۴۵]، سی[۴۶] و سی پلاس پلاس[۴۷] بررسی نمودند. تحقیقات آن ها حاکی بر موفقیت آمیز بودن این معیارها در کیفیت طراحی نرمافزار بود. آن ها نشان دادند معیار وابستگی متصل در مقایسه با معیارهای متقابل[۴۸] عملکرد بسیار بهتری در پیشبینی خطاهای زمان اجرا[۴۹] دارند. (Binkley & Schach, 1998) بیون و وایتهد در سال ۲۰۰۳ گراف وابستگی و دادههای تاریخی را برای شناسایی ناپایداریهای برنامه ترکیب نمودند. (Bevan & Whitehead, 2003) پینگر در بر اساس اطلاعاتی که از سیر تکاملی و اطلاعات تاریخی پروژههای نرمافزاری بدست آورد پیوستگیهای تصادفی بین اجزای کد مشاهده کرد که ممکن بود در آینده منجر به بروز خطا شوند. (Pinzger et al., 2005) شروتر در سال ۲۰۰۶ نشان داد که وابستگیهای ورودی واقعی میتواند خطاهای را شناسایی کند و وابستگیهای ورودی کامپایلر از وابستگیهای ورودی واسط کاربر احتمال خطای بالاتری را ایجاد میکند (Schröter & Zeller, 2006) در یکی از تلاشهای تیم مایکروسافت نشان داده شد تغییرات کد و وابستگیها میتواند معیار موثری در شناسایی خطاهای پس از انتشار باشد. (Nagappan & Ball, 2007) ایدهی آن ها این بود که اگر جز A در کد برنامه وابستگی زیادی به جز دیگری مانند B داشته باشد و جز B در طول انتشارات مختلف تغییر بکند جز A برای هماهنگ بودن با جز B نیازمند تغییراتی میباشد این تغییرات معمولاً در طول وابستگیها منتشر میشود. نگاپان و بال در این پژوهش بر روی ویندوز سرور ۲۰۰۳ نشان دادند درجه بالای وابستگی در کنار تغییرات کد میتواند باعث انتشار خطا در سراسر یک سیستم شود. زیمرمن و نگاپان در سال ۲۰۰۷ با کار بروی گراف وابستگی زیر سیستمهای کد نشان دادند بین پیچیدگی گراف وابستگی و خطاهای پس از انتشار ارتباط بالایی وجود دارد و هنگامی مدلهایی پیشگویی بر اساس زیر سیستمهایی که در معماری بالاتر هستند ساخته میشوند بهتر عمل میکنند. (Zimmermann & Nagappan, 2007) در سال ۲۰۰۸ زیمرمن و نگاپان معیارهایی بر اساس وابستگی موجود در کد استخراج نمودند. (Zimmermann & Nagappan, 2008) این معیارها بر اساس مشاهدات آن ها از گراف وابستگی ویندوز سرور ۲۰۰۳ تعریف شده است. آن ها در بررسی گراف وابستگی ویندوز سرور ۲۰۰۳ مشاهده کردند گرههای که حالت مرکزیت دارند و یا در مش[۵۰] هایی با تعداد گرههای زیاد قرار دارند از احتمال معیوب بودن بالایی برخوردارند بر اساس این مشاهدات این تیم تحقیقاتی معیارهایی تحت عنوان معیارهای شبکه استخراج نمود و کارایی آن ها را برای پیشبینی خطا در مقایسه با معیارهای پیچیدگی کد بررسی کرد که در این مقایسه معیارهای شبکه توانستند ۶۰% از کل اجزای معیوب برنامه را شناسایی نمایند در صورتی که معیارهای پیچیدگی تنها موفق به شناسایی ۳۰% از کل خطاها شدند. در سال ۲۰۰۹ تورهان با بررسی و آزمایشاتی نشان داد که معیارهای شبکه روی برنامههای بزرگ کارایی بهتری از معیارهای پیچیدگی دارند اما در نرمافزارهایی با حجم کوچک تفاوتی میان قدرت پیشبینی خطای معیارهای شبکه و معیارهای پیچیدگی وجود ندارد. (Torhun et al. 2009).
تلاشی که در این رساله صورت گرفته است در دسته معیارهای پیوستگی جای میگیرد.
۳-درخت وابستگی:
همانطور که گفته شد جدیدترین روشی که در پیشبینی خطای نرمافزار مطرح شده است، مسأله مربوط به وابستگیهای بین کلاسها و همچنین بین ماژولها[۵۱] میباشد. انواع وابستگیها میتوانند بین دو کلاس و یا دو ماژول مطرح شوند که تحقیقات نشان داده است که این وابستگیها ارتباط بسیار زیادی با وجود خطاهای مفهومی دارند. مسألهای که در این رساله تحقیق مطرح شده است، استفاده از یک تکنیک جدید بر پایه وابستگیهای بخشهای مختلف نرم افزار در سطح کد است. در گذشته استفاده از گرافهای کنترل جریان[۵۲] متداول بوده که این گراف جریان دادهها را در هنگام اجرای برنامه مورد نظر قرار داده است و از این امر در مباحث مهندسی نرم افزار[۵۳] استفاده شده است اما، من در این طرح پیشنهادی از وابستگی کدها استفاده کردهام که بر خلاف گراف کنترل جریان، وابستگیها را در زمانی بررسی میکند که برنامه اجرا نشده است. این وابستگیها میتوانند شامل مواردی مانند وراثت، صدا زدن زیر رویهها و ماژولها و هرگونه وابستگی دیگری در کد باشند که این مسأله تنها محدود به برنامه نویسی شیء گرا نشده و میتواند برنامههای ساخت یافته را نیز پوشش بدهد چرا که در آنجا نیز ما شاهد وابستگی بین ماژولهای برنامه، توابع و رویهها هستیم.
برای بررسی این وابستگیها و روابط آن با خطاها از مفهومی به نام داده کاوی استفاده میکنیم. حال سوال این است که داده کاوی چیست؟
با پیشرفت سریع تکنولوژی و ورود فناوری اطلاعات بسیاری از حوزهها، نیاز به دادهها، افزایش روز افزونی داشت. بعد از مدت کوتاهی پایگاههای داده بسیار عظیم با حجم بسیار گستردهای از دادهها در سازمانها، ادارات و مراکز مختلف به وجود آمدند.
حال جامعه علمی میتوانند از چنین حجم گستردهای از دادهها استفاده کرده و با پردازش، تحلیل و بررسی این دادههای ذخیره شده، به روابط و اطلاعاتی دست پیدا بکنند که به هر نحوی برای سازمان و بخش مربوطه مفید واقع شود (Hand et al., 2001). ممکن است در میان حجم زیادی از دادهها، با روشهای مختلف بتوان روابط خاصی پیدا کرد که از جنبههای مختلف برای بخش مربوطه دارای اهمیت باشد. ممکن است این اهمیت دارای جنبه اقتصادی و یا افزایش کارایی سیستم باشد.
داده کاوی، علمی است که روشها و الگوریتمهای متنوعی را در اختیار ما قرار میدهد تا بتوانیم از این حجم دادهها، با کشف الگوها[۵۴] و روابط، به اطلاعات ارزشمندی دست پیدا بکنیم.
به عبارتی «علم استخراج اطلاعات ارزشمند، از مجموعه دادهها و پایگاههای داده بزرگ» به عنوان داده کاوی شناخته میشود. (Hand et al., 2001).
لری کنستانتین در سال ۱۹۷۴ مفهوم وابستگی را معرفی کرد و این مفهوم به صورت گستردهای در تحقیقات و کتابها و منابع مختلف، به صورت یک اصل در مهندسی نرمافزار مورد استفاده قرار گرفت. اما مفهوم وابستگی معرفی شده توسط کنستانتین از واژه Coupling یعنی جفتگری گرفته شده است. جفتگری همیشه به همراه مفهوم دیگری به کار برده شده است. این مفهوم، پیوستگی میباشد. قالبا جفتگری کم نشانه طراحی خوب نرمافزار است در حالی که پیوستگی کم نشان دهنده یک طراحی ضعیف میباشد. تأثیر این دو مفهوم بر یکدیگر به صورت عکس است و به گونهای که در نمودار زیر مشاهده مینمایید، با افزایش جفتگری، پیوستگی کاهش پیدا میکند. (Constantine, 1996)
نمودار ۱: ارتباط بین جفتگری و انسجام.
در واقع جفتگری معنای معمولتر خود یعنی وابستگی را به طور کامل دارا است. هرچه وابستگی در نرمافزار افزایش پیدا کند، کیفیت طراحی، به دلیل کاهش انسجام آن کاهش پیدا میکند.
حال ممکن است این سوال مطرح شود که کدام دلیل منطقی وجود دارد که باعث وجود چنین رابطهای بین وابستگی و انسجام میشود؟ شاید منطقی ترین پاسخی که بتوان برای این سوال پیدا کرد موضوع چرخش کد باشد. چرخش کد مفهومیست که با تغییر بخشهایی از کد نرمافزار به یکی از دلایل زیر اشاره دارد:
تغییر در اثر تغییر در نسخههای مختلف.
تغییر به قصد رفع خطا.
بدون نیاز به تمرکز بر دلیل تغییر، میتوان این امر منطقی را قبول کرد که اگر بخشهایی از برنامه، به هر دلیلی دچار تغییر بشوند، ممکن است هماهنگی این بخشها با بخشهای دیگر برنامه از بین برود.
شکل ۱: نمونهای از وابستگیهای میان کلاسها.
برای مثال اگر در تصویر بالا کلاس A را در نظر بگیریم، ممکن است کلاسهای دیگری مانند B و یا C به آن وابسته باشند. اگر تغییری در کلاس A اتفاق بیفتد، ممکن است روند تغییرات صورت گرفته به گونهای باشد که یکی از کلاسهای وابسته آن نتوانند مثل قبل با کلاس A ارتباط برقرار کنند و در نتیجه دچار بروز خطاهایی در بخشهایی از برنامه بشویم. از آنجایی که چنین خطاهایی اصولاً خطاهای نحوی را شامل نمیشوند، ممکن است یافتن آن ها قدری مشکلتر باشد.
حال سوالی که مطرح میشود این است که آیا روند پخش شوندگی خطا میتواند به همین طریق تا وابستگیهای گذرا نیز ادامه پیدا کند یا خیر؟ برای توضیح بیشتر این امر، ابتدا وابستگی گذرا را توضیح خواهیم داد. فرض کنیم که تصویر قبل بخشی از یک گراف وابستگی بزرگتر مانند گراف زیر باشد.
شکل ۲: نمونهای از وابستگیهای پیچیده در میان کلاسها.
در این صورت کلاسهای E، F و D از طریق B دارای وابستگیهای گذرا یا در اصطلاح Transitive نسبت به کلاس A هستند. به همین ترتیب وابستگیهای گذرای دیگری را نیز میتوان یافت برای مثال میتوان به وابستگی گذرای G از طریق C به A اشاره نمود. در وابستگیهای گذرا بیش از یک گره میانجی نیز میتوانند مشارکت داشته باشند به گونهای که برای مثال کلاس H از طریق مسیر F-B نسبت به کلاس A دارای وابستگی گذرا میباشد. بنا به مثالهای نشان داده شده، یک وابستگی گذرا، نوعی از وابستگی است که در آن گره مبدأ از طریق یک یا چند گره میانی به گره مقصد وابسته باشد.
حال که مقصود از وابستگی گذرا روشن شد، میتوانیم به صورت روشنتری سوال مطرح شده را بیان کنیم. آیا خطای موجود در یک گره، میتواند در نتیجه مسائلی مانند چرخش کد به وابستههای گذرای یک کلاس سرایت کند یا خیر؟
اگر دیدمان را از دیاگرام وابستگی نرمافزار به سمت یک گراف جهت دار سوق دهیم، میتوانیم مسائلی را در مورد گراف جهت دار پیدا کنیم که پرورش دهنده ایدههای مربوط به وابستگی هستند. اولین مسألهای که بعد از طرح موضوع مربوط به وابستگیهای گذرا به ذهن خطور میکند، الگوریتمهای پیدا کننده کوتاه ترین مسیر بین دو گره مشخص در گراف هستند. معروفترین این الگوریتمها، الگوریتم وارشال است. الگوریتم وارشال همه مسیرهای ممکن در یک گراف، بین هر جفت از رأسها را مقایسه میکند. این الگوریتم قادر است این کار را تنها با V2 مقایسه انجام دهد. این ملاحظه قابل توجهی میباشد که در یک گراف V2 یال وجود داشته باشد و هر ترکیبی از یالها چک شده باشد. یک گراف G با راسهای Vi که i از ۱ تا N میباشد را در نظر بگیرید. علاوه بر این یک تابع به نام ShortestPath(i,j,k) را در نظر بگیرید که کوتاهترین مسیر ممکن از i تا j را با بهره گرفتن از راسهای ۱ تا k که به عنوان راسهای میانی در امتداد مسیر میباشند را بر میگرداند.