/
al_phoenix
/
Homework
Обзор
Документация
Войти
/
al_phoenix
/
Homework
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Program.cs
116 строк
5 KB
al_phoenix
update: Program.cs
18 май 2026, 23:00
Верифицирован
18 май 2026, 23:00
736d37f
Код
Авторство
О чём код?
using System; using System.IO; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace CycloComplexityApp { class Program { static void Main(string[] args) { Console.WriteLine("=== Анализатор цикломатической сложности кода ==="); if (args.Length == 0) { Console.WriteLine("Ошибка: Укажите путь к файлу .cs в качестве аргумента."); Console.WriteLine(@"Пример: CycloComplexityApp.exe ""C:\StudentFiles\Task.cs"""); return; } string filePath = args[0]; if (!File.Exists(filePath)) { Console.WriteLine($"Ошибка: Файл не найден по пути '{filePath}'"); return; } try { string code = File.ReadAllText(filePath); AnalyzeComplexity(code); } catch (Exception ex) { Console.WriteLine($"Произошла ошибка при чтении файла: {ex.Message}"); } } static void AnalyzeComplexity(string code) { SyntaxTree tree = CSharpSyntaxTree.ParseText(code); CompilationUnitSyntax root = tree.GetCompilationUnitRoot(); // Находим все методы, конструкторы, геттеры и сеттеры var methods = root.DescendantNodes().OfType<BaseMethodDeclarationSyntax>(); if (!methods.Any()) { Console.WriteLine("В файле не найдено методов для анализа."); return; } foreach (var method in methods) { string methodName = GetMethodName(method); int complexity = CalculateCyclomaticComplexity(method); Console.WriteLine($"Метод: {methodName}"); Console.WriteLine($"Цикломатическая сложность: {complexity} ({GetComplexityRating(complexity)})"); Console.WriteLine(new string('-', 40)); } } static string GetMethodName(BaseMethodDeclarationSyntax method) { if (method is MethodDeclarationSyntax m) return m.Identifier.Text; if (method is ConstructorDeclarationSyntax c) return $"{c.Identifier.Text} (Конструктор)"; return method.Kind().ToString(); } static int CalculateCyclomaticComplexity(SyntaxNode methodNode) { // Базовая сложность любого метода равна 1 int complexity = 1; // Ищем узлы, которые создают новые ветвления в коде var controlFlowNodes = methodNode.DescendantNodes().Where(node => node is IfStatementSyntax || node is ForStatementSyntax || node is ForEachStatementSyntax || node is WhileStatementSyntax || node is DoStatementSyntax || node is SwitchLabelSyntax || // Исправлено: считает каждый case и default node is ConditionalExpressionSyntax || // Тернарный оператор (?:) node is CatchClauseSyntax // Блоки перехвата исключений ); complexity += controlFlowNodes.Count(); // Также учитываем логические операторы && и ||, так как они создают скрытые ветвления var tokens = methodNode.DescendantTokens().Where(token => token.IsKind(SyntaxKind.AmpersandAmpersandToken) || token.IsKind(SyntaxKind.BarBarToken) ); complexity += tokens.Count(); return complexity; } static string GetComplexityRating(int complexity) { if (complexity <= 10) return "Низкая (Хороший, простой код)"; if (complexity <= 20) return "Умеренная (Сложный код, требуется внимание)"; if (complexity <= 50) return "Высокая (Нестабильный код, нужно провести рефакторинг!)"; return "Катастрофическая (Крайне опасный код, срочно переписать!)"; } } }