توسط نرم افزار

توسط نرم افزار

شکل 4: نمونه‌ای از کلاس دیاگرام نمایش داده شده در برنامه Class Dependency Analyzer
در بالا، مسیرهای وابستگی از کلاس RepeatedTest به کلاس واسط TestListener نشان داده شده است.
شکل 5: نمایش تمامی کلاس‌های وابسته به یک کلاس خاص در برنامه Class Dependency Analyzer
و در تصویر بالا، تمامی کلاس‌هایی را که به کلاس TableEditorModel وابسته هستند، مشاهده می‌نمایید.
تشکیل ماتریس وابستگی: در ادامه، برای بررسی فایل‌های حجیم XML خروجی نیاز به ابزاری بود که بتواند از این فایل، یک گراف وابستگی را بدست آورد. ابزار مورد نظر را به زبان C#.net نوشتیم. ابزار نوشته شده، به گونه‌ای عمل می‌کند که می‌تواند از وابستگی‌های تشخیص داده شده در خروجی CDA یک ماتریس صفر و یک را تشکیل می‌دهد. هر گره یک در ماتریس، وابستگی دو گره مربوط در سطر و ستون را نمایش می‌دهد. از آنجایی که گراف مورد نظر ما یک گراف جهت دار است، بنا بر این سطرها، نشان دهنده گره وابسته در وابستگی به نمایش آمده می‌باشند.
شکل 6: نمونه‌ای از یک گراف جهت دار.
بنا بر توضیحات ارائه شده، اگر یک گراف وابستگی جهت دار به شکل بالا داشته باشیم، آنگاه ماتریس همسایگی آن به صورت زیر خواهد بود:
شکل 7: ماتریس وابستگی مربوط به گراف جهت دار در شکل شماره 6
تشکیل درخت وابستگی برای هر گره: اولین قدم برای تشکیل درخت وابستگی شمارش وابستگی‌های مستقیم گره‌ها می‌باشد. معروف‌ترین راهی که برای شمارش تمامی وابستگی‌های یک گره می‌تواند مطرح باشد، استفاده از الگوریتم وارشال، به شیوه‌ای که در بخش قبل توضیح داده شد می‌باشد. با شمارش وابستگی‌های مستقیم، می‌توان خروجی‌های هر گره را در دست داشت. از طرفی می‌توان به این وابستگی‌ها به چشم یک درخت با عمق 1 نگاه کرد که ریشه آن، گره مورد نظر و برگ‌های آن، گره‌هایی می‌باشند که ریشه به آن‌ها وابسته است.
ایده‌آل‌ترین حالت این است که ابتدا تمامی مسیرهای ممکن را به وسیله الگوریتم وارشال محاسبه بنماییم و سپس شروع به شمارش وابستگی‌های هر گره بکنیم اما وجود دو مشخصه در کار ما مانع از انجام این امر می‌شد:
الگوریتم وارشال یک الگوریتم از درجه 3 می‌باشد.
حجم ماتریس وابستگی در این آزمایشات بسیار بزرگ است به گونه‌ای که ماتریس در برخی مواقع شامل بیش از 12000 سطر و ستون می‌باشد.
زمان اجرای الگوریتم وارشال بر روی گراف‌های با این اندازه بسیار زمان‌بر می‌باشد که با توجه به منابع سخت افزاری محدود در دسترس قادر به اجرای آن نبودیم و علاوه بر آن این روش برای پیدا کردن خطا بهینه نمی‌باشد.
راه حل دیگری که به ذهن می‌رسید، پیاده سازی الگوریتم دیگری بود که مشابه وارشال عمل کند اما میزان پردازش‌ها را تا یک سقف معین محدود نماید. این راه حل دو مزیت به همراه داشت:
ما می‌توانستیم تعداد وابستگی‌ها یا به عبارتی مسیرها را تا هر سطح دلخواه شمارش کرده و از هر کدام از نتایج به دست آمده برای بهبود نتایج پیش‌بینی خطا استفاده نماییم.
الگوریتم بر روی منابع محدودتر قابل پیاده سازی است.
بنا بر این اقدام به پیاده سازی روشی کردیم که همچون الگوریتم وارشال شروع به یافتن تمامی مسیرهای موجود در گراف مورد نظر می‌کند اما این مسیرها را تا عمق محدودی که معین می‌شود، دنبال می‌کند. بنا بر این با استفاده از الگوریتم مورد نظر، شروع به شمارش وابستگی‌های مستقیم گره کردیم و در ادامه وابستگی‌ها را تا عمق‌های 2 و 3 ادامه دادیم.
شیوه شمارش وابستگی‌ها به گونه‌ای است که هر گره به عنوان ریشه انتخاب می‌شود. سپس وابستگی‌های مستقیم ریشه به عنوان برگ‌های اولین درخت تشکیل شده با عمق یک، شمارش شده و نگهداری می‌شود. در ادامه وابستگی‌های موجود در برگ‌های درخت به دست آمده را محاسبه می‌کنیم؛ و اقدام به تشکیل یک درخت جدید با عمق 2 می‌کنیم. در این حالت، تمامی گره‌های درخت دوم را نیز محاسبه کرده و آن را برای استفاده در عمل پیش‌بینی خطا ثبت می‌کنیم. در کل، تشکیل درخت‌های با عمق n با استفاده از درخت‌های یا عمق n-1 به همین شیوه صورت می‌پذیرد و در هر مرحله تمامی گره‌های موجود شمارش شده و برای استفاده در عمل پیش‌بینی خطا نگهداری می‌شود.
بنا بر توضیحات داده شده، اگر روش بالا را برای گره A در گراف شکل (1) پیاده کنیم و درخت آن را تشکیل بدهیم، درخت مورد نظر به صورت زیر نمایش داده خواهد شد:
شکل 8: درخت وابستگی تشکیل شده از روی ماتریس وابستگی شکل 7
با نگاهی به گراف شکل (1) مشاهده می‌کنیم که گره A، به سه گره B، E و F وابسته می‌باشد. که در تصویر شماره 3 نیز این وابستگی‌ها مشهود است. نکته دیگری که مورد توجه است، وجود 3 مسیر متفاوت وابستگی از گره A به گره E می‌باشد که در این درخت می‌توان هر سه مسیر وابستگی را مشاهده نمود.
وجود یک عدد مرزی برای در نظر گرفتن محدودیت منابع برای شمارش وابستگی و همچنین در نظر گرفتن وابستگی‌ها در هر سطح مجزا مسأله دیگری است که در مثال ذکر شده مشاهده می‌گردد. برای مثال در شکل بالا ما حداکثر تا عمق 2 وابستگی‌ها را بررسی کرده‌ایم. گرچه برای گراف مذبور عمق وابستگی بیشتر از 2 نیست اما برای گراف‌های بزرگ‌تر با چندین هزار گره مطمئناً محدودیت منابع می‌تواند بسیار چالش بر انگیز باشد و ما مطمئناً به یک عدد مرزی جهت محدود نمودن عمق درخت تشکیل شده برای هر گره، نیازمندیم.
با شمارش تعداد گره‌های هر کدام از درخت‌های به دست آمده در هر سطح می‌توان گروهی از اعداد متناظر با هر فایل را به دست آورد. هر گروه از اعداد را می‌توان به عنوان یک ویژگی در نظر گرفت. با داشتن یک ویژگی در ازای هر درخت می‌توان عمل داده‌کاوی را بر روی داده‌های به دست آمده آزمایش کرد تا ارتباط مسأله و فرضیات طرح شده با خطا دار بودن یا نبودن گره‌ها مشخص گردد.
استخراج متریک‌های استاندارد برای مقایسه و بررسی نتایج: یکی از بهترین راه حل‌ها برای بررسی نتایج به دست آمده از روی داده‌های مختلف، استفاده از متریک‌های استانداردی است که پیش از این مورد استفاده قرار می‌گرفتند. به همین منظور سه دسته از متریک‌های قابل استخراج از برنامه‌های معرفی شده را توسط نرم افزاری به نام Prest استخراج نموده و نتایج را به گونه‌ای که در متن همین پایان نامه توضیح داده خواهد شد مقایسه خواهیم کرد. متریک‌های استخراج شده توسط Prest، در تحقیقات افرادی برجسته‌ای مانند آقای تورهان مورد استفاده و مقایسه قرار گرفته است.

Share