gpt4 book ai didi

c# - 为什么我要重构这段代码,因为圈复杂度是 58

转载 作者:太空狗 更新时间:2023-10-29 22:08:28 26 4
gpt4 key购买 nike

我读到 CC 10 或更低的代码将是高度可维护的代码。但是我写的方法有CC 58。感谢VS 2010代码分析工具。我相信就我的理解而言,我编写的方法非常简单、可读和可维护。因此我不喜欢重构代码。但是由于 CC 高于可接受的水平,我想知道为什么要重构此方法。我正在学习一些东西来改进我的代码如果我有错误,请纠正我。这是代码。

private string MapBathRooms(string value)
{
double retValue = 0;
if (value == "1" || value == "One")
retValue = 1;
if (value == "OneAndHalf" || value == "1.5" || value == "1 1/2")
retValue = 1.5;
if (value == "2" || value == "Two")
retValue = 2;
if (value == "TwoAndHalf" || value == "2.5" || value == "2 1/2")
retValue = 2.5;
if (value == "3" || value == "Three")
retValue = 3;
if (value == "ThreeAndHalf" || value == "3.5" || value == "3 1/2")
retValue = 3.5;
if (value == "4" || value == "Four")
retValue = 4;
if (value == "FourAndHalf" || value == "4.5" || value == "4 1/2")
retValue = 4.5;
if (value == "5" || value == "Five" || value == "FourOrMore")
retValue = 5;
if (value == "FiveAndHalf" || value == "5.5" || value == "5 1/2")
retValue = 5.5;
if (value == "6" || value == "Six")
retValue = 6;
if (value == "SixAndHalf" || value == "6.5" || value == "6 1/2")
retValue = 6.5;
if (value == "7" || value == "Seven")
retValue = 7;
if (value == "SevenAndHalf" || value == "7.5" || value == "7 1/2")
retValue = 7.5;
if (value == "8" || value == "8+" || value == "Eight" || value == "SevenOrMore")
retValue = 8;
if (value == "EightAndHalf" || value == "8.5" || value == "8 1/2")
retValue = 8.5;
if (value == "9" || value == "Nine")
retValue = 9;
if (value == "NineAndHalf" || value == "9.5" || value == "9 1/2")
retValue = 9.5;
if(value == "10" || value == "Ten")
retValue = 10;
if (value == "TenAndHalf" || value == "10.5" || value == "10 1/2"
|| value == "10+" || value == "MoreThanTen" || value == "11")
retValue = 10.5;

if (retValue == 0)
return value;

return retValue.ToString();
}

最佳答案

为什么不直接有一个 Dictionary<string, double> ?这将使 代码更简单 - 您已将 数据 从查找代码中分离出来。

private static readonly Dictionary<string, double> BathRoomMap =
new Dictionary<string, double>
{
{ "1", 1 },
{ "One", 1 },
{ "OneAndHalf", 1.5 },
{ "1.5", 1.5 },
{ "1 1/2", 1.5 }
// etc
};

private static string MapBathRooms(string value)
{
double result;
if (!BathRoomMap.TryGetValue(value, out result))
{
return value; // Lookup failed
}
return result.ToString();
}

事实上,您可以通过避免调用 ToString 来使其更简单 - 只需将其设为 Dictionary<string, string> :

private static readonly Dictionary<string, string> BathRoomMap =
new Dictionary<string, string>
{
// Note: I've removed situations where we'd return the
// same value anyway... no need to map "1" to "1" etc
{ "One", "1" },
{ "OneAndHalf", "1.5" },
{ "1 1/2", "1.5" }
// etc
};

private static string MapBathRooms(string value)
{
string result;
if (!BathRoomMap.TryGetValue(value, out result))
{
return value; // Lookup failed
}
return result;
}

正如 ChrisF 所说,您也可以从文件或其他资源中读取它。

这样做的好处:

  • 避免错误和扩展容易得多,IMO。从输入到输出有一个简单的 1:1 映射,而不是可能出错的逻辑
  • 它将数据从逻辑中分离出来
  • 它允许您在需要时从其他地方加载数据。
  • 因为集合初始化器使用 Dictionary<,>.Add ,如果您有重复的键,您会在初始化类型时遇到异常,因此您会立即发现错误。

这样说 - 您曾经会考虑从基于字典的版本重构为“大量真实代码”版本吗?我当然不会。

如果您真的非常想在方法中包含所有内容,您总是可以使用 switch 语句:

private static string MapBathRooms(string value)
{
switch (value)
{
case "One":
return "1";
case "OneAndHalf":
case "1 1/2":
return "1.5";
...
default:
return value;
}
}

我自己仍然会使用字典形式...但这确实有一个非常小的优势,即重复检测被带到编译时。

关于c# - 为什么我要重构这段代码,因为圈复杂度是 58,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com