是的,有一个替代方案。
请不要编写那样的代码(除非您在维护自己的代码)。
我曾经不得不维护过那样的代码,就像查尔斯·布朗森(Charles Bronson)的电影一样糟糕(尽管有些人喜欢这些电影)。
这种代码通常来自过程性语言,例如 C(C 是过程性的 :P)。无论如何,这就是面向对象编程成为主流的原因。它允许您创建对象并向其中添加状态。使用该状态创建操作。它们不仅仅是属性持有者。
我知道您编造了那种情景,但大多数情况下所有这些条件都是 业务规则!!。这些规则大多数情况下会发生变化,如果原始开发人员已经离开(或已经过去几个月),则将没有可行的方法修改该代码。这些规则很难阅读。这会带来大量痛苦。
你可以做什么?
1.) 使用 private 成员变量(也称为属性、实例变量等)将对象的状态保留在对象内部。
2.) 将方法设置为私有(这就是该访问级别的用途),以便没有人会错误地调用它们并使程序进入 NullPointerException 的境地。
3.) 创建定义条件的方法。这就是所谓的 自我记录代码。
因此,不要使用以下代码:
if( amount > other && that != var || startsAligned() != false ) {
}
创建一个方法
if( isValidAmount() ) {
}
private boolean isValidAmount() {
return ( amount > other && that != var || startsAligned() != false );
}
我知道这看起来很啰嗦,但可以让人类读懂代码。编译器并不关心可读性。
那么如果按照这种方法,你的超嵌套会是什么样子呢?
像这样。
private SomeClass2 obj2;
private SomeClass3 obj3;
private SomeClass4 obj4;
public String myComplicatedValidation( SomeClass input ) {
this.input = input;
if ( isValidInput() &&
isRuleTwoReady() &&
isRuleTreeDifferentOf( BAD_OBJECT ) &&
isRuleFourDifferentOf( BAD_VALUE ) &&
isMessageLengthInRenge( MIN_VALUE , MAX_VALUE ) ) {
message = resultOfStuffActuallyDone();
}
}
private final boolean isValidInput() {
return this.input != null;
}
private final boolean isRuleTwoReady() {
obj2 = input.getSomeClass2();
return obj2 != null ;
}
private final boolean isRuleTreeDifferentOf( Object badObject ) {
obj3 = obj2.getSomeClass3();
return obj3 != null && !badObject.equals( obj3.getSomeProperty() );
}
private final boolean isRuleFourDifferentOf( int badValue ) {
obj4 = obj3.getSomeClass4();
return obj4 != null && obj4.getSomeValue() != badValue;
}
private final boolean isMessageLengthInRenge( int min, int max ) {
String message = getMessage( obj4.getSomeValue() );
int length = message.length();
return length >= min && length <= max;
}
我知道,看起来像是更多的编码。但是想一想,这些规则几乎都可以被人类读懂。
if ( isValidInput() &&
isRuleTwoReady() &&
isRuleTreeDifferentOf( BAD_OBJECT ) &&
isRuleFourDifferentOf( BAD_VALUE ) &&
isMessageLengthInRenge( MIN_VALUE , MAX_VALUE ) ) {
message = resultOfStuffActuallyDone();
}
可能几乎可以被理解为
if is valid input
and rule two is ready
and rule three is not BAD OBJECT
and rule four is no BAD_VALUE
and the message length is in range
通过保持规则非常简单,程序员可以很容易地理解它们,而不必担心破坏什么。
更多相关内容请参阅:http://www.refactoring.com/