はい、代替手段があります。
そして、そのようなコーディングは絶対にしないでください (独自のコードを維持している場合を除きます)。
私はそのようなコードを維持しなければならず、Charles_Bronsonn の映画と同じくらいひどいものです (一部の人々はそれらの映画を好みます)。
この種のコードは通常、C などの手続き型言語から来ています (is C procedural :P ) とにかく。
それが、ObjectOrientedProgrammng が主流になった理由です。オブジェクトを作成し、それらに状態を追加できます。その状態で操作を作成します。彼らは単なる不動産所有者ではありません。
あなたがそのシナリオを作り上げたことは知っていますが、ほとんどの場合、これらの条件はすべてビジネス ルールです!! . ほとんどの場合、これらのルールは変更され、元の開発者がそこにいなくなった場合 (またはすでに数か月が経過している場合)、そのコードを変更する実行可能な方法はありません。ルールが読みにくい。そして、そこから多くの苦痛が生じます。
あなたは何ができますか?
1.)プライベートメンバー変数 (AKA 属性、プロパティ、インスタンス変数など)を使用して、オブジェクトの状態をオブジェクト内に保持します。
2.) メソッドを非公開にする (これがそのアクセス レベルの目的です) ため、誰もそれらを誤って呼び出して、プログラムを NullPointerException ランドに配置することはできません。
3.) 条件が何であるかを定義するメソッドを作成します。それは彼らが自己文書化コードと呼んでいるものです
だから代わりに
// validates the user has amount
if( amount > other && that != var || startsAligned() != false ) {
}
メソッドを作成する
if( isValidAmount() ) {
}
private boolean isValidAmount() {
return ( amount > other && that != var || startsAligned() != false );
}
私はそれが冗長に見えることを知っていますが、人間がコードを読むことができるようにします. コンパイラは可読性を気にしません。
では、このアプローチでハイパーネストされたように見えるのはどのようなものでしょうか?
このような。
// these are business rules
// then it should be clear that those rules are
// and what they do.
// internal state of the object.
private SomeClass2 obj2;
private SomeClass3 obj3;
private SomeClass4 obj4;
//public String myFunc( SomeClass input ) {
public String myComplicatedValidation( SomeClass input ) {
this.input = input;
if ( isValidInput() &&
isRuleTwoReady() &&
isRuleTreeDifferentOf( BAD_OBJECT ) &&
isRuleFourDifferentOf( BAD_VALUE ) &&
isMessageLengthInRenge( MIN_VALUE , MAX_VALUE ) ) {
message = resultOfStuffActuallyDone();
}
}
// These method names are self explaining what they do.
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/でさらに多くのことを読むことができます。