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

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

推薦する

クラウドサービスはすでに広く利用されているが、クラウドセキュリティの改善が必要

現在までに、クラウド サービスは 10 年以上の開発の歴史を持っています。当初の IT サービス モ...

あなたの会社はクラウド コンピューティング運用を保護する準備ができていますか?

あらゆる規模の企業が業務の多くをクラウド プラットフォームに移行し続ける中、最も一般的で危険なクラウ...

hmbcoud Half Moon Bayの100Mbps帯域幅の香港VPSの簡単なレビュー

hmbcoud Half Moon Bay の香港 VPS は、最大 100Mbps の帯域幅で B...

上位にランクインするために、コアキーワードを中心にウェブサイトを構築しましょう

SEO はますます競争が激しくなっています。業界の競争が比較的少なく、コンテンツと外部リンクに頼るだ...

ウェブサイトのプラグインを使用することでウェブサイトの粘度を効果的に向上できる方法の簡単な分析

どのような種類のウェブサイトを運営している場合でも、ウェブサイトの粘度が高く、多くのリピーターを獲得...

Kubernetes VPA (Pod Vertical Autoscaling) を 1 つの記事でマスターする

導入前回の記事では、HPA(Horizo​​ntal Pod Autoscaler)の実装について紹...

hostsolutions: ルーマニア VPS、DMCA フリー、年間 76 ユーロ、KVM、3.6T ハードディスク、10T トラフィック

Hostsolutions の社長が戻ってきました (体調不良だそうです)。プロモーション用に 50...

ロゴをデザインする際に注意すべきことは何ですか? LOGOデザインネットワークは、独自のロゴを作成するのに役立ちます

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

クラウド データベース移行の 10 の間違い

より高速でスケーラブルな導入とコスト削減を実現するために、データベース・アズ・ア・サービス (DBa...

ベアメタルクラウド: クラウドコンピューティングの未来

近年、クラウド コンピューティングはビジネスの運営方法に革命をもたらし、比類のない柔軟性、拡張性、コ...

李佳奇の対戦相手は仮想アンカー

午前3時には、24時間営業のコンビニエンスストアが開いているだけでなく、24時間営業のバーチャルアン...

SEO戦略: ハリー・ポッターがSEOを知っていたら

現在、SEO は、理性、魔法、謎、そして少しのユーモアに満ちた、ハリー・ポッターのような冒険物語にな...

2017 年にクリスマス マーケティングを最も活用するブランドはどれでしょうか?

クリスマスが近づいてきました。12月で最も賑やかなお祭りであるクリスマスに、今年は大手ブランドからど...

Weibo の賞品授与活動は宣伝のためだけの無駄遣いではないでしょうか?

Weibo マーケティングについて話すとき、ほとんどの企業は Weibo の活動を最もよく知っていま...

IXWebHostingは、外国貿易の電子商取引ウェブサイト構築に人気のアメリカのホストです。

国内外の貿易電子商取引は急速に発展しており、インターネットに依存する電子商取引企業もウェブサイトに大...