0 .net c# refactoring switch-statement
我有一个大的 switch 语句,它的圈复杂度为 31,它必须重构为至少 25。这是错误:严重性代码描述项目文件行抑制状态抑制状态错误 CA1502 'Worker.StartListening()' has a cyclomatic复杂度为 31。重写或重构方法以将复杂度降低到 25。
谢谢!
这是代码:
public void StartListening()
{
var consumerSettingsSection= this.configurationManager.GetSection<ConsumerSettingsSection>("appZ/consumer");
foreach (var setting in consumerSettingsSection.QueueSettings)
{
var eventType = ConsumedEventType.NotSpecified;
switch (setting.Name)
{
case "A":
eventType = ConsumedEventType.A;
break;
case "B":
eventType = ConsumedEventType.B;
break;
case "C":
eventType = ConsumedEventType.C;
break;
case "D":
eventType = ConsumedEventType.D;
break;
case "E":
eventType = ConsumedEventType.E;
break;
case "F":
eventType = ConsumedEventType.F;
break;
case "G":
eventType = ConsumedEventType.G;
break;
case "H":
eventType = ConsumedEventType.H;
break;
case "I":
eventType = ConsumedEventType.I;
break;
case "J":
eventType = ConsumedEventType.J;
break;
case "K":
eventType = ConsumedEventType.K;
break;
case "L":
eventType = ConsumedEventType.L;
break;
default:
eventType = ConsumedEventType.NotSpecified;
break;
}
var consumer = new ChannelConsumer(setting, eventType);
consumer.MessageConsumed += this.Consumer_MessageConsumed;
consumer.StartConsuming();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用Enum.TryParse方法简化代码:
if (Enum.TryParse(setting.Name, true, out eventType))
return eventType;
else
return ConsumedEventType.NotSpecified;
Run Code Online (Sandbox Code Playgroud)
您可以将setting.Name字符串解析为ConsumedEventType,使用解析的值,否则返回ConsumedEventType.NotSpecified值。
这比维护值列表更容易。根据上面的代码,您可以编写类似的内容
foreach (var setting in consumerSettingsSection.QueueSettings)
{
var eventType = ConsumedEventType.NotSpecified;
if (Enum.TryParse(setting.Name, true, out ConsumedEventType parsedEvent))
{
eventType = parsedEvent;
}
//rest of code
}
Run Code Online (Sandbox Code Playgroud)
或者更容易
if (!Enum.TryParse(setting.Name, true, out ConsumedEventType eventType))
{
eventType = ConsumedEventType.NotSpecified;
}
Run Code Online (Sandbox Code Playgroud)
请记住,out从 C# 7 开始支持内联变量