我在我正在做的代码库中遇到了一个开关语句,我正在试图找出如何用自开关语句被认为是代码气味。以来更好的东西来替换它。但是,在阅读了关于替换 交换机 语句的堆叠溢出的文章之后,我似乎想不出一种有效的方法来替换这个特定的开关语句。
这让我想知道这个特定的开关语句是否正常,以及是否有特殊的情况认为开关语句是合适的。
在我的例子中,我正在挣扎的代码(自然有点模糊)如下所示:
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;
}
有人能提出一个消除这个开关的方法吗?或者这是一个适当的开关使用吗?如果是的话,开关语句还有其他合适的用途吗?我真的很想知道它们在哪里合适,这样我就不会浪费太多的时间来消除我遇到的每一个开关语句,因为它们在某些情况下被认为是一种气味。
更新:在的建议下,我对这个逻辑的复制做了一些搜索,发现有人在另一个类中创建了逻辑,这实际上使整个迈克尔语句变得多余。因此,在这个特定代码的上下文中,开关语句是不必要的。然而,我的问题更多的是关于代码中的switch语句是否合适,以及我们是否应该总是在找到它们时尝试替换它们,所以在这种情况下,我倾向于接受这样的答案,即这个switch语句是合适的。
发布于 2009-07-01 23:49:17
这是对开关状态的适当使用,因为它使选择具有可读性,并且易于添加或减法。
发布于 2009-07-01 23:52:27
Switch语句(特别是长语句)被认为是不好的,不是因为它们是switch语句,而是因为它们的存在意味着需要重构。
开关语句的问题是,它们会在代码中产生分支(就像if语句一样)。每个分支必须单独进行测试,每个分支中的每个分支和.好吧,你明白了。
尽管如此,以下文章对于使用switch语句有一些良好的实践:
http://elegantcode.com/2009/01/10/refactoring-a-switch-statement/
就您的代码而言,上面链接中的文章建议,如果要执行从一种枚举到另一种枚举的这种类型的转换,您应该将您的开关放在自己的方法中,并使用返回语句而不是中断语句。我以前也这样做过,代码看起来要干净得多:
private DiscountType GetDiscountType(string discount)
{
switch (discount)
{
case "A": return DiscountType.Discountable;
case "B": return DiscountType.Loss;
case "O": return DiscountType.Other;
}
}
发布于 2009-07-01 23:52:41
我认为为了改变代码而改变代码并不是最好的时间。更改代码以使其更易读、更快、更有效率等是有意义的。不要仅仅因为有人说你在做“臭事”就改变它。
-Rick
https://stackoverflow.com/questions/1071856
复制相似问题