Обчислення значення метрик

Автор работы: Пользователь скрыл имя, 09 Мая 2013 в 15:14, практическая работа

Описание работы

Мета практичної роботи – дослідження методів та засобів створення програм, що розраховують значення метрик програмного забезпечення та отримання практичних навичок з їх створення.

Завдання
Написати програму, яка розраховує наступні метрики програмного забезпечення: Maintainability index, Depth of Inheritance, Cyclomatic Complexity, Lines of Code, Class Coupling. Порівняти отримані метрики з розрахованими у Visual Studio.

Файлы: 1 файл

Практическая работа - Вычесление значения метрик ПО.doc

— 895.50 Кб (Скачать файл)

МIНIСТЕРСТВО ОСВIТИ І  НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

Національний авіаційний університет

Факультет комп’ютерних наук

Кафедра інженерії програмного  забезпечення

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Практична робота № 1

 

з дисципліни “ЕВОЛЮЦІЯ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ“

 

Тема: “Обчислення значення метрик”

 

 

 

 

 

 

 

 

 

 

Виконав: студент 407 групи

4 курсу напряму підготовки

“Програмна інженерія”

 

 

Перевірив: асистент

 

 

 

 

 

 

 

 

Київ  2012

Мета практичної роботи – дослідження методів та засобів створення програм, що розраховують значення метрик програмного забезпечення та отримання практичних навичок з їх створення.

 

Завдання

Написати програму, яка розраховує наступні метрики програмного забезпечення: Maintainability index, Depth of Inheritance, Cyclomatic Complexity, Lines of Code, Class Coupling. Порівняти отримані метрики з розрахованими у Visual Studio.

 

Хід роботи

 

Результат роботи програми представлений  на рис. 1 – рис. 9.

 

Рисунок 1. Розрахування метрик за допомогою DrivenMetrics

 

 

Рисунок 2. Звіт DrivenMetrics по кількості рядків коду у форматі html

 

 

Рисунок 3. Звіт DrivenMetrics по цикломатичній складності у форматі html

 

 

Рисунок 4. Звіт DrivenMetrics по кількості рядків коду у форматі xml

 

Рисунок 5. Звіт DrivenMetrics по цикломатичній складності у форматі xml

 

Рисунок 6. Розрахування метрик за допомогою Visual Studio Code Metrics PowerTool 10.0

 

Рисунок 7. Звіт VS Code Metrics PowerTool у форматі xml

 

Рисунок 8. Звіт VS Code Metrics PowerTool у форматі xml

 

Рисунок 9. Значення метрик, підраховані Visual Studio 2010 

Вихідний код програми наведено нижче:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.IO;

using Driven;

using Driven.Metrics;

using Driven.Metrics.metrics;

using System.Xml;

using System.Xml.Linq;

using System.Diagnostics;

using System.Windows.Forms;

using Driven.Metrics.Reporting;

 

// Powered by Driven Metrics https://github.com/garrensmith/DrivenMetrics

// and Visual Studio Code Metrics PowerTool 10.0 http://www.microsoft.com/download/en/details.aspx?id=9422

namespace SoftwareEvolutionLab1

{

    /// <summary>

    /// Interaction logic for MainWindow.xaml

    /// </summary>

    public partial class MainWindow : Window

    {

        CodeMetricsUtility CurrentUtility { get; set; }

        private const int _MaxCC = 20;

 

        public MainWindow()

        {

            InitializeComponent();

            utilityErrorTextBlock.Visibility =

                                           System.Windows.Visibility.Hidden;

            mainWindow.Height = 349;

            controlsCanvas.Margin = new Thickness(0, 122, 0, 0);

        }

 

        private void BuildProject(string solutionOrProjectPath)

        {

            string msbuildPath = GetMSBuilderPath();

            string parameters = "\"" + solutionOrProjectPath + "\""

                + @" /t:Clean;Build /verbosity:quiet";

            if (File.Exists(msbuildPath))

            {

                Process buildProcess = Process.Start(msbuildPath, parameters);

                buildProcess.WaitForExit();

            }

        }

 

        private string GetMSBuilderPath()

        {

            DirectoryInfo lastDotnetVersionsDirectory = null;

            DirectoryInfo rootDirectory = new DirectoryInfo(

                @"C:\Windows\Microsoft.NET\Framework");

            foreach (DirectoryInfo directory in rootDirectory.GetDirectories())

            {

                if (directory.Name[0].Equals('v'))

                {

                    lastDotnetVersionsDirectory = directory;

                }

            }

 

            string msbuildPath = System.IO.Path.Combine(lastDotnetVersionsDirectory.FullName,

                "MSBuild.exe");

            return msbuildPath;

        }

 

        private void CalculateMetricsButton_Click(object sender, RoutedEventArgs e)

        {

            BuildProject(projectOrSolutionPathTextBox.Text);

 

            string directoryPath = System.IO.Path.GetDirectoryName(projectOrSolutionPathTextBox.Text);

            ProjectType projectType = GetProjectType(projectOrSolutionPathTextBox.Text);

            List<string> assembliesPaths = GetAssembliesPaths(directoryPath, projectType);

 

            if (CurrentUtility == CodeMetricsUtility.VisualStudioCodeMetrics)

            {

                CalculateMetricsWithVSCodeMetrics(assembliesPaths.ToArray(), reportPathTextBox.Text);

            }

            else if (CurrentUtility == CodeMetricsUtility.DrivenMetrics)

            {

                ReportFactory reportFactory = new ReportFactory();

                string reportFilePath = reportPathTextBox.Text;

                IReport report = reportFactory.ResolveReport(ReportType.All, reportFilePath);

                //IReport htmlReport = new HtmlFailedReport(new FileWriter(), reportFilePath);

                //IReport xmlReport = new Driven.Metrics.Reporting.XmlReport(new FileWriter(),

                //    @"C:\Users\AndrijL.Bykadorov\Documents\Visual Studio 2010\Projects\SoundSystem\report.xml");

                List<IMetricCalculator> metrics = new List<IMetricCalculator>(){               

                   new NumberOfLinesCalculator(20),

                    new ILCyclomicComplextityCalculator(20)              

                };

                var numberOfLines = new NumberOfLinesCalculator(20);

                var cyclomicCompexity = new ILCyclomicComplextityCalculator(20);

 

                DrivenMetrics drivenMetrics = new DrivenMetrics.Factory().Create(

                    assembliesPaths.ToArray(),

                    metrics.ToArray(),

                    reportFilePath,

                    report);

                drivenMetrics.RunAllMetricsAndGenerateReport();

            }

        }

 

        private void CalculateMetricsWithVSCodeMetrics(string[] assembliesPathsInArray,

            string outputFilePath)

        {

            string vscodeMetricsPath = @"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\Metrics.exe";

            string assembliesPathsInString = String.Join("\" /f:\"", assembliesPathsInArray);

            string parameters = @" /f:" + "\"" + assembliesPathsInString + "\"" + @" /out:" + "\"" + outputFilePath + "\"" ;

            if (File.Exists(vscodeMetricsPath))

            {

                Process metricsCalculationProcess = Process.Start(vscodeMetricsPath, parameters);

                metricsCalculationProcess.WaitForExit();

            }

        }

 

        private ProjectType GetProjectType(string filePath)

        {

            ProjectType projectType = ProjectType.Null;

            FileInfo file = new FileInfo(filePath);

            if (file.Extension == ".sln")

            {

                projectType = ProjectType.Solution;

            }

            else if (file.Extension == ".csproj")

            {

                projectType = ProjectType.Project;

            }

            return projectType;

        }

 

        private List<string> GetAssembliesPaths(string rootDirectoryPath, ProjectType projectType)

        {

            List<string> assembliesPaths = new List<string>();

            if (projectType.Equals(ProjectType.Solution))

            {

                DirectoryInfo rootDirectory = new DirectoryInfo(rootDirectoryPath);

                foreach (DirectoryInfo directory in rootDirectory.GetDirectories())

                {

                    string nestedBinDirectoryPath = System.IO.Path.Combine(directory.FullName, "bin");

                    string nestedDebugDirectoryPath = System.IO.Path.Combine(nestedBinDirectoryPath, "Debug");

                    if (Directory.Exists(nestedDebugDirectoryPath))

                    {

                        assembliesPaths.AddRange(

                            GetAllAssembliesPathsInDirectory(nestedDebugDirectoryPath));

                    }

                }

            }

            else if (projectType.Equals(ProjectType.Project))

            {

                DirectoryInfo rootDirectory = new DirectoryInfo(rootDirectoryPath);

                string nestedBinDirectoryPath = System.IO.Path.Combine(rootDirectory.FullName, "bin");

                string nestedDebugDirectoryPath = System.IO.Path.Combine(nestedBinDirectoryPath, "Debug");

                if (Directory.Exists(nestedDebugDirectoryPath))

                {

                    assembliesPaths.AddRange(

                        GetAllAssembliesPathsInDirectory(nestedDebugDirectoryPath));

                }

            }

            return assembliesPaths;

        }

 

        private List<string> GetAllAssembliesPathsInDirectory(string directoryPath)

        {

            List<string> assembliesPaths = new List<string>();

            DirectoryInfo directory = new DirectoryInfo(directoryPath);

            foreach (FileInfo file in directory.GetFiles())

            {

                if (file.Extension.Equals(".dll") ||

                    file.Extension.Equals(".exe") &&

                    !file.Name.Contains(".vshost"))

                {

                    assembliesPaths.Add(file.FullName);

                }

            }

            return assembliesPaths;

        }

 

        private void selectProjectOrSolutionButton_Click(object sender, RoutedEventArgs e)

        {

            string filePath = SelectProjectOrSolutionWithDialog();

            if (File.Exists(filePath))

            {

                projectOrSolutionPathTextBox.Text = filePath;

            }

        }

 

        private string SelectProjectOrSolutionWithDialog()

        {

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.CheckPathExists = true;

            openFileDialog.CheckFileExists = true;

            openFileDialog.Multiselect = false;

            openFileDialog.Filter = String.Concat("Все файлы проектов (*.sln;*.csproj)|*.sln;*.csproj|",

                            "Файлы решения (*.sln)|*.sln|",

                            "Файлы проектов C# (*.csproj)|*.csproj");

 

            DialogResult dialogResult = openFileDialog.ShowDialog();

            if (dialogResult == System.Windows.Forms.DialogResult.OK)

            {

                return openFileDialog.FileName;

            }

            else return String.Empty;

        }

 

        private void utilityForMetricsCalculationComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

        {

            string selecteedUtilityName = (string)((ComboBoxItem)e.AddedItems[0]).Content;

            if (selecteedUtilityName.Equals("Visual Studio Code Metrics PowerTool 10.0"))

            {

                CurrentUtility = CodeMetricsUtility.VisualStudioCodeMetrics;

            }

            else if (selecteedUtilityName.Equals("DrivenMetrics"))

            {

                CurrentUtility = CodeMetricsUtility.DrivenMetrics;

            }

 

            SetOutline();

        }

 

        private void SetOutline()

        {

            if (CurrentUtility.Equals(CodeMetricsUtility.VisualStudioCodeMetrics))

            {

                bool isUtilityInstalled = CheckIfUtilityIsInstalled();

                if (isUtilityInstalled)

                {

                    utilityErrorTextBlock.Visibility =

                        System.Windows.Visibility.Hidden;

                    mainWindow.Height = 349;

                    controlsCanvas.Margin = new Thickness(0, 122, 0, 0);

                }

                else

                {

                    utilityErrorTextBlock.Visibility =

                                           System.Windows.Visibility.Visible;

                    mainWindow.Height = 424;

                    controlsCanvas.Margin = new Thickness(0, 197, 0, 0);

                }

            }

        }

 

        private bool CheckIfUtilityIsInstalled()

        {

            if (File.Exists(@"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\Metrics.exe"))

            {

                return true;

            }

            else return false;

        }

 

        private void reportPathButton_Click(object sender, RoutedEventArgs e)

        {

            string filePath = SelectReportPathWithDialog();

            if (CurrentUtility == CodeMetricsUtility.DrivenMetrics &&

                (new FileInfo(filePath).Extension.Equals(".xml")))

            {

                PrepareXmlReportFileForDrivenMetrics(filePath);

            }

            reportPathTextBox.Text = filePath;

        }

 

        private void PrepareXmlReportFileForDrivenMetrics(string filePath)

        {

            //File.Create(

        }

 

        private string SelectReportPathWithDialog()

        {

            SaveFileDialog saveFileDialog = new SaveFileDialog();

            saveFileDialog.CheckPathExists = true;

            saveFileDialog.Filter = GetDialogFilter();

 

            DialogResult dialogResult = saveFileDialog.ShowDialog();

            if (dialogResult == System.Windows.Forms.DialogResult.OK)

            {

                return saveFileDialog.FileName;

            }

            else return String.Empty;

        }

 

        private string GetDialogFilter()

        {

            string dialogFilter = String.Empty;

            if (CurrentUtility == CodeMetricsUtility.DrivenMetrics)

            {

                dialogFilter = String.Concat("Все файлы (*.html;*.xml)|*.html;*.xml|",

                                           "HTML Файл (*.html)|*.html|",

                                           "XML Файл (*.xml)|*.xml");

            }

            else

            {

                dialogFilter = "XML Файл (*.xml)|*.xml";

            }

            return dialogFilter;

        }

    }

}

 

Висновок

 

Після виконання пркатичної роботи було досліджено методи та засоби створення програм, що розраховують значення метрик програмного забезпечення та отримано практичні навички з їх створення.


Информация о работе Обчислення значення метрик