如何重构一组丑陋的 if 语句

本文关键字:if 语句 一组 何重构 重构 | 更新日期: 2023-09-27 18:30:47

我有这组 If 语句,它们工作正常,但看起来有点丑。有什么方法可以把它加油而不是使用大丑陋的 if 语句吗?问题是它使用 string.contains,这使得实现字典有点困难,我尝试过并失败了:(

在这里:

foreach (var Item in Stuff)
            {
                var loweredQuoteItem = quoteItem.Name.ToLower();
                if (loweredQuoteItem.Contains("one"))
                    Item.InsurerNameShort = "Item One";
                if (loweredQuoteItem.Contains("two"))
                    Item.InsurerNameShort = "Item Two";
                if (loweredQuoteItem.Contains("chaucer"))
                    Item.InsurerNameShort = "Chaucer";
                if (loweredQuoteItem.Contains("three"))
                    Item.InsurerNameShort = "Item Three";
                if (loweredQuoteItem.Contains("four"))
                    Item.InsurerNameShort = "Item Four";
                if (loweredQuoteItem.Contains("five"))
                    Item.InsurerNameShort = "Item Five";
               }

如何重构一组丑陋的 if 语句

问题是它使用 string.contains,这使得实现字典有点困难,我尝试过但失败了:(

然后我猜你实现得不正确。以下是您应该做的:

  • 构建字典。
  • 将"项目一"
  • 作为键"一"的值
  • 将"项目二"作为键"二"的值
  • 将"项目二"作为关键"乔叟"的值
  • 等。。。
  • 在当前循环中,一旦您有了loweredQuoteItem,就会遍历字典。
    • 如果字典包含 innerLoopKey ,请将Item.InsurerNameShort设置为 innerLoopValue(并可选择中断)

请确保在foreach (var Item in Stuff)循环之外构造此字典,以获得更好的性能。

为了简化你的方法,你可以使用内部操作。这样,您的方法将如下所示

        Action<string,string, Action> method = (source, search, action) => {if (source.Contains(search)) action(); };
        method(loweredQuoteItem, "one", () => Item.InsurerNameShort = "Item One");
        method(loweredQuoteItem, "two", () => Item.InsurerNameShort = "Item Two");
        method(loweredQuoteItem, "chaucer", () => Item.InsurerNameShort = "Item Chaucer");

如果没有lambda并且您的逻辑非常简单,那么您可以将IF语句移动到不同的方法中:

    public void SetValueIfContains(string source, string search, string value, MyClass item)
    {
        if (source.Contains(search))
        {
            item.InsurerNameShort = value;
        }
    }
    public void YourFunction()
    {
        var loweredQuoteItem = quovteItem.Name.ToLower();
        SetValueIfContains(loweredQuoteItem, "one", "Item One", Item);
        SetValueIfContains(loweredQuoteItem, "two", "Item Two", Item);
        SetValueIfContains(loweredQuoteItem, "Chaucer", "Item chaucer", Item);
    }

如果语句IF逻辑很复杂,您可以定义ISrategy接口并为每个情况实现策略。这是更最佳实践。