gpt4 book ai didi

java - 用保护子句替换嵌套条件的模式,同时仍对绝大多数情况(但不是全部)执行某些操作

转载 作者:行者123 更新时间:2023-12-01 16:56:32 25 4
gpt4 key购买 nike

我有一个遵循以下模式的方法:

void myMethod(String arg1) {
SomeObject foo = getSomeObject(arg1);

if(foo != null) {
SomeOtherObject bar = foo.getSomeOtherObject();

if(bar != null) {
bar.doSomething();

if(bar.isGood()) {
YetAnother baz = getAnotherByName(bar.getAnotherName());

if(baz != null) {
if(baz.exitEarly()) {
foo.recordEarlyExit(baz.getName());
return;
}
}
}
}
}
doNormalThing();
}

我想知道是否有一种更简洁的方法可以在没有这么多级别的情况下获得相同的行为。

如果我最后不必执行doNormalThing();,我可以这样做:

void myMethod(String arg1) {
SomeObject foo = getSomeObject(arg1);
if(foo == null) { return; }

SomeOtherObject bar = foo.getSomeOtherObject();
if(bar == null) { return; }

bar.doSomething();
if(!bar.isGood()) { return; }

YetAnother baz = getAnotherByName(bar.getAnotherName());

if(baz == null) { return; }

if(baz.exitEarly()) {
foo.recordEarlyExit(baz.getName());
}
}

我基本上是在执行上述操作,但在所有 return 之前添加 doNormalThing();。但这是很多重复,如果我需要更改某些内容,我必须在所有这些 block 中进行操作。

我可以做一些类似将其包装在 try{ ... } catch (DoNormalThingException e) { doNormalThing(); 中的事情} 并且仅当我想在从方法返回之前调用该方法时抛出 DoNormalThingException ,并且当 baz.exitEarly() 为 true 时不抛出它。但这看起来也不干净,而且似乎滥用了异常。

如果它只是检查所有条件中的 null ,那么我可以包装在 try 中,并且仅在以下情况下运行 doNormalThing()抛出 NullPointerException 。它比其他基于异常的方式干净得多:我不需要任何条件,并且我捕获了合法的异常,而不是仅用于控制流的虚构异常。但并非所有检查都是针对 == null 并且我不想屏蔽来自更深层次方法调用的 NPE。

如果java有goto就好了...

编辑:所以我知道这种类型的重构有一个名字,它是:用保护子句替换嵌套条件。这就是我试图做的,但是如果您有在大多数情况下但不是全部情况下需要调用的额外方法,那么它就不会很好地工作。尽管如此,我还是想提及它以帮助其他人找到这个问题。

最佳答案

一种选择是将除 doNormalThing 方法调用之外的所有方法调用包装在另一个方法中,该方法返回之后是否执行 doNormalThing:

void myMethod(String arg1) {
if (myMethodInternal(arg1)) {
doNormalThing();
}
}

private boolean myMethodInternal(String arg1) {
SomeObject foo = getSomeObject(arg1);
if (foo == null) {
return true;
}

SomeOtherObject bar = goo.getSomeOtherObject();
if (bar == null) {
return true;
}
// etc

if (baz.exitEarly()) {
foo.recordEarlyExit(baz.getName());
return false;
}
return true;
}

感觉不太干净,但至少可以用。您可以也可以使用try/finally,没有异常(exception) - 使用boolean字段来确定是否执行doNormalThing >.

关于java - 用保护子句替换嵌套条件的模式,同时仍对绝大多数情况(但不是全部)执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32015743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com