我在正在处理的代码库中遇到了一个switch语句,并尝试着找出如何用更好的方式替换它,因为 switch语句被认为是一种代码异味。然而,我阅读了几篇关于替换 switch 语句的stackoverflow帖子,似乎想不出一种有效的方法来替换这个特定的switch语句。
这让我想知道这个特定的switch语句是否可以接受,以及是否有特定情况下switch语句被认为是合适的。
在我的情况下,我正在处理的代码(自然地略作混淆)如下:
有人能建议一种消除这个开关的方法吗?或者这是使用开关的适当方式吗?如果是,还有其他适当使用开关语句的方法吗?我真的很想知道它们何时适用,以便我不会因为在某些情况下被认为是一种味道而试图消除我遇到的每一个开关声明。
这让我想知道这个特定的switch语句是否可以接受,以及是否有特定情况下switch语句被认为是合适的。
在我的情况下,我正在处理的代码(自然地略作混淆)如下:
private MyType DoSomething(IDataRecord reader)
{
var p = new MyType
{
Id = (int)reader[idIndex],
Name = (string)reader[nameIndex]
}
switch ((string) reader[discountTypeIndex])
{
case "A":
p.DiscountType = DiscountType.Discountable;
break;
case "B":
p.DiscountType = DiscountType.Loss;
break;
case "O":
p.DiscountType = DiscountType.Other;
break;
}
return p;
}
有人能建议一种消除这个开关的方法吗?或者这是使用开关的适当方式吗?如果是,还有其他适当使用开关语句的方法吗?我真的很想知道它们何时适用,以便我不会因为在某些情况下被认为是一种味道而试图消除我遇到的每一个开关声明。
更新:在 Michael的建议下,我搜索了一下这个逻辑的重复,并发现其他类中的某个人已经创建了逻辑,有效地使整个开关语句变得多余。因此,在这个特定代码的上下文中,开关语句是不必要的。然而,我的问题更多地涉及到开关语句在代码中的适当性以及我们是否应该总是尝试替换它们,无论何时发现它们,所以在这种情况下,我倾向于接受这个开关语句是适当的答案。