国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

堅実な原則

Oct 21, 2024 am 06:12 AM

SOLID Principles

SOLID は、オブジェクト指向プログラミング (OOP) におけるコードの管理性とスケーラビリティを強化するために設計された基本原則の集合です。これは 5 つの重要な原則で構成されています:

  1. S 責任原則 — SRP
  2. O ペン閉鎖原則 — OCP
  3. L iskov の置換原理 — LSP
  4. インターフェース分離原則 — ISP
  5. D 依存性反転原理 — DIP

これらの原則は、2000 年代初頭に Robert C. Martin (ボブおじさんとしても知られる) によって導入され、それ以來ソフトウェア開発コミュニティで広く採用されています。 SOLID 原則に従うことで、開発者は理解しやすく、変更し、拡張しやすいコードを作成でき、より堅牢で保守しやすいソフトウェア システムを実現できます。

単一責任原則 (SRP)

単一責任原則は、OOP と SOLID における最初で最も基本的な原則です。名前のとおり、この原則は「1 つのクラスは、処理すべき特定の責任を 1 つだけ持つべきである」ことを意味します。

Invoice というクラスがあり、このクラスには、generateInvoice() と saveToFiles() という 2 つのメソッドが含まれているとします。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

Invoice クラスには 2 つの責任があるため、これは良い習慣ではありません。より良いアプローチは、これらの機能を専用のクラスに分割することです。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

ここでは、ユースケースに 2 つのクラスがあることがわかります。

  • 請求書の生成
  • ファイルに保存

SRPに従うメリット

  • コード構成の改善 : 懸念事項をさまざまなクラスに分割することで、コードベースがより整理され、ナビゲートしやすくなります。
  • 保守性の向上 : クラスの責任が 1 つである場合、その目的を理解し、予期しない副作用を発生させることなく変更を加えることが容易になります。
  • 再利用性の向上 : 単一の責任を持つクラスは、アプリケーションの別の部分や他のプロジェクトでも再利用できる可能性が高くなります。
  • より簡単なテスト : 単一の責任を持つクラスは通常、小規(guī)模で集中力が高いため、個別にテストすることが容易になります。

オープンクローズ原則 (OCP)

オープン-クローズの原則は、SOLID のもう 1 つの中心的な原則です。この原則は、1997 年に Bertrand Meyer によって導入されました。この原則の背後にある考え方は、「ソフトウェア成果物 (クラス、モジュール、関數) は拡張に対してオープンであるべきですが、変更に対してはクローズされるべきである?!?/p> です。

例:

たとえば、 Shape というクラスがあるとします。このクラスを使用して、形狀の面積を計算できます。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

上記のコードでは、新しいシェイプを追加するには既存の Shape クラスを変更する必要がありますが、これは良い習慣とは見なされません。

以下は、このシナリオにオープンクローズ原則を適用する方法を示すコード例です。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

OCP を適用すると、現在の実裝を変更せずに、必要に応じて多くの形狀を追加できます。

注: インターフェイスの使用が OCP を実現する唯一の方法ではありません。

OCP に従う利點

  • バグのリスクの軽減 : 既存のコードを変更しないことで、新しいバグが発生したり、既存の機能が壊れたりするリスクが最小限に抑えられます。
  • 保守性の向上 : OCP に従うコードは、既存のコードベースを変更せずに新しい機能を追加できるため、保守と拡張が容易になります。
  • 柔軟性の強化 : 抽象化とポリモーフィズムの使用により、より柔軟で適応性のある設計が可能になり、変化する要件への対応が容易になります。

リスコフの置換原理 (LSP)

リスコフの置換原理は、OOP におけるもう 1 つの重要な原理です。これは、1987 年にデータ抽象化に関するカンファレンスの講演中に Barbara Liskov によって導入されました。

原則は、「スーパークラスのオブジェクトは、プログラムの正確さを変えることなく、そのサブクラスのオブジェクトと置き換え可能であるべきである」と述べています。

たとえば、Circle と Rectangle が Shape のサブタイプである場合、Shape オブジェクトを Circle または Rectangle オブジェクトに問題なく置き換えることができるはずです。

public class Shape {
    private String shapeType;
    private double radius;
    private double length;
    private double width;

    public Shape(String shapeType, double radius, double length, double width) {
        this.shapeType = shapeType;
        this.radius = radius;
        this.length = length;
        this.width = width;
    }

    public double area() {
        if (shapeType.equals("circle")) {
            return Math.PI * (radius * radius);
        } else if (shapeType.equals("rectangle")) {
            return length * width;
        } else {
            throw new IllegalArgumentException("Unknown shape type");
        }
    }
}

// Usage
public class Main {
    public static void main(String[] args) {
        Shape circle = new Shape("circle", 5, 0, 0);
        Shape rectangle = new Shape("rectangle", 0, 4, 6);

        System.out.println(circle.area());
        System.out.println(rectangle.area());
    }
}

この例で示したように、リスコフ置換原則に従うということは、スーパークラス インスタンスをサブクラス インスタンスにシームレスに置換できるはずであることを意味します。

LSP に従う利點

  • コードの再利用性の向上 : サブタイプを基本タイプの代わりに使用できるようにすることで、基本タイプを使用するコードはそのサブタイプのいずれでも動作し、コードの再利用が促進されます。
  • 保守性の強化 : LSP に従うコードは、コードベースを変更または拡張するときにバグが発生するリスクが軽減されるため、保守が容易になります。
  • テスト容易性の向上 : LSP を使用すると、クラスとそのサブタイプの単體テストを簡単に作成できます。テストは基本型に対して作成でき、すべてのサブタイプに対して機能するはずです。

インターフェース分離原則 (ISP)

インターフェース分離原則は、Robert C. Martin によって導入された 5 つの SOLID 原則の 1 つです。 「クライアントは、使用しないインターフェースに強制的に依存すべきではない」と述べられています。

言い換えると、1 つの汎用インターフェイスを使用するよりも、タスク固有のインターフェイスを多數使用する方が優(yōu)れています。

以下の例は、汎用インターフェースの使用法を示しています。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

MultifunctionPrinter のような汎用インターフェイスを使用すると、不要なメソッドの実裝が強制され、これは悪い習慣と考えられます。このシナリオにインターフェイス分離原則を適用する方法を見てみましょう。

インターフェース

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

実裝

public class Shape {
    private String shapeType;
    private double radius;
    private double length;
    private double width;

    public Shape(String shapeType, double radius, double length, double width) {
        this.shapeType = shapeType;
        this.radius = radius;
        this.length = length;
        this.width = width;
    }

    public double area() {
        if (shapeType.equals("circle")) {
            return Math.PI * (radius * radius);
        } else if (shapeType.equals("rectangle")) {
            return length * width;
        } else {
            throw new IllegalArgumentException("Unknown shape type");
        }
    }
}

// Usage
public class Main {
    public static void main(String[] args) {
        Shape circle = new Shape("circle", 5, 0, 0);
        Shape rectangle = new Shape("rectangle", 0, 4, 6);

        System.out.println(circle.area());
        System.out.println(rectangle.area());
    }
}

ISP を適用することで、プリンター、スキャナー、ファックスなどの、より小さな役割固有のインターフェース — に分割します。これにより、各クラス (BasicPrinter、AdvancedPrinter、FaxMachine など) が関連する機能のみを実裝できるようになり、モジュール性が促進され、不要な依存関係が削減されます。

ISP をフォローするメリット

  • モジュール化された再利用可能なコード : 大規(guī)模なインターフェイスをより小さく、より具體的なインターフェイスに分割することで、コードはよりモジュール化され、再利用可能になります。クラスまたはモジュールは必要なインターフェイスのみを実裝できるため、不必要な依存関係が減り、システムのさまざまな部分でコードを再利用しやすくなります。
  • コードの複雑さの軽減 : クラスまたはモジュールが必要なインターフェイスのみに依存すると、コードの複雑さが軽減され、理解しやすくなります。これは、開発者が不要なメソッドや依存関係に対処する必要がないためです。これらは、特定の使用例には関係ありません。
  • 保守性の向上 : より小さく、より焦點を絞ったインターフェースにより、コードの保守が容易になります。 1 つのインターフェースへの変更がシステムの他の部分に影響を與える可能性が低くなり、バグが発生したり、既存の機能が破壊されたりするリスクが軽減されます。
  • テスト容易性の向上 : より小さく、より焦點を絞ったインターフェイスにより、個々のコンポーネントの単體テストを簡単に作成できます。これは、無関係なメソッドや依存関係の影響を受けることなく、テストが特定の動作に焦點を當てることができるためです。
  • 柔軟性の向上 : ISP に準拠することで、システムの柔軟性が高まり、拡張や変更が容易になります。新しい機能や要件は、システム全體に影響を與えることなく、新しいインターフェイスを作成するか既存のインターフェイスを変更することで追加できます。

依存関係逆転の原則 (DIP)

依存関係逆転の原則は、SOLID の最後の原則です。これはロバート C. マーティンによっても紹介されました。これにより、コードの疎結合が促進されます。

DIP はいくつかの點を述べています:

  • 高レベルのモジュールは低レベルのモジュールに依存しないでください。
  • どちらも抽象化に依存する必要があります。
  • 抽象化は詳細に依存すべきではありません。
  • 詳細は抽象化に依存する必要があります。

簡単に言うと、クラスは他の特定のクラス (具象実裝) に直接依存するのではなく、インターフェイスまたは抽象クラス に依存する必要があります。これにより、依存クラスを変更せずに実裝を交換できるため、コードがより柔軟になり、保守が容易になります。

密結合コード(DIPなし)

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

上の例に示すように、Computer クラスは Keyboard クラスに直接依存します。

疎結合コード(DIPあり)

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

現在、コンピューターは特定のキーボードではなく、InputDevice インターフェイスに依存しています。これにより、Computer クラスを変更せずに、WirelessKeyboard などの別の入力デバイスに簡単に切り替えることができます。

DIP に従うメリット

  • 疎結合 : 具體的な実裝ではなく抽象化に依存することで、コードの結合が弱くなり、他の部分に影響を與えることなくシステムの一部を変更することが容易になります。
  • 保守性の向上 : 下位モジュールの変更は上位モジュールに影響を與えないため、システムの保守と拡張が容易になります。
  • テスト容易性の強化 : 低レベル モジュールのモック実裝を使用して高レベル モジュールをテストできるため、テストがより速く、より信頼性が高くなります。
  • 再利用性の向上 : 高レベルのモジュールは、依存する低レベルのモジュールを変更することなく、さまざまなコンテキストで再利用できます。

結論

結論として、SOLID 原則: 単一責任、オープン/クローズ、リスコフ置換、インターフェイス分離、および依存性反転は、オブジェクト指向プログラミングでクリーンで保守可能でスケーラブルなコードを記述するための重要なガイドラインを提供します。

これらの原則に従うことで、開発者は理解しやすく、変更し、拡張しやすいシステムを作成でき、最終的にはより高品質のソフトウェアとより効率的な開発プロセスにつながります。

まとめ

この記事を読んでいただきありがとうございます! SOLID の原則と、それを適用してプロジェクトを強化する方法をしっかりと理解していただけたと思います。

フォローしてください:
  • LinkedIn — @nsadisha
  • GitHub — @nsadisha
  • 中 — @nsadisha
  • Dev.to — @nsadisha

— サディシャ?ニムサラ

以上が堅実な原則の詳細內容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ハッシュマップはJavaで內部的にどのように機能しますか? ハッシュマップはJavaで內部的にどのように機能しますか? Jul 15, 2025 am 03:10 AM

HashMapは、Javaのハッシュテーブルを介してキーと値のペアストレージを実裝し、そのコアはデータの位置をすばやく配置することにあります。 1.最初にキーのHashCode()メソッドを使用して、ハッシュ値を生成し、ビット操作を介して配列インデックスに変換します。 2。異なるオブジェクトは、同じハッシュ値を生成し、競合をもたらす場合があります。この時點で、ノードはリンクされたリストの形式で取り付けられています。 JDK8の後、リンクされたリストが長すぎ(デフォルトの長さ8)、効率を改善するために赤と黒の木に変換されます。 3.カスタムクラスをキーとして使用する場合、equals()およびhashcode()メソッドを書き直す必要があります。 4。ハッシュマップは容量を動的に拡大します。要素の數が容量を超え、負荷係數(デフォルト0.75)を掛けた場合、拡張して再ハッシュします。 5。ハッシュマップはスレッドセーフではなく、マルチスレッドでconcuを使用する必要があります

Javaオプションの例 Javaオプションの例 Jul 12, 2025 am 02:55 AM

オプションは、意図を明確に表現し、ヌルの判斷のコードノイズを減らすことができます。 1. optional.ofnullableは、nullオブジェクトに対処する一般的な方法です。たとえば、マップから値を取得する場合、Orelseを使用してデフォルト値を提供できるため、ロジックはより明確かつ簡潔になります。 2.チェーンコールマップを使用してネストされた値を達成してNPEを安全に回避し、リンクが無効である場合はデフォルト値を返す場合は自動的に終了します。 3.フィルターは條件付きフィルタリングに使用でき、その後の操作は條件が満たされた場合にのみ実行され続けます。そうしないと、軽量のビジネス判斷に適したOrelseに直接ジャンプします。 4.基本的なタイプや単純なロジックなど、複雑さを高めるなど、オプションを過剰使用することはお勧めしません。一部のシナリオはNUに直接戻ります。

Javaのキャラクターエンコーディングの問題を処理する方法は? Javaのキャラクターエンコーディングの問題を処理する方法は? Jul 13, 2025 am 02:46 AM

Javaのキャラクターエンコーディングの問題に対処するために、重要なのは、各ステップで使用されるエンコードを明確に指定することです。 1.テキストを読み書きするときは常にエンコードを指定し、inputstreamreaderとoutputStreamWriterを使用し、明示的な文字セットを渡して、システムのデフォルトエンコードに依存しないようにします。 2.ネットワーク境界で文字列を処理するときに両端が一貫していることを確認し、正しいコンテンツタイプのヘッダーを設定し、ライブラリでエンコードを明示的に指定します。 3. string.getBytes()およびNewString(byte [])を注意して使用し、プラットフォームの違いによって引き起こされるデータの破損を避けるために、常に手動でstardantcharsets.utf_8を指定します。要するに、

Javaソケットプログラミングの基礎と例 Javaソケットプログラミングの基礎と例 Jul 12, 2025 am 02:53 AM

Javasocketプログラミングはネットワーク通信の基礎であり、クライアントとサーバー間のデータ交換はソケットを介して実現されます。 1。Javaのソケットは、クライアントが使用するソケットクラスとサーバーが使用するサーバーソケットクラスに分割されます。 2。ソケットプログラムを作成するときは、最初にサーバーリスニングポートを起動してから、クライアントによる接続を開始する必要があります。 3.コミュニケーションプロセスには、接続の確立、データの読み取りと書き込み、ストリームの閉鎖が含まれます。 4.注意事項には、ポート競合の避け、IPアドレスの正確な構成、合理的に閉じるリソース、複數のクライアントのサポートが含まれます。これらをマスターすると、基本的なネットワーク通信機能が実現できます。

java.io.notserializableExceptionを修正する方法は? java.io.notserializableExceptionを修正する方法は? Jul 12, 2025 am 03:07 AM

java.io.notserializableExceptionに遭遇するためのコアワークアウンドは、シリアル化する必要があるすべてのクラスがシリアル化可能なインターフェイスを実裝し、ネストされたオブジェクトのシリアル化サポートを確認することです。 1.メインクラスに機器を追加する可能性のあるものを追加します。 2.クラス內の対応するカスタムフィールドのクラスも、シリアル化可能なものを実裝していることを確認します。 3.一時的に使用して、シリアル化する必要のないフィールドをマークする。 4.コレクションまたはネストされたオブジェクトの非シリアル化されたタイプを確認します。 5.どのクラスがインターフェイスを実裝していないかを確認します。 6.キーデータの保存やシリアル化可能な中間構造の使用など、変更できないクラスの交換設計を検討します。 7.変更を検討してください

Javaの比較対Comparator Javaの比較対Comparator Jul 13, 2025 am 02:31 AM

Javaでは、Defaultのデフォルトソートルールを內部的に定義するためにAcparableが使用され、コンパレータを使用して複數のソートロジックを外部から定義します。 1.Comparableは、クラス自體によって実裝されるインターフェイスです。比較()メソッドを書き換えることにより、自然な順序を定義します。弦や整數など、固定および最も一般的に使用されるソートメソッドを備えたクラスに適しています。 2。Comparatorは、同じクラスに複數の並べ替え方法が必要な狀況に適した、Compare()メソッドを介して実裝された外部定義の機能インターフェイスであり、クラスソースコードを変更できない、またはソートロジックが変更されることが多い場合があります。 2つの違いは、比較可能がソートロジックを定義するだけで、クラス自體を変更する必要があることですが、比較して

Javaのマップを反復する方法は? Javaのマップを反復する方法は? Jul 13, 2025 am 02:54 AM

Javaにはマップを通過する3つの一般的な方法があります。1。エントリセットを使用してキーと値を同時に取得します。これは、ほとんどのシナリオに適しています。 2。キーセットまたは値をそれぞれキーまたは値を通過する。 3. Java8のForeachを使用して、コード構造を簡素化します。 EntrySetは、すべてのキー値ペアを含むセットを返し、各ループはキーと値に頻繁にアクセスするのに適したMap.entryオブジェクトを取得します。キーまたは値のみが必要な場合は、それぞれkeyset()またはvalues()を呼び出すことができます。または、キーを橫斷するときにmap.get(key)を介して値を取得できます。 Java 8はForeachを使用できます((key、value) - &gt

JavaでJsonを解析する方法は? JavaでJsonを解析する方法は? Jul 11, 2025 am 02:18 AM

JavaでJSONを解析するには、Jackson、GSON、またはorg.jsonを使用する3つの一般的な方法があります。 1.ジャクソンは、パフォーマンスと包括的な機能を備えたほとんどのプロジェクトに適しており、オブジェクトとJSON文字列間の変換と注釈マッピングをサポートしています。 2。GSONは、Androidプロジェクトや軽量のニーズにより適しており、使いやすいですが、複雑な構造と高性能シナリオの処理がわずかに劣っています。 3.org.jsonは、単純なタスクや小さなスクリプトに適しており、柔軟性とタイプの安全性がないため、大規(guī)模なプロジェクトにはお勧めしません。選択は、実際のニーズに基づいて決定されるべきです。

See all articles