如何简化 switch 语句以降低圈复杂度

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)

Pav*_*ski 7

您可以尝试使用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 开始支持内联变量