重构空的 if 语句
Refactoring empty if-statements
我目前正在做一个项目,我需要删除一个 class,它正被不同的其他 classes 使用。在某些情况下,我可以删除包含 class 的一行代码,它永远不会影响程序的功能,但在某些情况下,您想要删除 class在 if 语句中。主要问题是,一旦我删除了由 class 组成的代码行,它在 if 语句中的位置,它将是一个空的 if 语句,这将违反声纳。
除了否定其中一个语句的条件之外,还有其他方法可以重构一个空的 if 语句吗?因为当我只是否定条件时,代码的可读性降低了。
例如:
if((example_A >= 0) && (condition_A))
{
removeThisClass();
}
else if((example_B >= )) && (condition_B))
{
doSomething();
}
else
{
doAnything();
}
重构:
if(!((example_A >= 0) && (condition_A)) && ((example_B >= )) && (condition_B)))
{
doSomething();
}
else
{
doAnything();
}
您可以将此代码放在单独的方法中 (https://refactoring.com/catalog/extractFunction.html),然后这样写:
public void DoSomeStuff() {
if((example_A >= 0) && (condition_A))
return;
if((example_B >= )) && (condition_B)) {
doSomething();
return;
}
doAnything();
}
如果我没理解错的话,removeThisClass();
行应该删除,你不希望留下这样的空块:
if((example_A >= 0) && (condition_A))
{
}
else if((example_B >= )) && (condition_B))
{
doSomething();
}
else
{
doAnything();
}
为了不进行两次 "A" 测试,您需要否定条件,例如像这样:
if ((example_A < 0) || ! (condition_A))
{
if ((example_B >= )) && (condition_B))
{
doSomething();
}
else
{
doAnything();
}
}
您重构的代码是错误的,因为如果 "A" 条件为真,原始代码将执行 removeThisClass();
,这意味着它现在应该什么也不做,但您的代码将调用 doAnything();
当 "A" 为真时。
您可以发表评论。声纳 should accept that 它也可以帮助 reader.
void doSomething() {
for (int i = 0; i < 42; i++) // Non-Compliant
{
}
for (int i = 0; i < 42; i++); // Compliant
if (myVar == 4) // Compliant - contains a comment
{
// Do nothing because of X and Y
}
else // Compliant
{
doSomething();
}
try // Non-Compliant
{
}
catch (Exception e) // Compliant
{
// Ignore
}
}
我目前正在做一个项目,我需要删除一个 class,它正被不同的其他 classes 使用。在某些情况下,我可以删除包含 class 的一行代码,它永远不会影响程序的功能,但在某些情况下,您想要删除 class在 if 语句中。主要问题是,一旦我删除了由 class 组成的代码行,它在 if 语句中的位置,它将是一个空的 if 语句,这将违反声纳。
除了否定其中一个语句的条件之外,还有其他方法可以重构一个空的 if 语句吗?因为当我只是否定条件时,代码的可读性降低了。
例如:
if((example_A >= 0) && (condition_A))
{
removeThisClass();
}
else if((example_B >= )) && (condition_B))
{
doSomething();
}
else
{
doAnything();
}
重构:
if(!((example_A >= 0) && (condition_A)) && ((example_B >= )) && (condition_B)))
{
doSomething();
}
else
{
doAnything();
}
您可以将此代码放在单独的方法中 (https://refactoring.com/catalog/extractFunction.html),然后这样写:
public void DoSomeStuff() {
if((example_A >= 0) && (condition_A))
return;
if((example_B >= )) && (condition_B)) {
doSomething();
return;
}
doAnything();
}
如果我没理解错的话,removeThisClass();
行应该删除,你不希望留下这样的空块:
if((example_A >= 0) && (condition_A))
{
}
else if((example_B >= )) && (condition_B))
{
doSomething();
}
else
{
doAnything();
}
为了不进行两次 "A" 测试,您需要否定条件,例如像这样:
if ((example_A < 0) || ! (condition_A))
{
if ((example_B >= )) && (condition_B))
{
doSomething();
}
else
{
doAnything();
}
}
您重构的代码是错误的,因为如果 "A" 条件为真,原始代码将执行 removeThisClass();
,这意味着它现在应该什么也不做,但您的代码将调用 doAnything();
当 "A" 为真时。
您可以发表评论。声纳 should accept that 它也可以帮助 reader.
void doSomething() {
for (int i = 0; i < 42; i++) // Non-Compliant
{
}
for (int i = 0; i < 42; i++); // Compliant
if (myVar == 4) // Compliant - contains a comment
{
// Do nothing because of X and Y
}
else // Compliant
{
doSomething();
}
try // Non-Compliant
{
}
catch (Exception e) // Compliant
{
// Ignore
}
}