それ以外の場合は、当社の通常の開発プロセスでは、多くの場合、シーンの多数であってもよいし、コードは非常にエレガントな、非常に肥大化しました。ことを我々はそれに対処する方法がありませんか?
コードの入れ子に増加した場合の複雑さの多数を可能にし、維持するのが難しいです。この記事では、様々なソリューションをご紹介します。
ケース
次のビジネス・ロジック・シミュレーション、渡された状態に異なるアプローチ。
ケースとして計算クラスをとり、加算、減算、出力の4つの方法と、4つの関連する操作があります。
公共 int型の計算(int型、INT B、ストリング演算子){ int型の結果= はInteger.MIN_VALUE。 もし( "ADD" .equals(オペレータ)){ 結果 = A + B。 } そう であれば( "乗算" .equals(オペレータ)){ 結果 = * B。 } そう であれば( "分割" .equals(オペレータ)){ 結果 = A / B。 } そう であれば( "引く" .equals(オペレータ)){ 結果 = -B; } 戻り値の結果; }
もちろん、あなたが達成するためにスイッチを使用することができます。
公共 int型 calculateUsingSwitch(int型、INT B、ストリング演算子){ スイッチ(オペレータ){ 場合 "追加" : 結果 = A + B。 休憩; // その他の場合 } 戻り結果。 }
より多くの条件として、また維持するために、より多くの困難な複雑さを、増加しました。
復興
1、操作は、我々は、ユーザインタフェースの抽象化を与えるファクトリクラスを進めます
パブリック インターフェース操作{ INT(適用int型、int型のB)。 }
そして、4つの方法は、数学を達成するために
パブリック クラス付加実装動作{ @Override 公共 INTは(適用int型、INT B)は{ 返す +のBと、 } }
次に、これをプラントの運転により提供されます
パブリック クラスOperatorFactory { 静的マップの<string、動作> operationMap = 新規 HashMapの<> (); 静的{ operationMap.put( "追加"、新しい追加()); operationMap.put( "分割"、新部門()); // 複数のオペレータ } パブリック 静的オプション<動作> getOperation(文字列演算子){ リターンOptional.ofNullable(operationMap.get(オペレータ))。 } }
コール
公共 int型 calculateUsingFactory(int型、INT B、ストリング演算子){ 操作targetOperation = OperatorFactory .getOperation(オペレータ) .orElseThrow(() - > 新しいはIllegalArgumentException( "無効な操作" ))。 リターンtargetOperation.apply(B) }
新しい操作は唯一の植物を操作するoperationMapを維持する必要があります。
2、列挙の使用
次のように定義された列挙の動作:
パブリック 列挙オペレーター{ ADD、MULTIPLY、SUBTRACT、DIVIDE }
しかし、ロジックを対応する異なる操作は同じではありません、私たちは抽象メソッドを書きます
ADD { @Override 公共 intは(適用int型、INT B)は{ 返す +のBと、 } } // 他のオペレータ のパブリック 抽象 INTは(適用int型、INT B)を、
直接着信コール列挙値
公共 int型の計算(int型、INT B、オペレータ演算子){ リターンoperator.apply(B) }
@Test 公共 ボイドwhenCalculateUsingEnumOperator_thenReturnCorrectResult(){ 電卓電卓 = 新しい計算(); INT結果= calculator.calculate(3、4、Operator.valueOf( "ADD" )); assertEquals( 7 、結果)。 }
3、コマンドモード
定義されたコマンド・インタフェース。
パブリック インターフェースコマンド{ 整数(実行)。 }
追加を実現
パブリック クラス AddCommand 実装コマンド{ // インスタンス変数 公共 AddCommandは(int型、int型B){ この .Aは= 。 この .B = B; } @Override パブリック整数(実行){ 返す +のBと、 } }
計算機が追加コマンドを実行するための方法のクラスを定義します。
公共 int型の計算(コマンドコマンド){ リターンのCommand.Execute(); }
テストコード
@Test 公共 ボイドwhenCalculateUsingCommand_thenReturnCorrectResult(){ 電卓電卓 = 新しい計算(); INT結果= calculator.calculate(新しい AddCommand(3,7 ))。 assertEquals( 10 、結果)。 }
4、ルールエンジン
インタフェース定義ルール
パブリック インターフェイスのルール{ boolean型は、(式expression)を評価。 getResult()を結果; }
ルールエンジンを実装
パブリック クラスRuleEngine { プライベート 静的リスト<ルール>ルール= 新しい ArrayListを<> (); 静的{ rules.add(新規追加ルール())。 } パブリック結果処理(式expression){ ルールルール = rules.stream() .filter(R - > r.evaluate(発現)) .findFirst() .orElseThrowは(() - > 新しい IllegalArgumentExceptionが(「発現は、任意の一致しませんルール」)); リターンrule.getResult(); } }
式を定義します
パブリック クラス式{ プライベート整数x; プライベート整数y; プライベート演算子演算子。 }
また、ルールの定義
パブリック クラス追加ルールの実装のルール{ @Override 公共 ブールは、(式expression)を評価{ boolean型 evalResult = 偽; もし(expression.getOperator()== Operator.ADD){ この .result = expression.getX()+ expression.getY()。 evalResult = 真; } 戻りevalResultと、 } }
着信ルールエンジンに式を与えます
@Test 公共 ボイドwhenNumbersGivenToRuleEngine_thenReturnCorrectResult(){ 式expression = 新しい式(5、5 、Operator.ADD)。 RuleEngineエンジン = 新しいRuleEngine()。 結果をもたらす = engine.process(式)。 assertNotNull(結果)。 assertEquals( 10 、また、Result.getValue())。 }
コードの可読性、保守性の偉大な害を起こした場合に...他にあれば...他にやむを得ないが、誤用共通のコードの概要はあるが。したがって、良かったら...他に、あなたは大きな意義の長期的なプロジェクトを検討するコードを冷まします。
英文原文:https://www.baeldung.com/java-replace-if-statements
その他の参考文献:
戦略デザインパターン:http://www.runoob.com/design-pattern/strategy-pattern.html
コマンドデザインパターン:http://www.runoob.com/design-pattern/command-pattern.html
推奨読書:
10倍以上の効率を高めるために、いくつかのMySQLの最適化技術をオススメ!
ヨーヨーのパフォーマンスを確保するための44個のJavaコード最適化ツール!
世間の注目のスキャンコード番号、関連情報を取得し、送信キーワード:
-
実際のソースプロジェクトは、電気の供給を受ける「Springboot」を送信します。
-
実際の学習教材を受け取る「SpringCloud」を送信します。