5-جمع آوري داده:34
5-تحليل و مقايسه:44
6-نتيجه گيري:76
7-مراجع:77

فهرست تصاوير

عنوان صفحه
شکل 1: نمونه‌اي از وابستگي‌هاي ميان کلاس‌ها29
شکل 2: نمونه‌اي از وابستگي‌هاي پيچيده در ميان کلاس‌ها30
شکل 3: تصويري از نماي کلي برنامه Class Dependency Analyzer37
شکل 4: نمونه‌اي از کلاس دياگرام نمايش داده شده در برنامه Class Dependency Analyzer37
شکل 5: نمايش تمامي کلاس‌هاي وابسته به يک کلاس خاص در برنامه Class Dependency Analyzer38
شکل 6: نمونه‌اي از يک گراف جهت دار39
شکل 7: ماتريس وابستگي مربوط به گراف جهت دار در شکل شماره 639
شکل 8: درخت وابستگي تشکيل شده از روي ماتريس وابستگي شکل 742
شکل 9: متغير تصادفي، انحراف معيار ? حول محور ?53

فهرست نمودارها

عنوان صفحه
نمودار 1: ارتباط بين جفتگري و انسجام28
نمودار 2: بررسي رفتار معيار دقت در هنگام افزايش وابستگي درجه 146
نمودار 3: بررسي رفتار معيار دقت در هنگام افزايش وابستگي درجه 246
نمودار 4: بررسي رفتار معيار دقت در هنگام افزايش وابستگي درجه 347
نمودار 5: مقايسه نتيجه “دقت” در دسته بندي سه نسخه اکليپس54
نمودار 6: مقايسه نتيجه “فراخواني” در دسته بندي سه نسخه اکليپس55
نمودار 7: مقايسه نتيجه “صحت” در دسته بندي سه نسخه اکليپس56
نمودار 8: مقايسه نتيجه “معيار F” در دسته بندي سه نسخه اکليپس56
نمودار 9: مقايسه نتيجه “منحني مشخصه عملکرد” در دسته بندي سه نسخه اکليپس57
نمودار 10: مقايسه نتيجه “کاپا” در دسته بندي سه نسخه اکليپس57
نمودار 11: مقايسه نتيجه “انحراف معيار” در دسته بندي سه نسخه اکليپس58
نمودار 12: مقايسه نتيجه “دقت” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي59
نمودار 13: مقايسه نتيجه “فراخواني” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي60
نمودار 14: مقايسه نتيجه “صحت” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي60
نمودار 15: مقايسه نتيجه “معيار F” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي61
نمودار 16: مقايسه نتيجه “منحني مشخصه عملکرد” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي61
نمودار 17: مقايسه نتيجه “کاپا” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي62
نمودار 18: مقايسه نتيجه “انحراف معيار” در دسته بندي آپاچي بر روي متريک‌هاي کد و درخت وابستگي62
نمودار 19: قياس نتيجه “دقت” در دسته‌بندي بر روي کل داده‌ها64
نمودار 20: قياس نتيجه “فراخواني” در دسته‌بندي بر روي کل داده‌ها65
نمودار 21: قياس نتيجه “صحت” در دسته‌بندي بر روي کل داده‌ها66
نمودار 22: قياس نتيجه “معيار F” در دسته‌بندي بر روي کل داده‌ها66
نمودار 23: قياس نتيجه “منحني مشخصه عملکرد” در دسته‌بندي بر روي کل داده‌ها67
نمودار 24: قياس نتيجه “کاپا” در دسته‌بندي بر روي کل داده‌ها67
نمودار 25: قياس نتيجه “انحراف معيار” در دسته‌بندي بر روي کل داده‌ها68

1-مقدمه:
يکي چالش بر انگيزترين موضوعات مطرح در تضمين کيفيت1، در شرکت‌هاي سازنده نرم افزار، موضوع رفع خطاهاي نرم افزار است. خطاهاي نرم افزاري مي‌توانند در زمان پيش و يا پس از انتشار2 نرم افزار تشخيص داده شوند. اما منابعي که مي‌توان براي تشخيص و تصحيح خطاها در نظر گرفت محدود است (Kamyabi et al.).
خطاها را مي‌توان به دو دسته کلي تقسيم کرد. خطاهاي نحوي3 و خطاهاي مفهومي4. با توجه به‌اين که ابزارهاي خودکار بسيار قدرتمندي براي تشخيص خطاهاي نحوي وجود دارند، احتمال‌اين که خطايي ازاين دست تا زمان انتشار تشخيص داده نشود، بسيار کم است. خطاهاي مفهومي به آن دسته از خطاها اشاره دارد که در اثر مشکلاتي جداي از اشتباهات نحوي و خطاهاي انساني ملموس اتفاق مي‌افتند و معمولاً در اثر عدم هماهنگي در بخش‌هاي مختلف کد و گاهي به صورت بسيار ناملموس به وجود مي‌آيند که در اينجا به سادگي نمي‌توان با بررسي کد، اين‌گونه خطاها را تشخيص داد. بنا بر اين در مورد خطاهاي مفهومي داستان فرق مي‌کند چرا که عوامل بسيار زيادي مي‌توانند در بروزاين‌گونه از خطاها دخيل باشند. (Zimmermann & Nagappan, 2008) بنا براين همواره سعي شده است که با اندازه گيري معيارهاي5 مختلف و استفاده از آن‌ها در روش‌هاي پيش‌بيني خودکار خطا، سرعت و دقت را در امر تست نرم افزار افزايش دهند. طي تحقيقاتي که تا کنون صورت گرفته، متداول‌ترين معيارهاي استفاده شده در پيش‌بيني اتوماتيک خطا، معيارهاي پيچيدگي6 است. (Zimmermann & Nagappan, 2008) اما جديدترين روشي که مطرح شده است، مسأله مربوط به وابستگي‌هاي بين کلاس‌ها7 و همچنين بين ماژول‌ها مي‌باشد. انواع وابستگي‌ها مي‌توانند بين دو کلاس و يا دو ماژول8 مطرح شوند که تحقيقات نشان داده است که اين وابستگي‌ها ارتباط بسيار زيادي با وجود خطاهاي مفهومي دارند.
براي اجراي روشمند و علمي روند يافتن روابط و الگوهاي مناسب براي پيش بيني خطا بر اساس معيارهاي قابل اندازه گيري، از مفهومي به نام داده‌کاوي استفاده خواهيم کرد که در تشريح و بيان مسأله به آن خواهيم پرداخت.
دراين پايان نامه، سعي مي‌کنيم که به بررسي چنين وابستگي‌هايي بپردازيم و بر اساس روابط موجود بين وابستگي و وجود خطا در نرم افزار، وجود خطا در کد را پيش بيني نماييم.
در ادامه اين رساله در بخش دوم به بررسي تحقيقات قبلي انجام شده در اين زمينه مي‌پردازيم، در بخش سوم به بيان انگيزش و نحوه به وجود آمدن ايده کار شده در اين رساله مي‌پردازيم، در بخش چهارم فرضيات مورد بررسي را مطرح مي‌کنيم، در بخش پنجم داده‌ها و ابزارهاي جمع آوري شده براي انجام عملي آزمايشات را معرفي مي‌کنيم، در بخش ششم به بيان شيوه و نوع آزمايشات و بيان نتايج آناليزها و نتايج مي‌پردازيم و در بخش هفتم و پاياني اين رساله سعي در نتيجه‌گيري از آزمايشات انجام شده خواهيم داشت.
2- پيشينه پژوهشي:

تلاش‌هاي گذشته با هدف پيش‌بيني خطا را در سه گروه مورد بررسي قرار مي‌دهيم: معيارهاي نرم‌افزار9، معيارهاي وابستگي10 و معيارهاي تاريخي11. ابتدا به بيان توضيحي در مورد شيوه کار کردن اين معيارها مي‌پردازيم.
2-1 معيارهاي نرم‌افزار:

معيارهاي نرم‌افزار براي اندازه‌گيري درجه پيشرفته بودن يک محصول و يا يک فرآيند نرم‌افزاري به کار مي‌روند. معيارهاي نرم‌افزاري به چندين گروه تقسيم مي‌شوند: معيارهاي محصول12، معيارهاي فرآيند13، معيارهاي پروژه14 و معيارهاي منبع15. معيارهاي نرم‌افزاري که در پيش‌بيني خطا به کار مي‌روند معيارهاي محصول مي‌باشند که از مشخصات کد سيستم نرم‌افزاري استخراج مي‌شوند. اين معيارها به سه گروه تقسيم مي‌شوند: معيارهاي اندازه16، معيارهاي پيچيدگي17 و معيارهاي کيفيت18. (Mills, 1988) معيارهاي اندازه بر اساس تعداد خطوط کد برنامه محاسبه مي‌شوند مانند تعداد کل خطوط برنامه19، تعداد خطوط توضيحات20 و … معيارهاي ميزان نگهداشت‌پذيري21 و قابليت تست برنامه وابسته است از جمله معروف‌ترين معيارهاي پيچيدگي معيارهاي پيچيدگي مک کيب22 و معيارهاي هالستد23 مي‌باشند. معيارهاي مک‌کيب پيچيدگي کد را بر اساس تعداد مسيرهاي کنترلي محاسبه مي‌نمايد. (McCabe, 1976) هالستد معيارهاي خود را بر اساس ارتباطات رياضي بين اجزاي کد، پيچيدگي کد و نوع زبان برنامه نويسي مطرح کرد. (Halstead M. H., 1975) معيارهاي اتصال24 و پيوستگي25 از معروف‌ترين معيارهاي کيفيت مي‌باشند که بالا و يا پايين بودن اندازه اين دو معيار نشان دهنده کيفيت محصول و يا فرآيند نرم‌افزاري است. (Pressman, 1982) معيارهاي کيفيت معيارهايي ميباشند که درجه آن‌ها مي‌تواند توليدکنندگان نرم‌افزار را در مورد توانايي دست کار کردن سيستم‌شان مطمئن سازد.

2-1- معيارهاي وابستگي:

معيارهاي وابستگي معيارهايي هستند که بر اساس ارتباط اجزاي کد نرم‌افزار محاسبه مي‌شوند. اين ارتباط مي‌تواند بين سطوح مختلف کد مطرح شود مانند سطح فايل، کلاس، تابع … نوع ارتباط و يا به عبارت ديگر وابستگي موجود بين اجزاي کد نيز مي‌تواند متفاوت باشد مانند وابستگي داده26 که بر اساس تعريف و استفاده از داده مي‌باشد و يا وابستگي صدا زدن27 که بر اساس تعريف و صدا زدن مؤلفه‌ها مي‌باشد. (Zimmermann, 2008 & Nagappan )

2-2- معيارهاي تاريخي:

اين دسته از معيارهاي بر اساس تغييراتي که در بين چندين انتشار28 مختلف از يک سيستم نرم‌افزاري رخ مي‌دهد تعريف مي‌شوند. اين تغييرات مي‌توانند اضافه شدن، حذف شدن، تغيير يافتن مؤلفه‌هاي جز مربوطه در بين چندين انتشار باشند. محدوديتي که در به کار بردن اين معيارها وجود دارد اين است که محاسبه اين معيارهاي تنها براي محصولات نرم‌افزاري مقدور مي‌باشد که داراي چندين انتشار باشند و همچنين اطلاعات کامل در مورد انتشارات قبلي موجود باشد.

2-3- بررسي فعاليت‌هاي گذشته:

در ادامه به بررسي تلاش‌هاي گذشته در زمينه پيش‌بيني خطا مي‌پردازيم.
2-3-1- بررسي فعاليت‌ها در زمينه معيارهاي کد :
در اولين مطالعات در زمينه پيش‌بيني خطا، آکياما در سال 1971 بر روي يک سيستم که در فوجيتسو ژاپن توسعه يافته بود کار کرد و نشان داد معيارهاي پيچيدگي نرم‌افزار و معيارهاي اندازه نرم‌افزار در پيش‌بيني خطا موفق عمل مي‌نمايند. (Akiyama, 1971) فردينند در سال 1974 ارتباط تعداد خطا با تعداد اجزاي کد را بررسي نمود و به اين نتيجه رسيد که تعداد اجزاي کد با تعداد خطا در ارتباط است. (Ferdinand A. , 1974) در سال 1975 هالستد معيارهاي نرم‌افزاري را ارائه داد که بر اساس پيچيدگي زبان برنامه‌نويسي عمل مي‌نمودند. هالستد از اين معيارها براي پيش‌بيني خطا استفاده کرد و نشان داد معيارهاي پيچيدگي هالستد در پيش‌بيني خطا موفق عمل مي‌نمايند. اين معيارها با نام معيارهاي هالستد شناخته مي‌شوند. (Halstead M. H., 1975) چيدمبر و کمرر در سال 1994 بر روي سيستم‌هاي شي گرا کار کردند و شش معيار طراحي براي اين نوع سيستم معرفي کردند. اين معيارها با نام معيارهاي طراحي چيدمبر و کمرر شناخته مي‌شوند. (Chidamber & Kemerer, 1994) باسيلي در سال 1996 از معيارهاي چيدمبر و کمرر به منظور پيش‌بيني خطا استفاده نمود و نشان داد معيارهاي چيدمبر و کمرر عملکرد موفقي در پيش‌بيني خطا دارند. (Basili et al., 1996) در سال 1996 اوهلسون و آلبرگ معيارهاي پيچيدگي را به منظور پيش‌بيني ماژول‌هاي از کد به کار بردند که در طول اجرا دچار خطا مي‌شدند. مدل پيش گويي کننده آن‌ها 20 درصد از ماژول‌هايي از کد را شناسايي مي‌کرد که شامل 47 درصد از کل خطاها بودند. (Ohlsson & Alberg, 1996) زائو در سال 1998 به بررسي معيارهاي طراحي نرم‌افزار پرداخت و عملکرد آن‌ها در پيش‌بيني خطا را محاسبه نمود. زائو نشان داد که معيارهاي طراحي به خوبي در پيش‌بيني خطا عمل مي‌نمايند. (Zhao M. et al., 1998) در سال 2006، ناپاگان معيارهايي براي پيش‌بيني خطاهاي پس از زمان انتشار شناسايي را کرد و گزارش مبني بر اينکه چگونه به طور سيستماتيک پيش‌بيني کننده‌هاي خطاهاي پس از زمان انتشار بر اساس تاريخچه29 ساخته شوند، را ارائه داد. (Nagappan et a., 2006) شروتر، زيمرمن و زلر در سال 2006 با استفاده از مهندسي معکوس30 نشان دادند معيارهاي طراحي در پيش‌بيني خطاهاي پس از اجرا موفق عمل مي‌نمايند (Schr?ter et al., 2006) منزيس در سال 2007 با کار بر روي چند پروژه و با استفاده از معيارهاي نرم‌افزار مدل پيش‌بيني خطايي طراحي نمود که توانست 71 درصد از کل خطاهاي برنامه را با نرخ خطاي 25 درصد شناسايي نمايد (Menzies et al., 2007) در سال 2008 جيانگ کارکرد معيارهاي سطح کد31 و معيارهاي سطح طراحي32 را بر روي 13 محصول نرم‌افزاري با يک ديگر مقايسه نمود. نتايج حاکي از عملکرد بهتر معيارهاي سطح طراحي نسبت به معيارهاي سطح کد و ترکيب دو گروه معيار در پيش‌بيني خطا بود. (Jiang et al, 2008) در سال 2010 منزيس و گروهي ديگر با تلاش‌هاي گذشته نشان دادند که معيارهاي کد معيارهاي موفقي در پيش‌بيني کد هستند و اين معيارها را به عنوان معيارهاي با استفاده راحت و مفيد معرفي نمودند. (Menzies et al., 2010) در مطالعه‌اي که بر روي چندين پروژه عظيم نرم‌افزاري در ترکيه انجام (Menzies et al., 2010)، مدل پيش‌بيني کننده که بر اساس معيارهاي کد عمل مي‌نمود را از طريق طبقه بندي نايو بيز33 اصلاح نموده و به بهبود 8 درصدي نسبت به گذشته دست يافتند. در يکي از تحقيقاتي که در سال 2010 بر روي پروژه‌هاي متن باز34 صورت گرفت توانايي معيارهاي اندازه‌گيري متن با طبقه بندي نايو بيز و معيارهاي پيچيدگي با آناليز رگرسيون35 در پيش‌بيني خطاهاي نرم‌افزار مورد مقايسه قرار گرفتند. اين پژوهش نشان داد معيار اندازه گيري متن از فراخواني36 بالاتر و معيار پيچيدگي از دقت37 بالاتري برخوردار هستند. (Hideaki & Osamu, 2010) معيارهاي طراحي معيارهاي موفقي در پيش‌بيني خطا هستند اما در بسياري از پروژه‌هاي نرم‌افزاري معيارهاي سطح کد موجود نيستند از اينرو سامي و فخراحمد در سال 2010 معيارهاي طراحي را بر اساس معيارهاي کد تخمين زدند که اين معيارها با معيارهاي واقعي سطح طراحي تفاوت اندکي دارند. (Sami & Fakhrahmad, 2010)
2-3-2- بررسي فعاليت‌ها در زمينه معيارهاي تاريخي:
خوش گفتار در سال 1996 بر روي دو سيستم بزرگ ارتباطي کار کرد و در مدل پيش بيني خود ماژول‌هايي را به عنوان ماژول معيوب پيش‌بيني نمود که تعداد خطوط کد آن در انتشارهاي مختلف تغيير مي‌کند. (McMullan et al., 1996) هودپل (Hudepohl et al., 1996) توانست با استفاده از ترکيب معيارهاي پيچيدگي و داده‌هاي تاريخي پيش‌بيني نمايد آيا يک ماژول داراي خطا مي‌باشد يا خير. در اين تحقيق همان‌گونه که از اطلاعات با استفاده مجدد38، استفاده شد معيارهاي طراحي نرم‌افزار نيز در پيش‌بيني خطا مورد استفاده قرار گرفت با اين فرض که ماژول‌هاي جديد و يا تغيير يافته چگالي خطاي بالاتري دارند. گريوز با استفاده از يک سيستم بسيار بزرگ و با طول عمر طولاني، نشان داد که معيارها بر اساس اطلاعات تاريخي بهتر از معيارهاي پيچيدگي کد عمل مي‌نمايند. (Graves T. L et al., 2000) در سال 2004 اوستراند در ادامه مطالعات خود از اطلاعات وضعيتي فايل‌هاي برنامه که در طول انتشارهاي مختلف تغيير مي‌کند مانند تعداد خطوط اضافه شده، حذف شده و تغيير يافته در فايل‌ها براي پيش‌بيني تعداد خطاهاي برنامه استفاده نمود. (Ostrand et al., 2004) اين مدل پيش‌گويي کننده براي يافتن خطا چه در مرحله توسعه و چه در مراحل پاياني پروژه از دقت بالايي برخوردار بود. اوستراند در سال 2005 مطالعات خود را بر اساس اطلاعات تاريخي بر روي 2 سيستم نرم‌افزاري بزرگ تا 17 انتشار براي پيش‌بيني فايل‌هايي با بالاترين چگالي خطا انجام داد. (Ostrand et al., 2005) مدل پيش‌بيني کننده خطاها 20 درصد از کل فايل‌هاي 2 سيستم نرم‌افزاري را به عنوان فايل‌هاي حاوي خطا پيش‌بيني کرد و موفق به شناسايي 71 درصد و 92 درصد از کل خطاها شد. زيمرمن در سال 2005 يکي از بزرگ‌ترين تحقيقات را بر روي اطلاعات تاريخي سيستم‌هاي نرم‌افزاري انجام داد. (Zimmermann et al., 2005). او بر روي اطلاعات تاريخي 8 سيستم بزرگ کار کرد تا بتواند محلي که تغييرات بعدي در انتشار بعدي رخ مي‌دهد را پيش‌بيني کند. در اين تحقيق او توانست محل تغييرات در آينده را با احتمال 70% به درستي تشخيص دهد. در سال 2005 نگاپان و بال با کار بر روي ويندوز سرور 2003، از تغييرات کد براي پيش‌بيني زود هنگام چگالي خطا در سيستم‌هاي نرم‌افزاري استفاده نمودند. (Ball & naggapan, 2005) آن‌ها نشان دادند که معيارهاي مطلق تغييرات کد در پيش‌بيني چگالي خطا ضعيف عمل مي‌کند در صورتي که معيارهاي نسبي تغييرات کد که توسط آن‌ها مطرح شد توانست با دقت 89% بالاترين چگالي خطا را شناسايي نمايد. آن‌ها نشان دادند افزايش معيار نسبي تغييرات با افزايش چگالي خطا توأم است و همچنين معيار نسبي تغييرات علاوه بر چگالي در شناسايي اجزاي معيوب نيز موفق است. آن‌ها همچنين بيان کردند که تغييرات در کد و وابستگي به کدهاي تغيير داده شده مي‌تواند باعث بروز خطاهاي پس از زمان انتشار شود. اين پيش‌بيني به کمک معيارهاي پيچيدگي نظير سايز اجزاي کد و اندازه موقتي39 کد تغيير يافته صورت گرفت. در سال 2006 تحقيقي بر روي ويندوز ايکس پي- سرويس پک 140 و ويندوز سرور 2003 صورت گرفت. در اين تحقيق نشان داده شد که معيارهايي که بر اساس اطلاعات تاريخي در سطح پروژه و محصول عمل مي‌نمايند معيارهاي مناسبي براي پيش‌بيني خطاهاي پس از زمان اجرا هستند و همچنين کارايي اين متريک‌ها در سطح پروژه‌هاي بسيار بزرگ نيز نشان داده شد. (Nagappan et al., 2006).
2-3-3- بررسي فعاليت‌ها در زمينه معيارهاي وابستگي:
در سال 1981 هنري و کافورا معيارهايي تحت عنوان معيار ورودي41 و معيار خروجي مطرح کردند. معيارهاي ورودي تعداد ماژول‌هايي است که يک ماژول خاص را صدا مي‌زنند و معيار خروجي تعداد ماژول‌هايي است که توسط يک ماژول خاص صدا زده مي‌شوند. هنري و کافورا از اين دو معيار براي محاسبه پيچيدگي کد استفاده نمودند و نشان دادند اجزايي از کد که داراي معيار ورودي و معيار خروجي بزرگي باشند داراي طراحي ضعيفي هستند. (Kafura & Henry, 1981) در سال 1989 سلبي و پورتر با استفاده از يک الگوريتم بازگشتي درخت‌هاي دسته‌بندي42 استخراج کردند که گره‌هاي آن‌ها تابعهاي چند ارزشي بر اساس معيارهاي کد هستند. هدف از تشکيل اين درخت‌ها شناسايي اجزاي معيوب کد بود. سلبي و پورتر بر روي 16 پروژه‌ي ناسا کار کردند و موفق به شناسايي 79.3% از کل اجزاي معيوب شدند. (Porter & Selby, 1989) پدولسکي و کلارک در سال 1990 يک مدل رسمي بر اساس وابستگي‌هاي برنامه ارائه کردند. اين وابستگي‌ها بر اساس ارتباط دو قسمت متن کد برنامه استخراج مي‌شود. (Clarke & Pogdurski, 1990) در سال 1998 بينکلي و اسکاچ بر روي خطاهاي زمان اجرا کار کردند و همچنين معيارهاي وابستگي متصل43 را مطرح کردند. .آن‌ها کار خود را بر روي 4 پروژه به زبان‌هاي جاوا44، کوبول45، سي46 و سي پلاس پلاس47 بررسي نمودند. تحقيقات آن‌ها حاکي بر موفقيت آميز بودن اين معيارها در کيفيت طراحي نرم‌افزار بود. آن‌ها نشان دادند معيار وابستگي متصل در مقايسه با معيارهاي متقابل48 عملکرد بسيار بهتري در پيش‌بيني خطاهاي زمان اجرا49 دارند. (Binkley & Schach, 1998) بيون و وايتهد در سال 2003 گراف وابستگي و داده‌هاي تاريخي را براي شناسايي ناپايداري‌هاي برنامه ترکيب نمودند. (Bevan & Whitehead, 2003) پينگر در بر اساس اطلاعاتي که از سير تکاملي و اطلاعات تاريخي پروژه‌هاي نرم‌افزاري بدست آورد پيوستگي‌هاي تصادفي بين اجزاي کد مشاهده کرد که ممکن بود در آينده منجر به بروز خطا شوند. (Pinzger et al., 2005) شروتر در سال 2006 نشان داد که وابستگي‌هاي ورودي واقعي مي‌تواند خطاهاي را شناسايي کند و وابستگي‌هاي ورودي کامپايلر از وابستگي‌هاي ورودي واسط کاربر احتمال خطاي بالاتري را ايجاد مي‌کند (Schr?ter & Zeller, 2006) در يکي از تلاش‌هاي تيم مايکروسافت نشان داده شد تغييرات کد و وابستگي‌ها مي‌تواند معيار موثري در شناسايي خطاهاي پس از انتشار باشد. (Nagappan & Ball, 2007) ايده‌ي آن‌ها اين بود که اگر جز A در کد برنامه وابستگي زيادي به جز ديگري مانند B داشته باشد و جز B در طول انتشارات مختلف تغيير بکند جز A براي هماهنگ بودن با جز B نيازمند تغييراتي مي‌باشد اين تغييرات معمولاً در طول وابستگي‌ها منتشر مي‌شود. نگاپان و بال در اين پژوهش بر روي ويندوز سرور 2003 نشان دادند درجه بالاي وابستگي در کنار تغييرات کد مي‌تواند باعث انتشار خطا در سراسر يک سيستم شود. زيمرمن و نگاپان در سال 2007 با کار بروي گراف وابستگي زير سيستم‌هاي کد نشان دادند بين پيچيدگي گراف وابستگي و خطاهاي پس از انتشار ارتباط بالايي وجود دارد و هنگامي مدل‌هايي پيش‌گويي بر اساس زير سيستم‌هايي که در معماري بالاتر هستند ساخته مي‌شوند بهتر عمل مي‌کنند. (Zimmermann & Nagappan, 2007) در سال 2008 زيمرمن و نگاپان معيارهايي بر اساس وابستگي موجود در کد استخراج نمودند. (Zimmermann & Nagappan, 2008) اين معيارها بر اساس مشاهدات آن‌ها از گراف وابستگي ويندوز سرور 2003 تعريف شده است. آن‌ها در بررسي گراف وابستگي ويندوز سرور 2003 مشاهده کردند گره‌هاي که حالت مرکزيت دارند و يا در مش50 ‏هايي با تعداد گره‌هاي زياد قرار دارند از احتمال معيوب بودن بالايي برخوردارند بر اساس اين مشاهدات اين تيم تحقيقاتي معيارهايي تحت عنوان معيارهاي شبکه استخراج نمود و کارايي آن‌ها را براي پيش‌بيني خطا در مقايسه با معيارهاي پيچيدگي کد بررسي کرد که در اين مقايسه معيارهاي شبکه توانستند 60% از کل اجزاي معيوب برنامه را شناسايي نمايند در صورتي که معيارهاي پيچيدگي تنها موفق به شناسايي 30% از کل خطاها شدند. در سال 2009 تورهان با بررسي و آزمايشاتي نشان داد که معيارهاي شبکه روي برنامه‌هاي بزرگ کارايي بهتري از معيارهاي پيچيدگي دارند اما در نرم‌افزارهايي با حجم کوچک تفاوتي ميان قدرت پيش‌بيني خطاي معيارهاي شبکه و معيارهاي پيچيدگي وجود ندارد. (Torhun et al. 2009).
تلاشي که در اين رساله صورت گرفته است در دسته معيارهاي پيوستگي جاي مي‌گيرد.

3-درخت وابستگي:
همان‌طور که گفته شد جديدترين روشي که در پيش‌بيني خطاي نرم‌افزار مطرح شده است، مسأله مربوط به وابستگي‌هاي بين کلاس‌ها و همچنين بين ماژول‌ها51 مي‌باشد. انواع وابستگي‌ها مي‌توانند بين دو کلاس و يا دو ماژول مطرح شوند که تحقيقات نشان داده است که اين وابستگي‌ها ارتباط بسيار زيادي با وجود خطاهاي مفهومي دارند. مسأله‌اي که در اين رساله تحقيق مطرح شده است، استفاده از يک تکنيک جديد بر پايه وابستگي‌هاي بخش‌هاي مختلف نرم افزار در سطح کد است. در گذشته استفاده از گراف‌هاي کنترل جريان52 متداول بوده که اين گراف جريان داده‌ها را در هنگام اجراي برنامه مورد نظر قرار داده است و از اين امر در مباحث مهندسي نرم افزار53 استفاده شده است اما، من در اين طرح پيشنهادي از وابستگي کدها استفاده کرده‌ام که بر خلاف گراف کنترل جريان، وابستگي‌ها را در زماني بررسي مي‌کند که برنامه اجرا نشده است. اين وابستگي‌ها مي‌توانند شامل مواردي مانند وراثت، صدا زدن زير رويه‌ها و ماژول‌ها و هرگونه وابستگي ديگري در کد باشند که اين مسأله تنها محدود به برنامه نويسي شيء گرا نشده و مي‌تواند برنامه‌هاي ساخت يافته را نيز پوشش بدهد چرا که در آنجا نيز ما شاهد وابستگي بين ماژول‌هاي برنامه، توابع و رويه‌ها هستيم.
براي بررسي اين وابستگي‌ها و روابط آن با خطاها از مفهومي به نام داده کاوي استفاده مي‌کنيم. حال سوال‌ اين است که داده کاوي چيست؟
با پيشرفت سريع تکنولوژي و ورود فناوري اطلاعات بسياري از حوزه‌ها، نياز به داده‌ها، افزايش روز افزوني داشت. بعد از مدت کوتاهي پايگاه‌هاي داده بسيار عظيم با حجم بسيار گسترده‌اي از داده‌ها در سازمان‌ها، ادارات و مراکز مختلف به وجود آمدند.
حال جامعه علمي مي‌توانند از چنين حجم گسترده‌اي از داده‌ها استفاده کرده و با پردازش، تحليل و بررسي اين داده‌هاي ذخيره شده، به روابط و اطلاعاتي دست پيدا بکنند که به هر نحوي براي سازمان و بخش مربوطه مفيد واقع شود (Hand et al., 2001). ممکن است در ميان حجم زيادي از داده‌ها، با روش‌هاي مختلف بتوان روابط خاصي پيدا کرد که از جنبه‌هاي مختلف براي بخش مربوطه داراي اهميت باشد. ممکن است اين اهميت داراي جنبه اقتصادي و يا افزايش کارايي سيستم باشد.
داده کاوي، علمي است که روش‌ها و الگوريتم‌هاي متنوعي را در اختيار ما قرار مي‌دهد تا بتوانيم از اين حجم داده‌ها، با کشف الگوها54 و روابط، به اطلاعات ارزشمندي دست پيدا بکنيم.
به عبارتي “علم استخراج اطلاعات ارزشمند، از مجموعه داده‌ها و پايگاه‌هاي داده بزرگ” به عنوان داده کاوي شناخته مي‌شود. (Hand et al., 2001).
لري کنستانتين در سال 1974 مفهوم وابستگي را معرفي کرد و اين مفهوم به صورت گسترده‌اي در تحقيقات و کتاب‌ها و منابع مختلف، به صورت يک اصل در مهندسي نرم‌افزار مورد استفاده قرار گرفت. اما مفهوم وابستگي معرفي شده توسط کنستانتين از واژه Coupling يعني جفتگري گرفته شده است. جفتگري هميشه به همراه مفهوم ديگري به کار برده شده است. اين مفهوم، پيوستگي مي‌باشد. قالبا جفتگري کم نشانه طراحي خوب نرم‌افزار است در حالي که پيوستگي کم نشان دهنده يک طراحي ضعيف مي‌باشد. تأثير اين دو مفهوم بر يکديگر به صورت عکس است و به گونه‌اي که در نمودار زير مشاهده مي‌نماييد، با افزايش جفتگري، پيوستگي کاهش پيدا مي‌کند. (Constantine, 1996)

نمودار 1: ارتباط بين جفتگري و انسجام.
در واقع جفتگري معناي معمول‌تر خود يعني وابستگي را به طور کامل دارا است. هرچه وابستگي در نرم‌افزار افزايش پيدا کند، کيفيت طراحي، به دليل کاهش انسجام آن کاهش پيدا مي‌کند.
حال ممکن است اين سوال مطرح شود که کدام دليل منطقي وجود دارد که باعث وجود چنين رابطه‌اي بين وابستگي و انسجام مي‌شود؟ شايد منطقي ترين پاسخي که بتوان براي اين سوال پيدا کرد موضوع چرخش کد باشد. چرخش کد مفهوميست که با تغيير بخش‌هايي از کد نرم‌افزار به يکي از دلايل زير اشاره دارد:
– تغيير در اثر تغيير در نسخه‌هاي مختلف.
– تغيير به قصد رفع خطا.
بدون نياز به تمرکز بر دليل تغيير، مي‌توان اين امر منطقي را قبول کرد که اگر بخش‌هايي از برنامه، به هر دليلي دچار تغيير بشوند، ممکن است هماهنگي اين بخش‌ها با بخش‌هاي ديگر برنامه از بين برود.

شکل 1: نمونه‌اي از وابستگي‌هاي ميان کلاس‌ها.
براي مثال اگر در تصوير بالا کلاس A را در نظر بگيريم، ممکن است کلاس‌هاي ديگري مانند B و يا C به آن وابسته باشند. اگر تغييري در کلاس A اتفاق بيفتد، ممکن است روند تغييرات صورت گرفته به گونه‌اي باشد که يکي از کلاس‌هاي وابسته آن نتوانند مثل قبل با کلاس A ارتباط برقرار کنند و در نتيجه دچار بروز خطاهايي در بخش‌هايي از برنامه بشويم. از آنجايي که چنين خطاهايي اصولاً خطاهاي نحوي را شامل نمي‌شوند، ممکن است يافتن آن‌ها قدري مشکل‌تر باشد.
حال سوالي که مطرح مي‌شود اين است که آيا روند پخش شوندگي خطا مي‌تواند به همين طريق تا وابستگي‌هاي گذرا نيز ادامه پيدا کند يا خير؟ براي توضيح بيشتر اين امر، ابتدا وابستگي گذرا را توضيح خواهيم داد. فرض کنيم که تصوير قبل بخشي از يک گراف وابستگي بزرگ‌تر مانند گراف زير باشد.

شکل 2: نمونه‌اي از وابستگي‌هاي پيچيده در ميان کلاس‌ها.
در اين صورت کلاس‌هاي E، F و D از طريق B داراي وابستگي‌هاي گذرا يا در اصطلاح Transitive نسبت به کلاس A هستند. به همين ترتيب وابستگي‌هاي گذراي ديگري را نيز مي‌توان يافت براي مثال مي‌توان به وابستگي گذراي G از طريق C به A اشاره نمود. در وابستگي‌هاي گذرا بيش از يک گره ميانجي نيز مي‌توانند مشارکت داشته باشند به گونه‌اي که براي مثال کلاس H از طريق مسير F-B نسبت به کلاس A داراي وابستگي گذرا مي‌باشد. بنا به مثال‌هاي نشان داده شده، يک وابستگي گذرا، نوعي از وابستگي است که در آن گره مبدأ از طريق يک يا چند گره مياني به گره مقصد وابسته باشد.
حال که مقصود از وابستگي گذرا روشن شد، مي‌توانيم به صورت روشن‌تري سوال مطرح شده را بيان کنيم. آيا خطاي موجود در يک گره، مي‌تواند در نتيجه مسائلي مانند چرخش کد به وابسته‌هاي گذراي يک کلاس سرايت کند يا خير؟

در این سایت فقط تکه هایی از این مطلب با شماره بندی انتهای صفحه درج می شود که ممکن است هنگام انتقال از فایل ورد به داخل سایت کلمات به هم بریزد یا شکل ها درج نشود

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

ولی برای دانلود فایل اصلی با فرمت ورد حاوی تمامی قسمت ها با منابع کامل

اینجا کلیک کنید

اگر ديدمان را از دياگرام وابستگي نرم‌افزار به سمت يک گراف جهت دار سوق دهيم، مي‌توانيم مسائلي را در مورد گراف جهت دار پيدا کنيم که پرورش دهنده ايده‌هاي مربوط به وابستگي هستند. اولين مسأله‌اي که بعد از طرح موضوع مربوط به وابستگي‌هاي گذرا به ذهن خطور مي‌کند، الگوريتم‌هاي پيدا کننده کوتاه ترين مسير بين دو گره مشخص در گراف هستند. معروف‌ترين اين الگوريتم‌ها، الگوريتم وارشال است. الگوريتم وارشال همه مسيرهاي ممکن در يک گراف، بين هر جفت از رأس‌ها را مقايسه مي‌کند. اين الگوريتم قادر است اين کار را تنها با V2 مقايسه انجام دهد. اين ملاحظه قابل توجهي مي‌باشد که در يک گراف V2 يال وجود داشته باشد و هر ترکيبي از يال‌ها چک شده باشد. يک گراف G با راس‌هاي Vi که i از 1 تا N مي‌باشد را در نظر بگيريد. علاوه بر اين يک تابع به نام ShortestPath(i,j,k) را در نظر بگيريد که کوتاه‌ترين مسير ممکن از i تا j را با استفاده از راس‌هاي 1 تا k که به عنوان راس‌هاي مياني در امتداد مسير مي‌باشند را بر مي‌گرداند.
هم اکنون اين تابع داده شده است. هدف ما پيدا کردن کوتاه‌ترين مسير از هر i تا هر j تنها با استفاده از راس‌هاي 1 تا k+1 مي‌باشد. دو کانديدا براي اين مسير وجود دارد :
1- کوتاه‌ترين مسيري که فقط از راس‌هاي موجود در مجموعه‌ي (k,……..,1) استفاده مي‌کند.
2- تعدادي مسير که از i تا k+1 و سپس از k+1 تا j مي‌روند وجود دارد که اين مسير بهتر مي‌باشد.
(1).

ما مي‌دانيم که بهترين مسير از i تا j که فقط از راس‌هاي بين 1 تا k+1 استفاده مي‌کند توسط ShortestPath(i,j,k) تعريف شده است و واضح است که اگر يک مسير بهتر از i تا k+1 و از k+1 تا j وجود داشته باشد بنابراين طول مسير بين i,j از الحاق کوتاه‌ترين مسير از i تا k+1 و کوتاه‌ترين مسير از k+1 تا j بدست مي‌آيد. بنابراين تابع ShortestPath(i,j,k) را در فرمول بازگشتي زير ارائه مي‌دهيم:
بنا به تعريف انجام شده، به نظر مي‌رسد که الگوريتم وارشال مي‌تواند در حل مسأله‌اي مانند يافتن بستار تعدي و وابستگي‌هاي گذراي گراف وابستگي نرم افزار قابليت استفاده داشته باشد.
مسأله ديگري که خودنمايي مي‌کند، حجم وابستگي‌ها در ميان گروهي از گره‌هاي يک گراف است. در يک گراف جهت‌دار با n گره، ميزان وابستگي‌ها مي‌تواند در دامنه‌اي از صفر تا n(n-1) قرار بگيرد.
مشخصاً در گرافي که هيچ گونه وابستگي در آن وجود ندارد، ما تنها تعدادي گره مستقل خواهيم داشت. اما گرافي که در آن تمامي گره‌هاي آن به هم وابستگي دارند، در اصطلاح گراف کامل ناميده مي‌شود. به يک گراف و يا زير گراف کامل، در اصلاح کليک گفته مي‌شود. کليک مبحثي است که مسائل بسيار زياد و معروفي با عنوان مسائل کليک در مورد آن مطرح شده‌اند. بعضي از اين مسائل عبارتند از:
– يافتن کليک‌ها با اندازه ثابت در يک گراف.
– يافتن تمامي کليک‌هاي ماکزيمال در يک گراف.
– يافتن تمامي کليک‌هاي ماکزيموم در يک گراف.
– …
مسأله جذاب و جالب ديگري که در مورد گراف‌ها خودنمايي مي‌کند اين است که مسأله کليک، مي‌تواند کمک کننده اين باشد که قسمت‌هايي از گراف وابستگي نرم‌افزار را که بيشترين چگالي وابستگي ممکن در آن موجود است را پيدا کنيم و ارتباط آن را با خطا نشان دهيم.
کارپ در سال 1947 اثبات کرد که در کل مسائل مربوط به کليک جزء مسائل ان پي-کامل هستند. به اين معني که هيچ الگوريتم قابل اجرا در زمان چند جمله‌اي براي اين مسائل وجود ندارد. اين مشکل در جايي خود را بيشتر نشان مي‌دهد که گراف وابستگي يک نرم‌افزار معمولي ممکن است شامل چندين هزار گره باشد بنابراين به نظر مي‌رسد که مسائل مربوط به کليک، برخلاف جذابيت بسياري که در زمينه وابستگي نرم‌افزار از خود نشان مي‌دهند، به صورت عملي قابل استفاده نيستند. (Karp, 1975)
سوال دومي که مطرح مي‌شود اين است که آيا مي‌توان از خصوصيات مسائل مربوط به کليک در پيدا کردن نقاط مستعد خطاي برنامه استفاده نمود يا خير؟ اين سوال از آنجا مطرح مي‌شود که وقتي بتوان گروهي از گره‌هاي يک گراف را پيدا کرد که تشکيل يک کليک را مي‌دهند، در واقع بيشترين وابستگي‌هاي ممکن بين اين گروه از گره‌ها اتفاق افتاده است. سوال اين است که آيا اين تراکم گره‌ها مي‌تواند نشانه‌اي بر مستعد خطا بودن آن بخش از نرم‌افزار باشد يا خير؟
4-فرضيات:
حال سوال اين است که هدف از طرح مبحث مورد نظر چيست؟ به عبارتي به چه نتيجه‌اي مي‌خواهيم برسيم؟ در پاسخ به اين موضوع مي‌توان اهدافي را براي ادامه کار مشخص کرد و اين اهداف را در اينجا به صورت سوال‌ها و فرضياتي مطرح مي‌کنيم:
الف: آيا درخت وابستگي هيچ‌گونه ارتباطي با خطا دار بودن بخش‌هاي متناظر در برنامه دارد؟
ب: در صورت بودن ارتباط آيا درخت وابستگي مي‌تواند به صورت معياري براي پيش‌بيني خطا، به صورت عملي مورد استفاده قرار بگيرد؟
ج: عملکرد درخت وابستگي در قياس با ديگر مشخصه‌هاي استفاده شده در پيش‌بيني خطا به چه صورتي است؟ آيا عملاً مي‌توان بيان کرد که درخت وابستگي، خصوصيتي قابل مقايسه با ديگر مشخصه‌ها و متريک‌هاي مورد استفاده در پيش‌بيني خطا دارد يا خير؟
5-جمع آوري داده:


دیدگاهتان را بنویسید