Java 設計原則の単一責任原則、オープニングとクローズの原則、リスコフ置換原則

記事ディレクトリ

オブジェクト指向設計原則の概要

単一責任の原則

 開閉原理

 リスコフ置換原理


オブジェクト指向設計原則の概要

        ソフトウェアの保守性(Maintainability) と再利用性(Reusability) は、ソフトウェアの品質を測定するために使用される 2 つの非常に重要な属性です。ソフトウェアの保守性とは、ソフトウェアの理解、修正、適応、および拡張の容易さを指します。ソフトウェアの再利用性の程度は、ソフトウェアの品質を測定するために使用されます。ソフトウェアを簡単に再利用できます

        オブジェクト指向設計の目標の 1 つは保守性と再利用をサポートすることですが、一方では設計スキームやソース コードの再利用を実現する必要があり、他方ではシステムを容易に拡張および拡張できるようにする必要があります。改良済みでメンテナンス性も良好です。

        オブジェクト指向設計原則は、その後の設計パターン学習の基礎にもなり、特定の設計パターンは 1 つ以上のオブジェクト指向設計原則に準拠します。

7 つの一般的なオブジェクト指向設計原則

単一責任の原則

概要

単一責任原則は、最も単純なオブジェクト指向設計原則です。クラスの粒度を        制御するために使用されます。その定義は次のとおりです:オブジェクトには単一の責任のみが含まれるべきであり、この責任は単一のクラスにカプセル化されますもう 1 つの定義は、クラスに関する限り、クラスが変更される理由は 1 つだけであるはずです

        ソフトウェア システムでは、クラス (モジュールからメソッドまで) が引き受ける責任が増えるほど、そのクラスが再利用される可能性は低くなります。また、クラスが引き受ける責任が多すぎると、責任の 1 つが変更されたときに、これらの責任を結合することと同じになります。他の責任の操作に影響を与える可能性があるため、これらの責任は分離する必要があり、異なる責任は異なるクラスにカプセル化する必要があります。つまり、異なる変更理由は異なるクラスにカプセル化する必要があります。複数の責任が常に同時に変更される場合それらを同じクラスにカプセル化します

単一責任原則は、高い凝集性と低い結合性        を達成するためのガイドラインであり、最も単純ですが、適用するのが最も難しい原則です。

この設計原理が最もシンプルで理解しやすいため、サンプルコードは省略します。


 開閉原理

概要

         開閉の原則は、オブジェクト指向の再利用可能な設計の最初の基礎であり、オブジェクト指向の最も重要な設計原則です。

オープンクローズ原則の定義は、ソフトウェア エンティティは拡張に対してオープンであり、変更に対してクローズである必要があるということです。平たく言えば、オープンとクローズの原則は、元のコードをできるだけ変更せずにソフトウェア エンティティを拡張することを指します。

        開閉の原則を満たすためには、システムを抽象的に設計する必要があり、抽象化が開閉の原則の鍵となります。多くのオブジェクト指向言語では、インターフェイスや抽象クラスなどのメカニズムが提供されており、これを通じてシステムの抽象層を定義し、特定のクラスを通じて拡張できます。新しいビジネス要件が発生した場合、抽象化層を変更せずに新しいビジネス機能を実現する具象クラスを追加するだけで済むため、元のコードやオープンソースの要件を変更することなくシステムの機能を拡張できます。近い原則を満たすことができます。

 例

コード

抽象スキン.java
package com.Demo.Principles.开闭原则;
/**
 * 抽象皮肤类
 */
public abstract class AbstractSkin {
    //用于显示
    public abstract void display();
}
デフォルトスキン.java
package com.Demo.Principles.开闭原则;

public class DefaultSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("这是默认皮肤...");
    }
}
HeimaSkin.java
package com.Demo.Principles.开闭原则;

public class HeimaSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("这是黑马皮肤...");
    }
}
SogoInput.java

        このクラスは集約関係を実現しており、抽象スキンクラスと具象スキンクラスを集約し、後者と前者は部分対全体の関係に属する。

package com.Demo.Principles.开闭原则;

/**
 * 聚合关系:搜狗输入法类
 */
public class SogoInput {
    private AbstractSkin skin;
    //传入皮肤类
    public void setSkin(AbstractSkin skin){
        this.skin=skin;
    }
    //调用当前皮肤的显示输出的方法
    public void display(){
        skin.display();
    }
}

 既存のスキン オブジェクトをテストする

 現時点で、キング スキンの追加が必要な新しいビジネス要件がある場合は、抽象スキン クラスを継承してそのすべてのメソッドを実装する新しい具体スキン クラスを追加するだけで、「開閉原則」が実現さます」。

キングスキン.java

以前の特定のスキンクラスの記述方法と一致しており、ビジネス拡張のためにオリジナルのコードを変更する必要はありません。

package com.Demo.Principles.开闭原则;

public class KingSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("这是王者皮肤...");
    }
}

新しく追加されたスキンをテストする

これは、オープンとクローズの原則を単純に適用したもので、元のコードを変更することなくビジネス機能の拡張が実現され、拡張にはオープンであり、変更にはクローズされます


 リスコフ置換原理

概要

         Liskov 置換原則は、基本クラス (親クラス) へのすべての参照が、そのサブクラスのオブジェクトを透過的に使用できなければならないことを意味します。

一般的な理解では、サブクラスは親クラスの機能を拡張できますが、親クラスの元の機能を変更することはできません。

        つまり、サブクラスが親クラスを継承する場合、新しいビジネス機能を完成させるために新しいメソッドを追加するだけでなく、親クラスのメソッドを書き換えないように注意してください。そうしないと、継承システム全体の再利用性が低下します。

リスコフ置換原則では次のように述べられています。

  • ソフトウェア内の基本クラス オブジェクトをそのサブクラス オブジェクトに置き換えると、プログラムはエラーや例外を生成しません。
  • 逆は当てはまりません。ソフトウェア エンティティがサブクラス オブジェクトを使用する場合、基本クラス オブジェクトを使用できない可能性があります。

 したがって、ソフトウェアを設計するときは次のようになります。

  • 基本クラス オブジェクトが使用されている場所ではサブクラス オブジェクトを使用できるため、プログラム内で基本クラス タイプを使用してオブジェクトを定義してください。その後、実行時にサブクラス タイプを決定し、親クラス オブジェクトをサブクラス オブジェクトで置き換えます。
  • この原則を使用する場合、基本クラス、つまり親クラスは、サブクラスが親クラスを継承するか、親クラスのインターフェイスを実装し、クラスで宣言されたメソッドを実装するように、抽象クラスまたはインターフェイスとして設計する必要があります親クラスのインスタンスを置き換えることで、元のサブクラスのコードを変更することなくシステムの機能を簡単に拡張できます 新しい機能の追加は、新しいサブクラスを追加することで実現できます

終わり。

おすすめ

転載: blog.csdn.net/qq_52487066/article/details/129768815