如何重构一组丑陋的 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";
}
问题是它使用 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
接口并为每个情况实现策略。这是更最佳实践。