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 分で理解する

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

推薦する

VMware は、マルチクラウドの機会を捉え、無限の可能性を引き出すパートナーをサポートします。

エンタープライズ ソフトウェアにおける世界有数のイノベーターである VMware (NYSE: VM...

SEO アカデミー: SEO 業界のための 10 のヒント

1.SEO は単なる補助ツールです。魔法のようなものだと考えないでください。 2. SEO 学習の初...

新しいメディアのジレンマ!

WeChatパブリックプラットフォームが立ち上げられた後、大手企業はこぞってオープンプラットフォーム...

テンセントは「WeChatの盗作に対する無策」に反応:オリジナル保護メカニズムを開始

2月1日夜、新華社通信は3本連続で記事を掲載し、一般アカウントのコンテンツの「盗用」がますます横行し...

678CDN: アジア最速の CDN/高防御、苦情無視、50% 割引、カスタム CC ポリシーをサポート、新規ユーザーには 100G の高防御トラフィックを提供

678cdnは春節特別限定50%オフプロモーションを開始し、新規ユーザーは0元で100Gの高防御トラ...

Baidu ウェブマスター プラットフォームの外部リンク データ分析を取得するための Python3 スクリプト

Baiduウェブマスターツールの外部リンクツールで照会された外部リンクデータを分析するために、Pyt...

オリジナルコンテンツの掲載に関する百度の3つの判断

「Baidu Original」の話題はよく取り上げられ、インターネット上では関連投稿が数多く出回っ...

ユーザーエクスペリエンスはSEOの究極の目標です

SEO 最適化の目的は何ですか? Baidu のホームページにランクインして、より多くのユーザーが検...

Google のアップデートは何を意味するのでしょうか?

2012年2月7日、Googleは再びPRを更新しました。今回の更新はマイナーアップデートかもしれま...

kvmla - 日本の独立サーバー/ソフトバンク+KDDI/80%割引+300元のギフト

1 か月以上のテストを経て、kvmla の Equinix OS1 データ センターが日本大阪で正式...

ワールドカップ広告:市場は勝ち取ったが感情は失った

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

edgevirt: 四半期あたり 4.5 ドル、10 Gbps 帯域幅、無制限トラフィック、512 MB メモリ/1 コア/10g SSD、マイアミ データ センター、米国

edgevirtは2017年1月4日に設立された新会社です。シアトル、マイアミ、アムステルダムのデー...

webhostingbuzz-5 USD/512 MB RAM/10 GB HDD/1 TB Flow/Phoenix

webhostingbuzz.com は、よく知られているアメリカのホスティング会社です。2002 ...

良いエントリーポイントがあれば、ソフト記事は宣伝効果を発揮できる

ソフト記事の台頭は一時的なものではなく、ルネサンスでもありません。むしろ、それはオンラインでの宣伝や...