序文
、健康文を最適化するために使用できるのであれば、他の記事では述べ前に、簡単です。しかし、実際の開発、多くの場合ではない、単純な場合は、他の構造では、私たちはしばしば不注意に以下のコードを書きました:
--------------------理想的--------------------他-IF ます。public void今日( ){ IF(isWeekend()){ System.out.printlnは( "遊び"); }他{ System.out.printlnは( "仕事!"); } }
-------------------のif-else --------------------現実 であれば(お金> = 1000){ IF(UserType.SILVER_VIP.getCodeタイプ==()){ するSystem.out.println( "シルバー会員特典50元"); 結果=マネー- 50; }そうIF(タイプ== UserType.GOLD_VIP.getCode ()){ するSystem.out.println( "ゴールドメンバー20%"); 結果*マネー= 0.8; }そうIF(UserType.PLATINUM_VIP.getCodeタイプ==()){ するSystem.out.println(「プラチナメンバープロモーションオフ50、7コール"); 結果=(マネー- 50)* 0.7; }他{ System.out.printlnは("ファイル)は」割引はありません。 結果=お金を; } } //省略nはIF-他に......
それがあれば、他の支配されているの恐怖を思い出し、私たちは似たコードを書かれていると言っても過言ではない、私たちはしばしば何も、あるいは何も始まります。
ここでは、開発中のif-else文「エレガントなプロセス」の思考私の経験複合体を共有することができます。間違っている場合は、私たちは一緒に学習の交換を歓迎します。
需要
そのような需要があると仮定します。
1000金額を費やし、ユーザーは、ユーザーのVIPレベルに応じて、割引を受ける電力供給システム。
VIPレベルが最終使用者のコストを計算するために、ユーザーに基づきます。
-
普通のメンバーは割引しないでください
-
シルバー会員特典50元
-
ゴールド20%
-
プラチナ会員はリゾートオフ50、30%に利益をもたらします
コーディング
静的なダブルのgetResult(int型のロングマネー、)プライベート{ ダブル結果=マネー; IF(マネー> = 1000){ (タイプ== UserType.SILVER_VIP.getCode()の)IF { System.out.printlnは(「シルバー会員は50の利点元"); 結果マネー= - 50; }そうIF(UserType.GOLD_VIP.getCodeタイプ==()){ するSystem.out.println("ゴールドメンバー20%「); 結果*マネー= 0.8; }そうIF( == UserType.PLATINUM_VIP.getCodeタイプ()){ するSystem.out.println( "プラチナ会員特典50、7コールオフ"); 結果=(マネー- 50)* 0.7; }他{ するSystem.out.println (「普通のメンバーは割引しないでください」); 結果=マネー。 } } 結果を返します。 }
プレゼンテーションを容易にするために、コードは、私はシンプルに実現し、実際には場合 - 他の複雑な論理の課金となります。機能的には、基本的な完了が、私のような人々がそれの上にコードを持っているため、コードの品質に直接見て耐えることができませんでした。私たちは、コードの私たちの最初の版を最適化するために目を向け始めました。
考えます
コードの上を参照してください、スマート友人最初に考えたのは、これは典型的な戦略モデルではないということですか?
あなたが賢い少年だ、我々はコードにそれを最適化するための戦略モードの使用を探ります。
戦略モード
戦略パターンとは何ですか?
何人かの友人はまだ不明で、戦略パターン何です。戦略は、それらを一つずつをカプセル化し、モデルの一連のアルゴリズムを定義することである、と彼らは交換可能になります。
このような断絶するための上述の需要、リベート、割引、などなど。アルゴリズム自体は戦略の一種です。そして、これらのアルゴリズムはお互いを置き換えることができ、今日のように、私は50巻のシルバー会員特典をしたい、明日はシルバーメンバーに10%の割引を置き換えることができます。
彼はそんなに、それはより良い、より実際のコーディングされました。
コーディング
戦略のインターフェイス{パブリック //課金方法 ダブルコンピューティング(ロングマネー); } //正規政策 publicクラスOrdinaryStrategy戦略{で実装 @Override 公共ダブルコンピューティング(ロングマネー){ System.out.printlnは(「普通のメンバーは割引しないでください」 ); リターンマネー; } } //シルバーメンバーシップ・ポリシー パブリッククラスSilverStrategy戦略の実装{ @Override 公共ダブルコンピューティング(ロングマネー){ System.out.printlnは(「シルバー会員特典50元」); 戻りマネー- 50; } } //金政策 パブリッククラスGoldStrategy戦略の実装{ @Override ダブル計算のパブリック(ロングマネー){ System.out.printlnは(「ゴールドメンバーシップ20%」); リターン*マネー0.8; } } //プラチナメンバーシップ・ポリシー パブリッククラスPlatinumStrategy戦略の実装{ @Override 公共ダブルコンピューティング(ロングマネー){ System.out.println( "30%オフを破っプラチナ会員特典50"); リターン(マネー- 50)* 0.7; } }
私たちは、インタフェースする戦略を定義し、インターフェイスを実装する4つのサブクラスを定義します。対応する方法を計算するために彼らの課金ポリシーロジックを実現します。
プライベート静的ダブルのgetResult(長いお金、int型){ doubleの結果=お金。 IF(お金> = 1000){ IF(タイプ== UserType.SILVER_VIP.getCode()){ 。結果=新しいSilverStrategy()を計算する(お金)。 }他(タイプ== UserType.GOLD_VIP.getCode()){もし 結果=新しいGoldStrategy()を計算する(お金)。 }他(タイプ== UserType.PLATINUM_VIP.getCode()){もし 結果=新しいPlatinumStrategy()を計算する(お金)。 }他{ 。結果=新しいOrdinaryStrategy()を計算する(お金)。 } } 結果を返します。 }
対応戦略によって置換ユーザVIPの種類に応じて、対応するgetResultメソッド、。ここでの呼び出しは、コードの計算が繰り返されてきた、我々はさらに最適化することを試みることができます。
プライベート静的ダブルのgetResult(長いお金、int型){ 場合(金銭<1000){ リターンのお金。 } 戦略戦略。 IF(タイプ== UserType.SILVER_VIP.getCode()){ 戦略=新しいSilverStrategy()。 }他(タイプ== UserType.GOLD_VIP.getCode()){もし 戦略=新しいGoldStrategy()。 }そうであれば(タイプ== UserType.PLATINUM_VIP.getCode()){ 戦略=新しいPlatinumStrategy()。 }他{ 戦略=新しいOrdinaryStrategy()。 } strategy.compute(お金)を返します。 }
私はガーディアン文のそれの最初の記事で述べて覚えていますか?私たちは、お金<早期復帰の1000年のケースを置くためにここにいます。より1,000人以上のロジックに焦点を当て、それはまた、不要なインデントを減らすことができます。
ポンダー
私はかつての戦略パターンより良いこれよりもと思いました。コードの最適化は、すでにこれに思いました。
しかし、もし、他にまだそこに、恐ろしいものがある:)
私はのif-else戦略モードを排除する方法を確認するために、たくさんの本を読んでしよう
本の中でメソッドのほとんどは、工場出荷時のモード+シンプルな戦術を使用することです。もし - スイッチに他のスイッチは、ファクトリメソッドのみを作成します。
他の - しかし、それは場合敗北に私が望む効果を達成するために遠いです
ある日の夜までは、私の兄Java8はオープン新世界から、グループ内の小さなトリックを共有しています。
工場+戦略
パブリックインターフェイス戦略{ ダブルコンピューティング(ロングお金)。 //返回型 int型のgetType(); } publicクラスOrdinaryStrategy実装戦略{ @Override 公衆二重計算(長いお金){ するSystem.out.println( "普通会员不打折")。 お金を返します。 } //添加型返回 @Override 公共INTのgetType(){ 戻りUserType.SILVER_VIP.getCode()。 } } publicクラスSilverStrategy実装戦略{ @Override 公衆二重計算(長いお金){ するSystem.out.println( "白银会员优惠50元")。 お金を返す- 50。 } //型リターン @Override 公共INTのgetType(){ 戻りUserType.SILVER_VIP.getCode(); } } ...省略戦略残り
のは、政策の値の型を表すのに使用される戦略でgetTypeメソッドを追加してみましょう。コードは比較的簡単ですが、あまりにも多くの説明はありません
パブリッククラスStrategyFactory { プライベート地図<Integer型、戦略>マップ。 公共StrategyFactory(){ 一覧<戦略>戦略=新しいArrayListを<>(); strategies.add(新しいOrdinaryStrategy()); strategies.add(新しいSilverStrategy()); strategies.add(新しいGoldStrategy()); strategies.add(新しいPlatinumStrategy()); strategies.add(新しいPlatinumStrategy()); !//看这里看这里看这里 マップ= strategies.stream()コレクト(Collectors.toMap(戦略::のgetType、戦略- >戦略))。 / *等同上面 マップ=新しいHashMapの<>(); (戦略戦略:戦略)は{ map.put(strategy.getType()、戦略)。 } * / } パブリック静的クラスホルダー{ パブリック静的StrategyFactoryインスタンス=新しいStrategyFactory()。 } パブリック静的StrategyFactoryのgetInstance(){ Holder.instanceを返します。 } パブリック戦略GET(整数型){ 戻りmap.get(タイプ)。 } }
内部の静的型の単一の実施形態は、シングルモードの実施形態を実現するために、記事がフォーカスされていない、理解していない場合は、自己をGoogleすることができ
私たちは、その後、StrategyFactoryファクトリクラスを作成するために着手しました。StrategyFactoryは、ここで私は、コンストラクタが必要、戦略、およびマップにリストを初期化する際に、静的な内部クラスのシングルトンを使用しています。
ここに配置されている「魂」の変換があります。
toMap
のは、Java8文法のヒントを見てみましょう。
通常の状況下で、我々は、手動で地図に入れて、リストをトラバース。
-------------- -----------------前 )マップ=新しいHashMapの<>(; (戦略戦略:戦略)は{ map.put(strategy.getType()、戦略)。 } --------------後Java8 ----------------- 地図= strategies.stream()を収集(Collectors.toMap(戦略: :のgetType、戦略- >戦略));
最初のパラメータはtoMap機能である、地図、キーに対応し、2番目のパラメータは関数で、戦略 - >戦略、戦略がトラバースの戦略にそれぞれの戦略を左、右の戦略は、マップ値に対応する値です。
友人がJava8文法を理解していない場合、それは強く、「Java8戦闘」を参照してくださいすることが推奨され、書籍の詳細ラムダ式、ストリームおよびその他の構文で記述します。
効果
プライベート静的ダブルのgetResult(長いお金、int型){ 場合(金銭<1000){ リターンのお金。 } 戦略戦略= StrategyFactory.getInstance()(タイプ)を得ます。 (戦略== nullでは){場合 新しいIllegalArgumentExceptionをスローし( "入力右のタイプを喜ば"); } strategy.compute(お金)を返します。 }
これまでのところ、ファクトリクラスを通じて、我々はのgetResult(で呼び出された場合)、入ってくるタイプに基づいて、あなたは、対応する戦略を得ることができます
これ以上ひどい場合-else文はありません。
Sahua Sahuaエンド:)
フォロー
その後のコードの最適化は、Javaプロジェクトならば、あなたは戦略の実装クラスにカスタムコメントを使用しようとすることができます。
これは、ファクトリクラスにリストStratey戦略を追加するオリジナルの必要性を簡素化します。
遂に
それはすべて私が間違っている場合は、私たちが一緒に学習の交換を歓迎し、アイデアの開発に複雑な場合-else文「エレガントなプロセスを」遭遇しています。