如何降低for...if循环中的圈复杂度#c#
How to reduce cyclomatic complexity in for...if loop in c#
我有一个简单的代码来打印 CSV 文件的行和列。这是我的代码,对于这个 class,圈复杂度是 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);
}
}
如何更改循环以降低整体圈复杂度?
这段代码做同样的事情:
public static void PrintCSVRows(string[] lines)
{
foreach (var columns in lines
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => x.Split(','))
.Where(x => x.Length > 1 && !string.IsNullOrEmpty(x[1]))
.ToArray())
{
PrintCSVCol(columns[1]);
}
}
或者
public static void PrintCSVRows(string[] lines)
{
foreach (var columns in lines
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => x.Split(','))
.Where(x => x.Length > 1)
.Select(x => x.Skip(1).First())
.Where(x => !string.IsNullOrEmpty(x)))
{
PrintCSVCol(columns);
}
}
如果您的目标只是降低圈复杂度,您可以提取如下方法:
/// <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。
但是,圈复杂度只是一个指标,并不一定意味着这段代码更好。
我有一个简单的代码来打印 CSV 文件的行和列。这是我的代码,对于这个 class,圈复杂度是 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);
}
}
如何更改循环以降低整体圈复杂度?
这段代码做同样的事情:
public static void PrintCSVRows(string[] lines)
{
foreach (var columns in lines
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => x.Split(','))
.Where(x => x.Length > 1 && !string.IsNullOrEmpty(x[1]))
.ToArray())
{
PrintCSVCol(columns[1]);
}
}
或者
public static void PrintCSVRows(string[] lines)
{
foreach (var columns in lines
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => x.Split(','))
.Where(x => x.Length > 1)
.Select(x => x.Skip(1).First())
.Where(x => !string.IsNullOrEmpty(x)))
{
PrintCSVCol(columns);
}
}
如果您的目标只是降低圈复杂度,您可以提取如下方法:
/// <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。
但是,圈复杂度只是一个指标,并不一定意味着这段代码更好。