Автор работы: Пользователь скрыл имя, 09 Мая 2013 в 15:14, практическая работа
Мета практичної роботи – дослідження методів та засобів створення програм, що розраховують значення метрик програмного забезпечення та отримання практичних навичок з їх створення.
Завдання
Написати програму, яка розраховує наступні метрики програмного забезпечення: Maintainability index, Depth of Inheritance, Cyclomatic Complexity, Lines of Code, Class Coupling. Порівняти отримані метрики з розрахованими у Visual Studio.
М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/
// and Visual
Studio Code Metrics PowerTool 10.0 http://www.microsoft.com/
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.
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\
foreach (DirectoryInfo directory in rootDirectory.GetDirectories()
{
if (directory.Name[0].Equals('v')
{
lastDotnetVersionsDirectory = directory;
}
}
string msbuildPath = System.IO.Path.Combine(
"MSBuild.exe");
return msbuildPath;
}
private void CalculateMetricsButton_Click(o
{
BuildProject(
string directoryPath = System.IO.Path.
ProjectType projectType = GetProjectType(
List<string> assembliesPaths = GetAssembliesPaths(
if (CurrentUtility == CodeMetricsUtility.
{
CalculateMetricsWithVSCodeMetr
}
else if (CurrentUtility == CodeMetricsUtility.
{
ReportFactory reportFactory = new ReportFactory();
string reportFilePath = reportPathTextBox.Text;
IReport report = reportFactory.ResolveReport(Re
//IReport htmlReport = new HtmlFailedReport(new FileWriter(), reportFilePath);
//IReport xmlReport = new Driven.Metrics.Reporting.
// @"C:\Users\AndrijL.Bykadorov\
List<IMetricCalculator> metrics = new List<IMetricCalculator>(){
new NumberOfLinesCalculator(20),
new ILCyclomicComplextityCalculato
};
var numberOfLines = new NumberOfLinesCalculator(20);
var cyclomicCompexity = new ILCyclomicComplextityCalculato
DrivenMetrics drivenMetrics = new DrivenMetrics.Factory().
assembliesPaths.ToArray(),
metrics.ToArray(),
reportFilePath,
report);
drivenMetrics.
}
}
private void CalculateMetricsWithVSCodeMetr
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(
{
Process metricsCalculationProcess = Process.Start(
metricsCalculationProcess.
}
}
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(ProjectTyp
{
DirectoryInfo rootDirectory = new DirectoryInfo(
foreach (DirectoryInfo directory in rootDirectory.GetDirectories()
{
string nestedBinDirectoryPath = System.IO.Path.Combine(
string nestedDebugDirectoryPath = System.IO.Path.Combine(
if (Directory.Exists(
{
assembliesPaths.AddRange(
GetAllAssembliesPathsInDirecto
}
}
}
else if (projectType.Equals(ProjectTyp
{
DirectoryInfo rootDirectory = new DirectoryInfo(
string nestedBinDirectoryPath = System.IO.Path.Combine(
string nestedDebugDirectoryPath = System.IO.Path.Combine(
if (Directory.Exists(
{
assembliesPaths.AddRange(
GetAllAssembliesPathsInDirecto
}
}
return assembliesPaths;
}
private List<string> GetAllAssembliesPathsInDirecto
{
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.
}
}
return assembliesPaths;
}
private void selectProjectOrSolutionButton_
{
string filePath = SelectProjectOrSolutionWithDia
if (File.Exists(filePath))
{
projectOrSolutionPathTextBox.
}
}
private string SelectProjectOrSolutionWithDia
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.CheckPathExists = true;
openFileDialog.CheckFileExists = true;
openFileDialog.Multiselect = false;
openFileDialog.Filter = String.Concat("Все файлы проектов
(*.sln;*.csproj)|*.sln;*.
"Файлы решения (*.sln)|*.sln|",
"Файлы проектов C# (*.csproj)|*.csproj");
DialogResult dialogResult = openFileDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogRes
{
return openFileDialog.FileName;
}
else return String.Empty;
}
private void utilityForMetricsCalculationCo
{
string selecteedUtilityName = (string)((ComboBoxItem)e.
if (selecteedUtilityName.Equals("
{
CurrentUtility = CodeMetricsUtility.
}
else if (selecteedUtilityName.Equals("
{
CurrentUtility = CodeMetricsUtility.
}
SetOutline();
}
private void SetOutline()
{
if (CurrentUtility.Equals(CodeMet
{
bool isUtilityInstalled = CheckIfUtilityIsInstalled();
if (isUtilityInstalled)
{
utilityErrorTextBlock.
System.Windows.Visibility.
mainWindow.Height = 349;
controlsCanvas.Margin = new Thickness(0, 122, 0, 0);
}
else
{
utilityErrorTextBlock.
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.
(new FileInfo(filePath).Extension.
{
PrepareXmlReportFileForDrivenM
}
reportPathTextBox.Text = filePath;
}
private void PrepareXmlReportFileForDrivenM
{
//File.Create(
}
private string SelectReportPathWithDialog()
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.CheckPathExists = true;
saveFileDialog.Filter = GetDialogFilter();
DialogResult dialogResult = saveFileDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogRes
{
return saveFileDialog.FileName;
}
else return String.Empty;
}
private string GetDialogFilter()
{
string dialogFilter = String.Empty;
if (CurrentUtility == CodeMetricsUtility.
{
dialogFilter = String.Concat("Все файлы (*.html;*.xml)|*.html;*.xml|",
}
else
{
dialogFilter = "XML Файл (*.xml)|*.xml";
}
return dialogFilter;
}
}
}
Висновок
Після виконання пркатичної роботи було досліджено методи та засоби створення програм, що розраховують значення метрик програмного забезпечення та отримано практичні навички з їх створення.