我对编码很陌生,而且我从未理解做以下事情的正确方法:
if (something == true) {
DoSomething();
} else {
if (something2 == true) {
DoSomething2();
}
DoSomethingAnyways();
}
我听说使用else if
是正确的方法,但如果我使用DoSomethingAnyways();
,如何执行else if
?
基本上我要问的是,如果使用其他的话,我该如何写这个呢?并且有相同的效果?
if (something == true) {
DoSomething();
} else if (something2 == true) {
DoSomething2();
DoSomethingAnyways(); //<-- Where do I put this line of code?
}
答案 0 :(得分:3)
假设你想要
然后你的代码就可以了。
if (something == true) {
DoSomething();
} else {
if (something2 == true) {
DoSomething2();
}
DoSomethingAnyways();
}
使用&#34;否则如果&#34;
如果您不想使用嵌套ifs,您可以编写此代码,其效果与原始代码相同:
if (something == true) {
DoSomething();
} else if (something2 == true) {
DoSomething2();
DoSomethingAnyways();
} else {
DoSomethingAnyways();
}
然而,这在维护方面增加了复杂性。想象一下,在几个月内,您需要添加代码以在DoSomethingAnyways()之前执行操作。您可能需要维护两个分支 - &#34;否则如果&#34;和#34;其他&#34;分支 - 使您的代码变得越来越复杂。您可能会忘记更新一个分支,因为依赖关系不再明显 - 这会引入一个错误。
代码复杂性
嵌套ifs会使您的代码难以阅读 - 而且有一个指标:圈复杂度(通过代码的独立路径)。但是,在你的情况下,圈复杂度是相同的,无论你使用else-ifs还是else使用嵌套的if - 你有3个独立的路径。一般来说,一旦达到10,你应该考虑拆分你的代码,所以你仍然远离它。在这种情况下,圈复杂度很低,你的代码很容易掌握,所以我不担心。
我个人觉得你原来的代码&#34;更漂亮&#34;而不是else-if / else,因为它更好地描述了依赖关系(你调用&#34; DoSomethingAnyways()&#34;无论something2是否为真,但只有当某些东西是假的时你才会做整个DoSomething2 / DoSomethingAnyways)。
将else分支信息重构为函数
如果您担心嵌套ifs太多,请将else分支信息重构为一个新函数:
if (something == true) {
DoSomething();
} else {
DoSomething3(something2);
}
function DoSomething3(something2) {
if (something2 == true) {
DoSomething2();
}
DoSomethingAnyways();
}
调用函数的开销很小,所以我不会把它带到极端 - 使用你自己的判断。如果你认为&#34;哦,我想知道我是否仍然会在一年内得到这个&#34;,那么你应该减少复杂性(并记录你的工作,使用评论)。
无论哪种方式,你都可以使用else和嵌套的if或者函数 - 几个月内你会阅读的两个代码片段,并且可能仍然可以快速掌握依赖性,并且你不会运行在将来更改代码时忘记更新一个分支的风险。
答案 1 :(得分:1)
如果您希望DoSomethingAnyways()
仅在DoSomething()
没有触发时触发,而不关心DoSomething2()
是否会触发,而不是像这样重写您的第一个示例:< / p>
if (something == true) {
DoSomething();
} else if (something2 == true) {
DoSomething2();
}
if(something != true){
DoSomethingAnyways();
}
如果你依赖于真值,你也可以取出==
和!=
并将其写成:
if (something) {
DoSomething();
} else if (something2) {
DoSomething2();
}
if(!something){
DoSomethingAnyways();
}
答案 2 :(得分:1)
你做完这件事的方式并没有错。 else if
适用于以下情况:
if (foo) {
doSomething()
}
if (!foo && bar) {
doSomethingElse()
}
if (!foo && !bar) {
nothingWorked()
}
与此相同:
if (foo) {
doSomething()
} else if (bar) {
doSomethingElse()
} else {
nothingWorked()
}
但是你的例子并不适合这种模式。
另见part of the jQuery source。不太相同,但相似。
答案 3 :(得分:0)
如果你想让DoSomethingAnyways()一直被解雇,你可以把它放在其他地方,如下:
if (something == true) {
DoSomething();
} else if (something2 == true) {
DoSomething2();
}
DoSomethingAnyways();
答案 4 :(得分:0)
简短而简单的方法是将something2
和something
的逻辑分开。
something ? DoSomething() : DoSomethingAnyway();
if (something2) {
DoSomething2();
}
答案 5 :(得分:-1)
如果你只使用这些if else块 ,你可以像这样写(我认为这个解决方案更清晰):
void method() {
if (something == true) {
DoSomething();
return;
}
if (something2 == true) {
DoSomething2();
}
DoSomethingAnyways();
}
否则,如果你想让DoSomethingAnyways()真的运行,即使DoSomething2()抛出异常,它也可以写成try / finally块:
if (something == true) {
DoSomething();
}
try {
if (something2 == true) {
DoSomething2();
}
} finally {
DoSomethingAnyways();
}
无论如何,我同意 gcampbell ,你的第一段代码听起来不错。