2-4-1- بررسی فعالیت‌ها در زمینه معیارهای کد :18
2-4-2- بررسی فعالیت‌ها در زمینه معیارهای تاریخی:20

سایت منبع

2-4-3- بررسی فعالیت‌ها در زمینه معیارهای وابستگی:22
3-درخت وابستگی:26
4-فرضیات:33
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-فرضیات:
حال سوال این است که هدف از طرح مبحث مورد نظر چیست؟ به عبارتی به چه نتیجه‌ای می‌خواهیم برسیم؟ در پاسخ به این موضوع می‌توان اهدافی را برای ادامه کار مشخص کرد و این اهداف را در اینجا به صورت سوال‌ها و فرضیاتی مطرح می‌کنیم:
الف: آیا درخت وابستگی هیچ‌گونه ارتباطی با خطا دار بودن بخش‌های متناظر در برنامه دارد؟
ب: در صورت بودن ارتباط آیا درخت وابستگی می‌تواند به صورت معیاری برای پیش‌بینی خطا، به صورت عملی مورد استفاده قرار بگیرد؟

  • 1
دسته بندی : پایان نامه ها

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