Tayfunオメル:
私は難問のビットを持っています。私は2つのオブジェクトを持っているA
とB
。彼らは、と来ることができるnull
かどうかnull
、と私はそのような状況のすべてにおいて、いくつかの異なるビジネスロジックを行う必要があります。
現時点では私が持っています:
if(A != null && B != null) { /* operation1 */ }
if(A == null && B == null) { /* operation2 */ }
if(A != null && B == null) { /* operation3 */ }
if(A == null && B != null) { /* operation4 */ }
あなたは私はそれらの書き込みの方法をお勧めすることができif
、よりエレガントな方法で複数可?
エラー:
実際には、あなたが呼び出すメソッドに表示あなたの場合の条件を維持したい場合は、あなたのコードは条件ならばウロコ状にする提案された解決策よりも良い選択肢です。これらすべての場合-elseと内側のステートメントは、条件が各操作そのトリガーが何であるか、それはあまり明らかに作れば、他。つまり、あなたのアプローチを維持することができます。参照してくださいジェフ・アトウッドからこのブログの記事を
あなたが行うことができる一つの小さな改善があれば条件から抽出する方法であり、あなたの意思決定を文書化の方法で新しいメソッドに名前を付けます:
if( isYouHaveACarAndEnoughGas(A, b)) { //operation to drive}
if( isYouHaveACarAndNoGas(A, b)) { //operation to walk}
...
private boolean isYouHaveACarAndEnoughGas(...){ return A != null && B != null; }
あなたが/必要性何かもっと凝ったい場合は、コマンドパターンや戦略を使用することができます。経験則として、繰り返しのif-else文やスイッチを使用すると、同じ結果を得るために多型を使用することができ兆候です。参照の例と、この優れた記事を。
interface Operation{
void execute();
}
class OperationBuilder {
public static Operation build(TypeA A, TypeB B){
if(A != null && B != null) { return new OperationOne(); }
if(A == null && B == null) { return new OperationTwo(); }
if(A != null && B == null) { /* operation3 */ }
if(A == null && B != null) { /* operation4 */ }
}
class OperationOne implements Operation{
private OperationOne(){...}
@Override
void execute(){...}
}
class OperationTwo implements Operation{
private OperationTwo(){}
@Override
void execute(){...}
}
}
ちょうどこのあなたを使用するには
Operation op = OperationBuilder.build(A, B) ;
op.execute();
そして、ここで、これはあなたが始めたものよりも良くなることができる理由。あなたが持っている想像
if(codition1){
//complicated stuff here that makes you scroll and scroll
}
if(codition2){
//complicated stuff here that makes you scroll and scroll
}
etc
あなたは何が起こっているかの概要を失うので、同じ画面上のすべての条件が表示されない可能性があります。業務ロジックは再びノイズから分離されながら、一方で、ビルダーは、すべての条件がタイトできれいに保ちます。