if-else のネストが深すぎますか?初心者でもマスターできるデザインパターンを教えます!

if-else のネストが深すぎますか?初心者でもマスターできるデザインパターンを教えます!

[[321098]]

デザインモードも使用しません。

多くの人は、ビジネス コードを書いていると考え、ロジックに従ってコードを記述し、再利用のために共通メソッドを抽出します。デザイン パターンを学ぶ必要はもちろん、使用する必要もありません。

最初は私もそう思っていましたが、彼に会うまではそう思っていました。 。 。

例えば

まず、一般的な注文インターセプト インターフェースを見てみましょう。

基本ロジック、パラメータセキュリティインターセプト、番号インターセプト、ルールインターセプトがすべて合格すると、注文の発注が許可されます。いずれかが失敗した場合は、対応する失敗理由が返されます。

多層ネストされた書き込みの場合

通常の多層ネストされたif記述法

  1. /**
  2. * @著者 saier
  3. * @日付2020/3/31 18:03
  4. */
  5. パブリッククラスOrder {
  6. パブリックメッセージinterrupt1(){
  7. 戻る ヌル;
  8. }
  9. パブリックメッセージinterrupt2(){
  10. 戻る ヌル;
  11. }
  12. パブリックメッセージinterrupt3(){
  13. 戻る ヌル;
  14. }
  15. パブリックメッセージinterrupt4(){
  16. 戻る ヌル;
  17. }
  18. パブリックメッセージinterrupt5(){
  19. 戻る ヌル;
  20. }
  21.  
  22. 公共 静的void main(String[] args) {
  23. 注文  order = 新しいOrder ();
  24. if(順序.interrupt1().getResult() == 1){
  25. if( order.interrupt2 ().getResult() == 1){
  26. if(順序.interrupt3().getResult() == 1){
  27. if( order.interrupt4 ().getResult() == 1){
  28. if(注文.interrupt5().getResult() == 1){
  29. システム。 .println ( "成功" );
  30. }
  31. }
  32. }
  33. }
  34. }
  35.  
  36. }
  37. }
  38.  
  39. @データ
  40. クラスメッセージ{
  41. プライベートint結果;
  42. プライベート文字列メッセージ;
  43. }

例外処理ロジック

あるいは例外を使ってロジックを実行すると、コードはよりシンプルになります

  1. /**
  2. * @著者 saier
  3. * @日付2020/3/31 18:03
  4. */
  5. パブリッククラスOrder2 {
  6. パブリックボイドinterrupt1(){
  7.  
  8. }
  9. パブリックボイドinterrupt2(){
  10.  
  11. }
  12. パブリックボイドinterrupt3(){
  13. //失敗
  14. 新しい RuntimeException() をスローします。
  15. }
  16. パブリックボイドinterrupt4(){
  17. //失敗
  18. 新しい RuntimeException() をスローします。
  19. }
  20. パブリックボイドinterrupt5(){
  21. //失敗
  22. 新しい RuntimeException() をスローします。
  23. }
  24.  
  25. 公共 静的void main(String[] args) {
  26. Order2 order2 = 新しい Order2();
  27. 試す{
  28. 順序2.割り込み1();
  29. 順序2.割り込み2();
  30. 順序2.割り込み3();
  31. 順序2.割り込み4();
  32. 順序2.割り込み5();
  33. システム。 .println ( "成功" );
  34. }catch (RuntimeException e){
  35. システム。 .println ( "失敗" );
  36. }
  37.  
  38. }
  39. }

最初は、例外を直接使用してロジックを実行していました。しかし、その後のロジックが複雑になるにつれて、いくつかの問題が発生します。たとえば、例外は例外情報のみを返すことができ、詳細なフィールド情報を返すことはできません。

その後、Alibaba の規則では異常なロジックが禁止されていることにも気付きました。

Alibaba コード標準:

[必須] プロセス制御や条件制御には例外を使用しないでください。

注: 例外設計の本来の意図は、プログラムの動作中に発生するさまざまな予期しない状況を解決することであり、例外処理の効率は条件判断に比べてはるかに低くなります。

さらに重要なのは、コードが読みにくいことです。メソッド内で例外がスローされた場合は、コード自体の例外も考慮する必要があります。

より良い方法はなく、デザインパターンを考慮するしかありません

コードをもっと読みやすく、拡張可能にするにはどうすればいいでしょうか?

同僚のリマインダーのおかげで、突然デザインパターンを思い出しました!

私たちが達成したいこと

  1. コードにはif elseのネストがあまりなく、非常に読みやすい
  2. 新しいインターセプトロジックを追加するのが簡単で便利であれば、元のロジックに影響を与えず、スケーラビリティも良好です。
  3. インターセプトロジックの順序は簡単に変更でき、結合度が低い

責任連鎖パターン

このシナリオでは、責任連鎖モデルが非常に適しています。 (どのようなデザインパターンをどのようなシナリオで使用するのか?これには日々の積み重ねと、さまざまなデザインパターンの基本的な使い方を知ることが必要です)

名前が示すように、責任チェーンは関連するトランザクションの責任を処理するために使用される実行チェーンです。実行チェーンには複数のノードがあり、各ノードには要求トランザクションを処理する機会(条件の一致)があります。ノードが処理を完了した場合、実際のビジネス ニーズに応じて、次のノードに渡してさらに処理したり、戻して処理を完了したりできます。

まず、フィルターの抽象クラスを作成します

  1. パブリック抽象クラスAbstractFilter {
  2.  
  3. プライベート抽象フィルタ nextFilter;
  4.  
  5. /**
  6. * 責任の連鎖の次の要素
  7. */
  8. パブリックvoid setNextFilter(抽象フィルター nextFilter){
  9. this.nextFilter = 次のフィルタ;
  10. }
  11.  
  12.  
  13. パブリック抽象フィルタ getLastFilter(){
  14. if (this.nextFilter != null ) {
  15. this.nextFilter.getLastFilter()を返します
  16. }それ以外{
  17. これを返します
  18. }
  19. }
  20.  
  21. パブリックvoid フィルター(FilterRequest フィルターリクエスト、Response レスポンス){
  22. doFilter(フィルターリクエスト、レスポンス);
  23. if(response.isFilterNext() && nextFilter != null ){
  24. 次のフィルター。フィルター(フィルターリクエスト、レスポンス);
  25. }
  26. }
  27.  
  28. /**
  29. * 特定の傍受ロジック
  30. */
  31. パブリック抽象 void doFilter(FilterRequest filterRequest、Response レスポンス);
  32.  
  33. /**
  34. * 傍受結果に応じた処理
  35. */
  36. パブリックvoid exec (FilterRequest filterRequest, Response レスポンス){
  37. }
  38. }

フィルタ実装クラス

  1. @成分
  2. @注文(5)
  3. パブリッククラス CheckParamFilter1 は AbstractFilter を拡張します {
  4. @オーバーライド
  5. パブリックvoid doFilter(FilterRequest filterRequest, Response レスポンス) {
  6.  
  7. }
  8. }
  9.  
  10. @成分
  11. @注文(10)
  12. パブリッククラス CheckParamFilter2 は AbstractFilter を拡張します {
  13. @オーバーライド
  14. パブリックvoid doFilter(FilterRequest filterRequest, Response レスポンス) {
  15.  
  16. }
  17. }

フィルターの順序を決定するには Order アノテーションを使用します。これは、後で Spring に挿入するときに驚くべき効果をもたらします。

  1. //Springの自動注入メカニズムを使用する
  2. オートワイヤード
  3. リスト<抽象フィルタ> abstractFilterList;
  4.  
  5. プライベート抽象フィルタ firstFilter;
  6.  
  7. //スプリング注入後に自動的に実行される
  8. @投稿コンストラクト
  9. パブリックvoid 初期化チェーンフィルター(){
  10. // すべての呼び出しロジックを責任チェーンに挿入し、順序に従って並べ替えます。順序が小さいほど、優先順位が高くなります。
  11. ( int i = 0 ;i<abstractFilterList.size ( );i++){
  12. もし(i == 0){
  13. 最初のフィルター = abstractFilterList.get(i);
  14. }それ以外{
  15. firstFilter.getLastFilter().setNextFilter(abstractFilterList.get(i));
  16. }
  17. }
  18. }
  19.  
  20. //直接使用する
  21. パブリックレスポンスexec (){
  22. firstFilter.filter(filterRequest、response);
  23. 応答を返します
  24. }

デザインパターンを使用する利点

Chain of Responsibilityパターンを使用した後にどのようなメリットがあるか見てみましょう。

  1. インターセプトロジックを追加するには、AbstractFilterクラスを実装するだけです。
  2. インターセプト順序を変更するには、Order アノテーションのサイズを変更するだけです。サイズが小さいほど、優先度が高くなります。
  3. コードは明確で、すべての処理ロジックは実装クラスに組み込まれています。

デザインパターンを使用することのデメリット

低結合と高いスケーラビリティを実現します。しかし、それはいくつかの悪い結果ももたらしました

  1. ロジックはより複雑で、チェーンやその他のデータ構造を使用し、再利用できないシングルトンの問題に注意してください。
  2. クラス数は劇的に増加し、クラスごとに1機の迎撃機が配備されるようになった。

最後にまとめましょう

デザインパターンはあらゆる場所に適しているわけではありません。ロジックが単純であるにもかかわらず、デザイン パターンの使用にこだわると、構造が複雑になるだけです。ビジネスシナリオに応じてご利用いただけます。

著者について: Nanshanshi: インターネット電子商取引システム開発で 7 年の経験を持つ理工系男性であり、知識共有の分野では初心者です。

<<:  Hadoop、HBase、Hive、Spark の分散システム アーキテクチャを 3 分で理解する

>>:  仮想マシンのバックアップ技術の原理とネットワークの概要

推薦する

企業はWeiboマーケティングの過程でどのような問題に遭遇するのでしょうか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeiboマーケティング...

Camel Code の付加価値サービスが 1 つのアイテム 1 つのコード アクティビティのボトルネックを解消する方法

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています近年、スマ...

中国モバイルインターネット開発レポート、2016年第3四半期

01. モバイルデバイス:モバイルデバイスのアクティブ数 アクティブデバイスの観点から見ると、And...

SEO の専門家はたくさんいます。なぜそう言うのでしょうか?

このタイトルを書くためにペンを手に取ったとき、突然、次の文章の書き方がわからなくなってしまいました。...

ホストオンはどうですか?ジャクソンビルデータセンターVPSの簡単なレビュー

Hosteons は、米国南東部のフロリダ州ジャクソンビルに VPS サービスを展開しています。南米...

交通渋滞は心配するほどのものではありません。

これまで常に強力であったインターネットトラフィックの考え方は、今後どこに向かうのでしょうか? 201...

hostkvm: 新年 40% オフ、オーストラリア AS9929 VPS、月額 4.2 ドルから、Linux/Windows をサポート

hostkvm は新年の特別 VPS プロモーションを実施しました。会場のコンピューター ルームのす...

検索結果で上位にランクインする方法

世界最高のギターのウェブサイトをデザインしている自分を想像してみてください。このサイトには、さまざま...

ブランドマーケティングプロジェクトインデックス

中国のマーケティング代理店は、創設者やチームの専門的背景や専門知識が異なるため、統一されたビジネスロ...

フェスティバルブランドマーケティングをマスターするには?

マスターコングの父の日マーケティングキャンペーンを例に、イベント手法を分析しながら大手メーカーのマー...

清雲新創クラウドは国内の3段階の置き換えを護衛する

現在の国際環境はますます複雑化、深刻化しており、国防や科学技術安全保障の重要性はより顕著になっていま...

百度のハードルを乗り越え、ネットワークプロモーションの道を歩む

Baidu のアルゴリズムは絶えず更新されており、オンラインプロモーションには検索エンジンだけに頼る...

データセンターの仮想化による 10 大メリット

企業のビジネスが拡大するにつれて、データセンターはますます大きなプレッシャーに直面しています。より多...

全能ではない:WeChat O2Oはまだ単なる話

戦争について書面で語ることは軍事戦略においては大きなタブーである。ビジネスは戦場のようなものです。自...

クラウドコンピューティングのコスト上昇を解決する方法

少ないリソースでより多くの成果を上げるというのは矛盾しているように思えるかもしれません。クラウドコス...