1. はじめに
ソフトウェア デザイン パターン (デザイン パターン) は、デザイン パターンとも呼ばれ、繰り返し使用され、ほとんどの人に知られ、分類およびカタログ化されたコード設計経験の要約です。設計パターンは、コードを再利用可能にするために使用され、コードを他の人が理解しやすくし、コードの信頼性を確保し、プログラムの再利用性を確保します。
例えば、豪邸や丸太小屋を建てるのと同じで、機能がシンプルで機能やコードが少ない場合はすぐに着手できますが、豪邸のように機能が複雑な場合は、要件が変わる可能性があります。コードの量が多くてすぐに始められない、建築図面のように事前に計画して設計する必要があり、設計パターンはソフトウェア (プログラム) の建築図面のようなものです。
2. デザインパターンの分類
**クリエイティブ モード:**ファクトリ メソッド モード、アブストラクト ファクトリ モード、シングルトン モード、ビルダー モード、プロトタイプ モードの 5 つのタイプがあります。
**構造モード:** アダプター モード、デコレーター モード、プロキシ モード、アピアランス モード、ブリッジ モード、コンビネーション モード、フライウェイト モードの合計 7 種類。
**ビヘイビアモード:** 戦略モード、テンプレートメソッドモード、オブザーバーモード、反復サブモード、責任連鎖モード、コマンドモード、メモモード、状態モード、ビジターモード、仲介モード、解釈デバイスの合計11種類モード。
3. デザインパターンの目的
コードの再利用性同じ機能のコードを何度も書く必要がなく、冗長性を低減
可読性プログラミングの標準化により、他のプログラマーが読みやすく理解しやすい
スケーラビリティ新しい機能を追加する必要がある場合、
信頼性を維持するのに非常に便利です新しい機能を追加する場合、元の機能に影響はありません
凝集度が高く、結合度が低いという特性を示すプログラムを作成する.モジュールは密に内部に存在するが、モジュール間の依存関係は小さく、一方のエラーは他方に影響を与えない.
4. デザインパターンの7原則
4.1 単一責任原則(Single Responsibility Principle)
定義: クラスは、全能になるのではなく、機能領域で対応する責任のみを負います。
利点:
- クラスの複雑さが軽減され、実装される責任が明確に定義されます。
- 読みやすさが向上し、複雑さが軽減されるため、もちろん読みやすさも向上します。
- 保守性が向上し、可読性が向上し、もちろん保守も容易になります。
- 変更によって引き起こされるリスクが軽減され、変更が不可欠です. インターフェースの単一の責任がうまく行われる場合, インターフェースの変更は対応する実装クラスにのみ影響し、他のインターフェースには影響しません. これはスケーラビリティに影響を与えます.システムの保守性. すべて非常に役に立ちます.
4.2 開閉原理 (OCP)
定義: ソフトウェア エンティティは、拡張に対してオープンであり、変更に対してクローズされている必要があります。开闭原则的关键在于抽象化
. プログラムを拡張する必要がある場合、ホットスワップ効果を実現するために元のコードを変更することはできません。簡単に言えば、プログラムをスケーラブルにし、保守とアップグレードを容易にすることです。
4.3 Liskov Substitution Principle (リスコフ置換原理)
定義: 基本クラス オブジェクトへのすべての参照は、そのサブクラスのオブジェクトを透過的に使用できます [サブクラスは、親クラスの非抽象メソッドをオーバーライドすべきではありません]。里氏代换原则是实现开闭原则的重要方式之一
、次の点に注意する必要があります。
(1) サブクラスのすべてのメソッドを親クラスで宣言するか、サブクラスが親クラスで宣言されたすべてのメソッドを実装する必要があります。
(2) 親クラスを抽象クラスまたはインターフェースとして設計し、サブクラスに親クラスを継承または親インターフェースを実装させ、親クラスで宣言されたメソッドを実装するようにしてください。
(3) サブクラスは、親クラスの非抽象メソッドをオーバーライドすべきではありません (オーバーロードすることはできますが、親クラスのメソッドを調整する必要があります)。
4.4 依存性逆転の原則 (DIP)
定義: 抽象化は詳細に依存してはならず、詳細は抽象化に依存する必要があります。是开闭原则的基础。【可以通过依赖注入的方式实现】,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象
. 一般的に使用される注入方法には、構造注入、セッター注入 (セッター注入)、界面注入の 3 つがあります。
(1) コンストラクション インジェクションとは、コンストラクターを介して特定のクラスのオブジェクトを渡すことを指します。
(2) セット値注入とは、Setter メソッドを介して特定のクラスのオブジェクトを渡すことを指します。
(3) インターフェース注入とは、インターフェースで宣言されたビジネス メソッドを介して特定のクラスのオブジェクトを渡すことを指します。
これらのメソッドは、定義時に抽象型を使用し、実行時に特定の型のオブジェクトを渡します。サブクラス オブジェクトは親クラス オブジェクトをカバーします。
オープンとクローズの原則が目的であり、リスコフ置換の原則が基礎であり、依存性逆転の原則が手段です。
4.5 インターフェイス分離の原則 (Interface Segregation Principle、ISP)
定義: 単一の汎用インターフェースではなく、複数の専用インターフェースを使用します。【需要把控好接口的粒度】
予防:
1) インターフェース分離の原則を使用する場合、次のことを行う必要があります注意控制接口的粒度
。
(2) インターフェースは小さすぎてはいけません。小さすぎると、システム内のインターフェースのフラッディングが発生し、メンテナンスが困難になります。
(3) インターフェースは大きすぎてはいけません。大きすぎるインターフェイスは、インターフェイスの分離の原則に違反し、柔軟性が低く、使用するのに不便です。
一般に、インターフェイスには特定のクラスのユーザー向けにカスタマイズされたメソッドのみが含まれ、クライアントは使用しないメソッドに依存することを余儀なくされるべきではありません。
4.6 複合再利用の原則 (CRP)
定義: 再利用の際は組み合わせ/集約関係 (関連付け関係) を使用し、継承を少なくするようにします。
通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性
. 継承は基本クラスの実装の詳細をサブクラスに公開するため、基本クラスの内部の詳細は通常サブクラスに表示されるため、この種の再利用は「ホワイト ボックス」再利用とも呼ばれます。サブクラスの実装を変更する必要があり、基本クラスから継承された実装は静的であり、実行時に変更できないため、十分な柔軟性がありません。
一般的に言えば、如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承
. 「Is-A」は厳密な分類学的意味での定義で、あるクラスが別のクラスの「a」であることを意味し、「Has-A」は異なり、特定の役割が特定の責任を持つことを意味します。
4.7 デメテルの法則 (デメテルの法則、LoD)
定義: ソフトウェア エンティティは、システム機能モジュールが比較的独立しているように、他のエンティティとのやり取りをできるだけ少なくする必要があります。