Gotophobia在开关的情况下
我有下面的代码:Gotophobia在开关的情况下
switch (curState.ToString())
{
case "Processed":
... *(couple code lines)*
break;
case "NotPresent":
if (someValue == null)
{
goto case "Undefined";
}
goto case "Processed";
case "Undefined":
break;
}
有人告诉我,这是更好地界定方法“NotPresent”的情况下,并调用它,而不是goto case "Processed"
。这是Gotophobia还是合理的? 我喜欢我的变体。
任何答案都是猜测和意见。但我相信这是普遍的观点(和写在几个地方的Internet上)的goto
2个可以接受的用途是:
- 打破了嵌套的循环
- 通过一个开关的情况下下降到另一个,因为C#没有按不允许有任何代码的案例落入下一个条件。
在你的情况,你实际上是应用逻辑和基于条件跳转。 对我来说,这不是goto的可接受的用途,应该重构。
当然,您的代码有效,并且您知道goto
的负面含义。所以无论你决定什么都将是一个明智的决定。我会说做出决定,直到需要出现时才放心。
很好的答案,但是#2点并不完全准确,如果一个案例没有代码,那么通过罚款。即'case state1:case state2:' – Phaeze
好点,我会澄清。 – Jonesopolis
我非常喜欢你最后一段的想法。但是第一个是这样的:“那些聪明的人告诉goto只适用于两种情况”。我得到了描述某些格式内部状态的规范,并且我按照使用顺序从一个到另一个。规范说如果someValue为null,就像在未定义的情况下一样,如果nt null像处理过的情况那样。这是非常清楚的..我不需要魔术与falgs或reodering可能的状态秩序混乱。为什么我不在意别人告诉邻居如果在这里很清楚和容易被忽视。 –
我喜欢我的变种。
我不喜欢您的变种。当使用它们时,Gotos是合适的,可以让你编写比您无法编写更清晰的代码。在这种情况下,我认为这个标准并没有得到满足。
有人告诉我,最好定义方法为“NotPresent”的情况下,并调用它而不是goto情况下“处理”。这是Gotophobia还是合理的?
你的意思是你被告知这将是更好地定义了"Processed"
案件身体的方法,要在这种情况下,无条件地调用和有条件的"Not Present"
情况下,从而避免一个goto
?我认为这不会有多大帮助。只要"Processed"
箱体只包含一些陈述,我发现它更清楚地保留在switch
的身体中。
我自己,我可能会重写你switch
像这样:
switch (curState.ToString())
{
case "NotPresent":
if (someValue != null)
{
goto case "Processed";
}
break;
case "Processed":
... *(couple code lines)*
break;
}
有一个在转移到一个什么都不做的情况下,是没有意义的 - 而不是简单地无所作为摆在首位 - 所以我删除那goto
一共。我把“Present”之上的“NotPresent”情况移到了“Present”之上,因为这使得这一对让人联想到带有两个箱标的单个开关部分。
我也删除空的情况下"Undefined"
,但如果它是需要强调指出的curState.ToString()
没有其他价值预期,那么我反而保留这种情况下,用适当的断言/投/日志添加一个default
情况。
,而不是试图迫使你的逻辑变成switch
声明,为什么不使用更简单的方法,因为你什么也不做你的不确定状态:
if ((curState.ToString() == "Processed") ||
((curState.ToString() == "NotPresent") && someValue != null))
{
... *(couple code lines)*
}
有很多资源,在那里已经解释的时候,当不使用'goto'语句。这里有一个很好的例子:http://*.com/a/11906082/3922214 –
如果你不想在一个单独的方法中封装细节,你可以随时设置布尔标志并在开关后处理处理声明。我真的认为'goto'应该从来没有被包含在C#中,它应该已经被弃用,然后淘汰VB.NET。我在'goto'中遇到的主要问题是它会引起跳跃式的滑动。没有流量。 –
你是否打算默认情况下什么都不做?我知道这类事情的意见是主观的,但我发现你在这里发布的代码很难阅读。 –