首页 > 解决方案 > 如何在 C# 中的 for...if 循环中降低圈复杂度

问题描述

我有一个简单的代码来打印 CSV 文件的行和列。这是我的代码,这个类的圈复杂度是 6。我想将它降低到尽可能低。

class PrintCSV
{
    /// <summary>
    /// Print all the rows of CSV File 
    /// </summary>
    /// <param name="lines"> </param>

    public static void PrintCSVRows(string[] lines)
    {

        foreach (string line in lines)
        {
            if (!string.IsNullOrEmpty(line) && line.Contains(','))
            {
                string columns = line.Split(',')[1];
                if (!string.IsNullOrEmpty(columns))
                {
                    PrintCSVCol(columns);
                }

            }
        }
    }

    /// <summary>
    /// Prints the column of CSV File
    /// </summary>
    /// <param name="columns"></param>

    public static void PrintCSVCol(string columns)
    {
        Console.WriteLine("{0}", columns);
    }

}

如何更改循环以降低整体圈复杂度?

标签: c#cyclomatic-complexity

解决方案


如果您的目标只是降低圈复杂度,您可以提取如下方法:

/// <summary>
/// Print all the rows of CSV File 
/// </summary>
/// <param name="lines"> </param>
public static void PrintCSVRows(string[] lines)
{
    foreach (string line in lines)
    {
        PrintLine(line);
    }
}

private static void PrintLine(string line)
{
    if (IsValidLine(line))
    {
        string columns = line.Split(',')[1];
        PrintCSVCol(columns);
    }
}

private static bool IsValidLine(string line)
{
    return !string.IsNullOrEmpty(line) && line.Contains(',');
}

/// <summary>
/// Prints the column of CSV File
/// </summary>
/// <param name="columns"></param>
public static void PrintCSVCol(string columns)
{
    if (!string.IsNullOrEmpty(columns))
    {
        Console.WriteLine("{0}", columns);
    }
}

根据 Visual Studio,使用此代码,每个方法的圈复杂度为 2。 圈复杂度

然而,圈复杂度只是一个度量,并不一定意味着这个代码更好


推荐阅读