検索
ホームページJava&#&チュートリアルJava 設計パターンに従う 7 つの原則

Java 設計パターンに従う 7 つの原則

Dec 12, 2016 pm 01:50 PM
Javaのデザインパターン

近年、人々はデザイン パターンを積極的に提唱し、使用しています。その基本的な理由は、コードの再利用性を実現し、コードの保守性を高めるためです。デザイン パターンの実装は、コードの再利用性と保守性の向上という目的を達成するために、いくつかの原則に従っています。デザイン パターンは、オブジェクト指向の 3 つの主要な特徴を理解するのに非常に役立ちます。デザイン パターンを詳しく理解することは困難です。オブジェクト指向開発のメリットを享受できます。学習の初期段階では、これらのモードを統合するのが難しいため、コーディングする前にさらに考え、十分に考えた後にコーディングの練習を開始する必要があります。以下は、デザイン パターンが従うべき 7 つの原則です

1. オープン クローズの原則

定義: クラス、モジュール、関数などのソフトウェア エンティティは、拡張に対してオープンであり、変更に対してクローズされる必要があります。

オープンクローズの原則は、設計するときに、このクラスが十分に優れたものになるように常に考慮し、新しい要件が発生した場合は変更しないようにする必要があることを意味します。 . 元のコードは移動できても移動しません。この原則には 2 つの特徴があります。1 つは「拡張に対してオープン」、もう 1 つは「変化に対してクローズ」です。需要に応じて、プログラムへの変更は、既存のコードを変更するのではなく、新しいコードを追加することによって行われます。これは「オープンクローズ原則」の精神です

例えば、最初はクライアントクラスで追加プログラムを書くだけですぐに完成しましたが、この時点では変更は発生しませんでした。要件は減算関数を追加することでした。この時点で、機能を追加するには元のクラスを変更する必要があり、これはオープンクローズ原則に違反するため、プログラムを再構築し、抽象演算クラスを追加し、特定の加算を分離することを検討する必要があります。減算はクライアントと結合されているため、引き続きニーズを満たし、変更を処理できます。現時点では、乗算と除算の関数を追加する必要がある場合、クライアント クラスと加算と減算のクラスを変更する必要はなく、乗算と除算のサブクラスを追加するだけです。
絶対的な変更のクローズは不可能です。モジュールがどれほど「クローズ」されているとしても、クローズできない変更がいくつか存在します。完全にクローズすることは不可能であるため、設計者は、設計したモジュールのどの変更をクローズするかを決定する必要があります。選択の余地がありません。まず、発生する可能性が最も高い変更の種類を推測し、次にそれらの変更を分離するための抽象化を構築する必要があります。最初にコードを記述するときは、変更は起こらないと想定し、変更が起こった場合には、将来同じ種類の変更を分離するために抽象化を作成します。

私たちが望んでいるのは、開発作業が開始された直後に、起こり得る変更について知ることです。どのような変更が発生したかを知るまでに時間がかかるほど、正しい抽象化を作成することが難しくなります。オープン/クローズの原則はオブジェクト指向設計の中核であり、この原則に従うことで、オブジェクト指向テクノロジによって主張される、保守性、拡張性、再利用性、および柔軟性という大きな利点がもたらされます。開発者は、頻繁に変更されるプログラムの部分のみを抽象化する必要があります。ただし、未熟な抽象化を意図的に拒否することも、抽象化自体と同じくらい重要です。オープンクローズ原則により、以前のコードが変更されていないため、開発者は新しく拡張されたコードに設計を配置することに集中できます。

古典的なことわざとして簡単に言うと、時間は巻き戻せないので、過去は歴史となり変更することはできませんが、今や明日何をするかを自分で決めることができます(つまり、拡張することができます)。

2. リスコフ置換原則

定義 1: T1 型のオブジェクト o1 ごとに、T2 型のオブジェクト o2 が存在する場合、T1 で定義されたすべてのプログラム P がすべてに含まれる場合、オブジェクト o1 が o2 に置き換えられると、プログラム P の動作が変わらない場合、型 T2 は型 T1 のサブタイプになります。

定義 2: サブタイプは親タイプを置き換えることができなければなりません。
説明: ソフトウェア エンティティが親クラスを使用する場合、そのクラスはそのサブクラスに適用可能である必要があり、親クラス オブジェクトとサブクラス オブジェクトの違いを検出できません。つまり、ソフトウェアでは、すべての親クラスがそのクラスに置き換えられます。サブクラスを作成しても、プログラムの動作は変わりません
例: 生物学的な分類では、ペンギンは鳥の一種ですが、プログラミングの世界では、ペンギンは鳥を継承できません。オブジェクト指向設計では、サブクラスは親クラスの非プライベートな動作と属性をすべて持ちます。鳥は飛ぶことができますが、ペンギンは飛ぶことができないため、ペンギンは鳥を継承できません。

サブクラスが親クラスを置き換えることができ、ソフトウェアユニットの機能に影響がない場合にのみ、親クラスを真に再利用でき、サブクラスも親クラスに基づいて新しい動作を追加できます。それはまさにリヒターです。交換原理により継承と再利用が可能になります。親クラス型を使用するモジュールを変更せずに拡張できるのは、まさにサブタイプの置換可能性があるためです。そうでない場合、拡張のためにオープンし、変更のためにクローズすることについてどのように説明できるでしょうか。平たく言えば、リスコフ置換原則は次のとおりです。親クラスの機能を拡張できますが、親クラスの元の機能を変更することはできません。これには次の 4 つのレベルの意味が含まれます:

1. サブクラスは親クラスの抽象メソッドを実装できますが、親クラスの非抽象メソッドをオーバーライドすることはできません。

2. サブクラスは独自のメソッドを追加できます。

3. サブクラスのメソッドが親クラスのメソッドをオーバーライドする場合、メソッドの前提条件 (つまり、メソッドの仮パラメータ) は、親クラスのメソッドの入力パラメータよりも緩くなります。

4. サブクラスのメソッドが親クラスの抽象メソッドを実装する場合、メソッドの事後条件 (メソッドの戻り値) は親クラスの事後条件よりも厳しくなります。

信じられないことのように思えます。なぜなら、私たち自身のプログラミングではリスコフ置換原則に違反することがよくあることがわかりますが、それでもプログラムは正常に実行されます。それで、誰もがこの疑問を抱くでしょう、もし私がリスコフ置換原則に従わないと主張したら、結果はどうなるでしょうか?

その結果、作成したコードで問題が発生する可能性が大幅に高まります。

3. 依存性逆転の原則

定義: 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、両方ともその抽象化に依存すべきであり、抽象化は詳細に依存すべきではありません。つまり、実装のためのプログラムではなく、インターフェイスのためのプログラムです

依存関係の逆転とは、実際には、合意されたインターフェイスを除いて、誰もが依存すべきではないことを意味します。依存関係の逆転は、プログラムを書くときに、詳細、つまりすべての依存関係をプログラミングするのではなく、抽象化を考慮してプログラミングする場合には、オブジェクト指向設計の兆候であると言えます。プログラムの場合は抽象化で終わります。クラスまたはインターフェイスはオブジェクト指向設計であり、それ以外の場合は手続き型設計です。設計のさまざまなコンポーネントやクラスが相互に依存している場合、結合度が高くなり、保守や拡張が困難になります。これはオブジェクト指向の利点を反映しません。

依存関係逆転の原則は、デマンド グループ、開発グループ、テスト グループからなるチームのようなもので、開発グループとテスト グループはすべて同じニーズに直面し、テストの代わりに独自の対応する作業を実行します。開発グループを理解するグループが要件に従ってテスト ケースを作成すること、つまり、開発チームとテスト チームが要件グループに向かって直接作業すること、つまり製品を予定通りにリリースすることを保証することです。そして要件は開発とテストに依存しません。

依存関係逆転の原理は、抽象的なものは詳細の変動性よりもはるかに安定しているという事実に基づいています。抽象化に基づいて構築されたアーキテクチャは、詳細に基づいて構築されたアーキテクチャよりもはるかに安定しています。 Java では、抽象化はインターフェイスまたは抽象クラスを指し、詳細は特定の実装クラスを指します。インターフェイスまたは抽象クラスを使用する目的は、特定の操作を行わずに仕様と契約を作成することであり、詳細を実装クラスに示すタスクは残ります。完了。

依存関係反転の原理の中心となる考え方は、インターフェイス指向のプログラミングです。 依存関係を転送するには、コンストラクター メソッドの転送とセッター メソッドの転送の 2 つの方法があると思います。 Spring フレームワークを使用したことがあります。はい、依存関係の配信方法についてはよくご存知でしょう。

実際のプログラミングでは、通常、次の 3 つの点を行う必要があります:

低レベルのモジュールには、抽象クラスまたはインターフェイス、あるいはその両方が必要です。

変数の宣言型は、可能な限り抽象クラスまたはインターフェースにする必要があります。

継承を使用する場合は、リスコフ置換原則に従ってください。

つまり、依存関係の逆転の原理では、インターフェース向けのプログラミングが必要になります。インターフェース指向のプログラミングを理解すれば、依存関係の逆転も理解できるようになります。

4. インターフェース分離原則

インターフェース分離原則の意味は、単一のインターフェースを確立し、巨大で肥大化したインターフェースを構築せず、可能な限りインターフェースを改良し、インターフェース内のメソッドを最小限にすることです。できるだけ。言い換えれば、呼び出しに依存するすべてのクラスに対して巨大なインターフェイスを構築しようとするのではなく、クラスごとに専用のインターフェイスを確立する必要があります。プログラミングでは、1 つの包括的なインターフェイスに依存するよりも、複数の特殊なインターフェイスに依存する方が柔軟性が高くなります。インターフェースは設計時に外部から設定される「契約」であり、複数のインターフェースを分散定義することで外部からの変更の波及を防ぎ、システムの柔軟性と保守性を向上させることができます。

そういえば、多くの人はインターフェース分離原則が単一責任原則によく似ていると思うでしょうが、そうではありません。まず、単一責任原則はもともと責任に焦点を当てていましたが、インターフェイス分離原則はインターフェイスの依存関係の分離に焦点を当てていました。第二に、単一責任原則は主にクラスを制約し、次にインターフェイスとメソッドを制約し、プログラムの実装と詳細を対象としますが、インターフェイス分離原則は主にインターフェイスを制約し、主に抽象化と全体的なフレームワークの構築を目的とします。プログラム。

インターフェース分離の原則を使用してインターフェースを制限する場合は、次の点に注意してください:

1. インターフェースを可能な限り小さくしますが、制限内に保ちます。インターフェイスを改良するとプログラミングの柔軟性が向上することは事実ですが、小さすぎるとインターフェイスが多くなり、設計が複雑になります。したがって、それは適度に行う必要があります。

2. インターフェイスに依存するクラスのサービスをカスタマイズし、必要なメソッドのみを呼び出しクラスに公開し、不要なメソッドを非表示にします。モジュールにカスタマイズされたサービスを提供することに重点を置くことによってのみ、確立される依存関係を最小限に抑えることができます。

3. 結束力を高め、外部とのやり取りを減らします。ほとんどのことを達成するためにインターフェイスで使用するメソッドを最小限にします。

インターフェイス分離の原則を使用し、インターフェイスの設計が大きすぎても小さすぎてもよくありません。インターフェイスを設計するときは、より多くの時間を考えて計画することによってのみ、この原則を正確に実装することができます。

4. 結合/集約再利用の原則

は、再利用の目的を達成するために、継承関係の代わりに可能な限り合成と集約を使用することを意味します
この原則は、新しいオブジェクトで既存のオブジェクトを使用することです。新しいオブジェクトの一部: 新​​しいオブジェクトは、これらのオブジェクトに委任することで既存の機能を再利用するという目的を達成します。
実際、ここでの最後のことは、「has-a」と「is-a」の違いを区別することです。合成や集約と比較した場合、継承の欠点は、親クラスのすべてのメソッドが子クラスに公開されることです。親クラスが変更されると、サブクラスも変更する必要があります。集約を再利用すると、他のクラスへの依存が少なくなります。 。
合成/集約の再利用
① 利点:
新しいオブジェクトがコンポーネント オブジェクトにアクセスする唯一の方法は、コンポーネント オブジェクトのインターフェイスを経由することです
コンポーネント オブジェクトの内部の詳細が目に見えないため、この種の再利用はブラック ボックスの再利用です。新しいオブジェクトに;

この種の再利用はパッケージ化をサポートします;

この種の再利用では必要な依存関係が少なくなります;
各新しいクラスは 1 つのタスクに集中できます;
この種の再利用は実行時に動的に行うことができ、新しいオブジェクトは合成を使用できます/aggregation 関係を使用して、新しい責任を適切なオブジェクトに委任します。
② デメリット:
このように再利用してシステムを構築すると、管理すべきオブジェクトが増えます。

継承の再利用

① 利点:
基本クラスのほとんどの関数は継承関係を通じて自動的に派生クラスに入ることができるため、新しい実装が簡単です。
継承された実装の変更または拡張が簡単です。
② 欠点:
継承により基本クラスの実装の詳細が派生クラスに公開されるため、継承の再利用はパッケージ化を破壊します。
基本クラスの実装が変更されると、実装が変更されます。派生クラスの変更も必要です
基本クラスから継承された実装は静的であり、実行時に変更できず、十分な柔軟性がありません。
6. デメテルの法則

デメテルの法則の基本的な考え方は、クラス間の結合が弱いほど、結合されたクラスの再利用が促進されます。言い換えれば、情報の隠蔽はソフトウェアの再利用を促進します。

私たちはプログラミングに触れてきたので、ソフトウェア プログラミングの一般原則、つまり低結合と高凝集性を知っています。プロセス指向プログラミングでもオブジェクト指向プログラミングでも、モジュール間の結合を可能な限り低く保つことによってのみ、コードの再利用率を向上させることができます。低結合の利点は自明ですが、プログラミングを通じてどのように低結合を実現できるのでしょうか?それがまさにデメテルの法則が達成しようとしていることです。

最も知られていない原則としても知られるディミットの法則は、1987 年に米国のノースイースタン大学のイアン ホランドによって初めて提案されました。平たく言えば、クラスが依存するクラスについての知識が少なければ少ないほど良いのです。つまり、依存クラスでは、どんなに複雑なロジックであっても、ロジックは可能な限りクラス内にカプセル化し、提供されるパブリックメソッド以外には情報が外部に漏洩しないようにする必要があります。デメテルの法則の定義はより単純です。つまり、直接の友人とのみ通信するというものです。まず、直接のフレンドとは何かについて説明します。各オブジェクトは他のオブジェクトとカップリング関係を持ちます。2 つのオブジェクト間にカップリング関係がある限り、その 2 つのオブジェクトはフレンドであると言います。結合には、依存関係、関連付け、結合、集約など、さまざまな方法があります。このうち、メンバー変数、メソッドのパラメータ、メソッドの戻り値に現れるクラスを直接の友達と呼びますが、ローカル変数に現れるクラスは直接の友達ではありません。言い換えれば、馴染みのないクラスがローカル変数としてクラス内に出現しないことが最善です。

一言でまとめると、オブジェクトは他のオブジェクトに関する最小限の知識を保持する必要があります。

7. 単一責任の原則

定義: クラス変更の理由は複数あってはならない。平たく言えば、クラスは 1 つの責任に対してのみ責任を負い、その変更の理由は 1 つだけであるはずです

単一責任の原則に関しては、多くの人がそれを却下するでしょう。シンプルすぎるからです。たとえ少し経験のあるプログラマがデザイン パターンを読んだことも、単一責任の原則について聞いたこともなかったとしても、ソフトウェアを設計する際にはこの重要な原則を意識的に遵守します。これは常識だからです。ソフトウェアプログラミングでは、1 つの関数を変更することによって他の関数が誤動作することを誰も望んでいません。この問題を回避する方法は、単一責任の原則に従うことです。単一責任の原則は非常にシンプルで常識と考えられていますが、経験豊富なプログラマが作成したプログラムであっても、この原則に違反するコードが含まれる可能性があります。なぜこのような現象が起こるのでしょうか?責任が増大するからです。いわゆる責任分散とは、何らかの理由で責任 P がより詳細な責任 P1 と責任 P2 に分割されることを意味します。

単一責任の原則に従う利点は次のとおりです:

1. クラスは 1 つの責任のみを担当し、そのロジックは複数の責任を担当するよりも明らかに単純です。クラスの信頼性を向上させ、システムの保守性を向上させます。

3. 単一責任の原則に従えば、他の機能への影響は避けられません。機能を大幅に削減できます。

説明する必要があることの 1 つは、単一責任の原則はオブジェクト指向プログラミングに固有のものではないということです。モジュール型プログラミングである限り、この重要な原則に従う必要があります。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
プラットフォームの独立性は、エンタープライズレベルのJavaアプリケーションにどのように利益をもたらしますか?プラットフォームの独立性は、エンタープライズレベルのJavaアプリケーションにどのように利益をもたらしますか?May 03, 2025 am 12:23 AM

Javaは、プラットフォームの独立性により、エンタープライズレベルのアプリケーションで広く使用されています。 1)プラットフォームの独立性は、Java Virtual Machine(JVM)を介して実装されているため、Javaをサポートする任意のプラットフォームでコードを実行できます。 2)クロスプラットフォームの展開と開発プロセスを簡素化し、柔軟性とスケーラビリティを高めます。 3)ただし、パフォーマンスの違いとサードパーティライブラリの互換性に注意を払い、純粋なJavaコードやクロスプラットフォームテストの使用などのベストプラクティスを採用する必要があります。

プラットフォームの独立性を考慮して、JavaはIoT(Thingのインターネット)デバイスの開発においてどのような役割を果たしますか?プラットフォームの独立性を考慮して、JavaはIoT(Thingのインターネット)デバイスの開発においてどのような役割を果たしますか?May 03, 2025 am 12:22 AM

javaplaysasificanificantduetduetoitsplatformindepence.1)itallowscodetobewrittendunonvariousdevices.2)java'secosystemprovidesutionforiot.3)そのセキュリティフィートルセンハンス系

Javaでプラットフォーム固有の問題に遭遇したシナリオと、どのように解決したかを説明してください。Javaでプラットフォーム固有の問題に遭遇したシナリオと、どのように解決したかを説明してください。May 03, 2025 am 12:21 AM

TheSolution to HandlefilepathsaCrosswindossandlinuxinjavaistousepaths.get()fromthejava.nio.filepackage.1)usesystem.getProperty( "user.dir")およびhearterativepathtoconstructurctthefilepath.2)

開発者にとってJavaのプラットフォーム独立性の利点は何ですか?開発者にとってJavaのプラットフォーム独立性の利点は何ですか?May 03, 2025 am 12:15 AM

java'splatformentepenceissificAntiveSifcuseDeverowsDevelowSowRitecodeOdeonceantoniTONAnyPlatformwsajvm.これは「writeonce、runanywhere」(wora)adportoffers:1)クロスプラットフォームの複雑性、deploymentacrossdiferentososwithusisues; 2)re

さまざまなサーバーで実行する必要があるWebアプリケーションにJavaを使用することの利点は何ですか?さまざまなサーバーで実行する必要があるWebアプリケーションにJavaを使用することの利点は何ですか?May 03, 2025 am 12:13 AM

Javaは、クロスサーバーWebアプリケーションの開発に適しています。 1)Javaの「Write and、Run Averywhere」哲学は、JVMをサポートするあらゆるプラットフォームでコードを実行します。 2)Javaには、開発プロセスを簡素化するために、SpringやHibernateなどのツールを含む豊富なエコシステムがあります。 3)Javaは、パフォーマンスとセキュリティにおいて優れたパフォーマンスを発揮し、効率的なメモリ管理と強力なセキュリティ保証を提供します。

JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?May 02, 2025 am 12:25 AM

JVMは、バイトコード解釈、プラットフォームに依存しないAPI、動的クラスの負荷を介してJavaのWORA機能を実装します。 2。標準API抽象オペレーティングシステムの違い。 3.クラスは、実行時に動的にロードされ、一貫性を確保します。

Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?May 02, 2025 am 12:18 AM

Javaの最新バージョンは、JVMの最適化、標準的なライブラリの改善、サードパーティライブラリサポートを通じて、プラットフォーム固有の問題を効果的に解決します。 1)Java11のZGCなどのJVM最適化により、ガベージコレクションのパフォーマンスが向上します。 2)Java9のモジュールシステムなどの標準的なライブラリの改善は、プラットフォーム関連の問題を削減します。 3)サードパーティライブラリは、OpenCVなどのプラットフォーム最適化バージョンを提供します。

JVMによって実行されたバイトコード検証のプロセスを説明します。JVMによって実行されたバイトコード検証のプロセスを説明します。May 02, 2025 am 12:18 AM

JVMのバイトコード検証プロセスには、4つの重要な手順が含まれます。1)クラスファイル形式が仕様に準拠しているかどうかを確認し、2)バイトコード命令の有効性と正確性を確認し、3)データフロー分析を実行してタイプの安全性を確保し、検証の完全性とパフォーマンスのバランスをとる。これらの手順を通じて、JVMは、安全で正しいバイトコードのみが実行されることを保証し、それによりプログラムの完全性とセキュリティを保護します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。