検索
ホームページバックエンド開発PHPチュートリアルPHPマスター|ファサードパターンで複雑さを管理します

PHPマスター|ファサードパターンで複雑さを管理します

設計パターンは、ソフトウェア開発で直面する一般的な問題のソリューションを標準化するために構築されています。複雑なアプリケーションを開発するときは、アプリの設計と構造を計画するのに十分な時間を割り当てる必要があります。そうすると、適切な設計パターンを選択する機会があります。しかし、デザインパターンを使用していることを知らずにデザインパターンを使用する状況がある場合があります。 ファサードは、ほぼすべてのWebアプリケーションで使用される設計パターンですが、多くの場合、知らないことがあります。 「デザインパターン」という用語は、複雑で理解しにくい何かの精神的なイメージを作成します。これは時々真である可能性がありますが、ファサードパターンは簡単に実装できます。良いコードを書くのに役立つのは、ファサードとそれが何をするか見てみましょう。

キーテイクアウト

  • ファサードは、ほぼすべてのWebアプリケーションで使用される設計パターンであり、複雑なプロセスを簡素化し、より合理化されたユーザーエクスペリエンスを可能にします。
  • ファサードパターンはシステムの複雑さを隠し、単純化されたインターフェイスを提供し、各ユニットが他のユニットについて最小限の知識を持つべきである知識の最小の原則に準拠しています。
  • ファサードパターンの実際のアプリケーションには、サードパーティ認証サービスのファサードインターフェイスとして機能するOpauthライブラリと、WordPressのupdate_post_meta()関数が含まれます。 🎜>
  • ファサードパターンは、コードの読みや使用性を向上させ、サブシステムとそのクライアント間のデカップリングを促進し、複雑なサブシステムへのインターフェイスを簡素化するため、有益です。ただし、あまりにも多くの機能がファサードに配置されている場合、それはボトルネックになり、クライアントからサブシステムの有用な機能を非表示にする可能性があります。
  • 本を借りるプロセス
  • ライブラリ管理システムのアプリケーションを開発していると仮定します。本の借入と返還は、明らかにそのようなシステムの2つの最も重要なタスクです。ただし、本の借入プロセスの典型的な実装を考えてみましょう。
ユーザーが図書館に来て、新しい本を借りることができるように借りた本を返します。

ユーザーは、延期された本に罰金を支払う必要があります。

    ユーザー、または図書館スタッフのメンバーが新しい本を検索します。
  • 本の可用性は検証されています。
  • 上記の手順が正常に完了した場合、本の場所を取得する必要があります。
  • ユーザーは本を借ります。
  • 本のステータスは、システムでは利用できないとマークされています。
各タスクの実装は、独自のインターフェイスを備えた別々のクラスに含まれています。次のコードは、システムが必要な方法を呼び出すことでユーザーが本を借りる方法を示しています。
<span><span><?php </span></span><span><span>public class User
</span></span><span><span>{
</span></span><span>    <span>public function borrowBook() {
</span></span><span>        <span>$bookManager = new Book_Manager();
</span></span><span>        <span>$bookManager->returnBooks();
</span></span><span>
</span><span>        <span>$bookPayments = new Book_Payments();
</span></span><span>        <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span>            <span>$bookPayments->payBookFines();
</span></span><span>        <span>}
</span></span><span>
</span><span>        <span>$bookLibrary = new Book_Library();
</span></span><span>        <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span>        <span>$book = $bookLibrary->searchBooks();
</span></span><span>        <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span>        <span>$isReserved = $bookReservations->isBookReserved($book); 
</span></span><span>        <span>if ($isAvailable && !isReserved) {
</span></span><span>            <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span>            <span>$bookManager->borrowBook($book);
</span></span><span>            <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span>        <span>}
</span></span><span>    <span>}
</span></span><span><span>}</span></span></span>
本を借りるプロセスは、実際には複雑なプロセスであることがわかります!この実装では、ユーザーは本を借りるために4つの異なるクラスと約10の方法と対話する必要があります。 機能の各ビットがアプリケーション内の個別の画面として実装されていると仮定します。このシステムで3冊の本を借りるために必要な努力を想像できますか?また、借り手は、予約のチェックやステータスの更新などの機能について知る必要はありません。確かに実装に問題があります。 ライブラリファサードの実装

ライブラリの複雑なワークフローからユーザーを切り離し、ユーザーに直接関連する情報のみを公開する単純化されたインターフェイスを可能にする必要があります。図書館のファサードの実装を見てみましょう。
<span><span><?php </span></span><span><span>class Library_Facade
</span></span><span><span>{
</span></span><span>    <span>public function returnBooks() {
</span></span><span>        <span>// previous implementation by calling necessary classes
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function borrowBooks() {
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function searchBooks() {
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function reserveBooks() {
</span></span><span>    <span>}
</span></span><span><span>}</span></span></span>
ユーザーは、次の例に示すように、Library_Facadeクラスのbrobrebook()メソッドに電話することで本を借りることができます。
<span><span><?php </span></span><span><span>class User
</span></span><span><span>{
</span></span><span>    <span>public function borrowBook() {
</span></span><span>        <span>$libraryFacade = new Library_Facade();
</span></span><span>        <span>$libraryFacade->borrowBook();
</span></span><span>    <span>}
</span></span><span><span>}</span></span></span>
このファサードベースの実装により、ユーザーはLibrary_facadeクラスとのみ話し合い、それ以外の機能がどのように実装されているかわかりません。ユーザーはファサードから任意の機能を直接リクエストでき、ファサードは複雑なプロセスを処理し、適切な情報を返す責任があります。ファサードパターンは、各ユニットが他のユニットに関する知識を最小限に抑える必要があるという最小の知識の原則に準拠しています。 低レベルの機能はファサードを介してユーザーから隠されていますが、ユーザーは必要に応じて低レベルのクラスを直接要求できます。自分のプロジェクトと、それを実現せずにファサードパターンを実装した状況を見つける可能性のある場所について考えてください。

ファサードパターンの定義

ファサードパターンを実装するプロセスと重要性を特定したので、パターンの定義を学ぶ時が来ました。以下はウィキペディアから抽出されています。
ファサードは、クラスライブラリなど、より大きなコードボディに単純化されたインターフェイスを提供するオブジェクトです。ファサードは:
  • ファサードには一般的なタスクの便利な方法があるため、ソフトウェアライブラリを使いやすく、理解し、テストしやすいものにします。 同じ理由で、ライブラリをより読みやすくします;
  • ほとんどのコードはファサードを使用してシステムの開発においてより柔軟性を可能にするため、
  • 外部コードの依存関係を削減します。
  • は、十分に設計されたAPIのコレクションを1つの適切に設計したAPIで包みます。 ファサードパターンの定義に記載されているコンポーネントを識別するライブラリの例のクラス図を次に示します。
  • Real Worldの実装

    前のセクションでは、ライブラリシステムを例として使用して、ファサードパターンの背後にある理論を学びました。現実の世界では、ファサードは、ライブラリシナリオの実装よりもはるかに複雑になる可能性があります。実際のアプリケーションとライブラリのコンテキストで、パターンのいくつかの実装を確認しましょう。 オープン認証のための

    Opauth

    私は最近、Opauthという人気のあるオープン認証ライブラリに関する記事を書きました。まだお届けしない場合は、読むことをお勧めします。プロのソーシャルネットワークサイトを開発したと仮定し、ユーザーがTwitter、LinkedIn、Facebookなどの他の人気のあるサイトを使用して認証できると仮定します。認証プロセスを完了するために、既存のサードパーティライブラリを使用して、ネットワークのサービスにアクセスします。目的の機能を達成するためのTwitterライブラリを使用して、いくつかのサンプルコードを見てみましょう。
    <span><span><?php </span></span><span><span>public class User
    </span></span><span><span>{
    </span></span><span>    <span>public function borrowBook() {
    </span></span><span>        <span>$bookManager = new Book_Manager();
    </span></span><span>        <span>$bookManager->returnBooks();
    </span></span><span>
    </span><span>        <span>$bookPayments = new Book_Payments();
    </span></span><span>        <span>if ($bookPayments->hasOverdueBooks()) {
    </span></span><span>            <span>$bookPayments->payBookFines();
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>        <span>$bookLibrary = new Book_Library();
    </span></span><span>        <span>$bookReservations = new Book_Reservations();
    </span></span><span>
    </span><span>        <span>$book = $bookLibrary->searchBooks();
    </span></span><span>        <span>$isAvailable = $bookLibrary->isBookAvailable($book);
    </span></span><span>        <span>$isReserved = $bookReservations->isBookReserved($book); 
    </span></span><span>        <span>if ($isAvailable && !isReserved) {
    </span></span><span>            <span>$bookLibrary->locateBook($book);
    </span></span><span>
    </span><span>            <span>$bookManager->borrowBook($book);
    </span></span><span>            <span>$bookLibrary->updateBookAvailability($book, $status);
    </span></span><span>        <span>}
    </span></span><span>    <span>}
    </span></span><span><span>}</span></span></span>
    ご覧のとおり、Twitter固有のライブラリメソッドのセットを呼び出して、目的の機能を実装します。 LinkedInとFacebookの両方に同様のアプローチが必要です。プロセスはすでに複雑になっています。 Twitter、Facebook、またはLinkedInアプリケーションを開発していません。資格情報を検証し、ユーザーを認証するだけです。当社のアプリケーションは、これらの各サービスの実装について心配するべきではありません。 Opauthライブラリをファサードインターフェイスとして使用することにより、この問題を解決できます。まず、Opauthプラグインによって識別される共通形式で目的のサービスのログインURLを指定する必要があります。認証プロセスを実装するための次のコードを検討してください。
    <span><span><?php </span></span><span><span>class Library_Facade
    </span></span><span><span>{
    </span></span><span>    <span>public function returnBooks() {
    </span></span><span>        <span>// previous implementation by calling necessary classes
    </span></span><span>    <span>}
    </span></span><span>
    </span><span>    <span>public function borrowBooks() {
    </span></span><span>    <span>}
    </span></span><span>
    </span><span>    <span>public function searchBooks() {
    </span></span><span>    <span>}
    </span></span><span>
    </span><span>    <span>public function reserveBooks() {
    </span></span><span>    <span>}
    </span></span><span><span>}</span></span></span>
    ログインリンクが要求されると、OpauthはURLから要求されたサービスを識別し、ライブラリを初期化してユーザーを認証にリダイレクトします。アプリケーションは、ログインリンクを作成し、初期化メソッドを呼び出すだけで必要です。すべての複雑な認証のものは、各サービスのそれぞれのライブラリを使用して、舞台裏で処理されます。これは、ファサードパターンを効果的に使用するための完璧な例と見なすことができます。

    WordPress Meta関数

    WordPressは、コードの品質を考慮して、真剣なPHP開発者の中で最も人気のあるフレームワークの1つではありません。ただし、WordPressコードベース内で、多くの成功したファサードの実装を簡単に見つけることができます。ここでは、WordPress投稿のカスタムデータを保存するためのupdate_post_meta()関数を見てみましょう。 WordPressを使用すると、既存の投稿に関連付けられたカスタムフィールドを作成できます。これらのフィールドを通常の状況でどのように保存するかを考えてください。次のすべてのタスクを実装する必要があります。
    • フィールドデータを検証します
    • HTMLタグ、スクリプト、およびSQLインジェクションのデータをフィルタリング
    • データベースのフィールドの存在を確認してください
    • 存在ステータスに基づいてレコードを保存または更新
    これは、1つのカスタムフィールドを保存するための非常に多くの作業です! WordPressは、update_post_meta()と呼ばれる組み込み関数を提供することにより、これらのフィールドを保存する複雑さを隠します ファサードとして行動する。これにより、アプリケーションに関連する必要なデータを渡すことに集中することができます。前述のタスクはすべてユーザーから隠されています。 ここで、update_post_meta()の実装を検討して、その機能をファサードとして識別します。
    <span><span><?php </span></span><span><span>public class User
    </span></span><span><span>{
    </span></span><span>    <span>public function borrowBook() {
    </span></span><span>        <span>$bookManager = new Book_Manager();
    </span></span><span>        <span>$bookManager->returnBooks();
    </span></span><span>
    </span><span>        <span>$bookPayments = new Book_Payments();
    </span></span><span>        <span>if ($bookPayments->hasOverdueBooks()) {
    </span></span><span>            <span>$bookPayments->payBookFines();
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>        <span>$bookLibrary = new Book_Library();
    </span></span><span>        <span>$bookReservations = new Book_Reservations();
    </span></span><span>
    </span><span>        <span>$book = $bookLibrary->searchBooks();
    </span></span><span>        <span>$isAvailable = $bookLibrary->isBookAvailable($book);
    </span></span><span>        <span>$isReserved = $bookReservations->isBookReserved($book); 
    </span></span><span>        <span>if ($isAvailable && !isReserved) {
    </span></span><span>            <span>$bookLibrary->locateBook($book);
    </span></span><span>
    </span><span>            <span>$bookManager->borrowBook($book);
    </span></span><span>            <span>$bookLibrary->updateBookAvailability($book, $status);
    </span></span><span>        <span>}
    </span></span><span>    <span>}
    </span></span><span><span>}</span></span></span>
    必要なコードのみが表示されます。 update_metadata()関数の完全なソースコードは、wp-includesディレクトリ内のmeta.phpファイルで使用できます。ただし、ここではすべての検証、フィルタリング、およびデータベースの更新が実装されていることを確認でき、ファサードインターフェイスのみが詳細について知識を持っています。

    結論

    ファサードは、ソフトウェア開発で最もシンプルで使いやすいデザインパターンの1つです。この記事を通して、ファサードパターンのさまざまな実装について説明しました。さあ、以下のコメントであなたの経験を共有しましょう。ファサードを利用するライブラリやサービスを知っていますか?出会ったファサードパターンの実用的な実装を自由に共有してください。 Fotoliaを介した画像 ファサードパターンに関するよくある質問

    ソフトウェアデザインのファサードパターンの主な目的は何ですか?

    ファサードパターンは、クラス、ライブラリ、またはフレームワークの複雑なシステムに単純化されたインターフェイスを提供する構造設計パターンです。システムの複雑さを隠し、クライアントがシステムにアクセスできるクライアントにインターフェイスを提供します。このパターンには、クライアントが必要とする単純化された方法を提供し、既存のシステムクラスのメソッドに呼び出しを委任する単一のクラスが含まれます。

    ファサードパターンはコードの読みやすさと使いやすさをどのように改善しますか?複雑なサブシステムにシンプルなインターフェイスを提供することにより、コードの読みや使用性を向上させます。クライアントにいくつかのサブシステムクラスを直接処理させる代わりに、ファサードは統一されたインターフェイスを使用してサブシステムをカプセル化します。これにより、サブシステムを理解するために必要な学習曲線が削減され、サブシステムの使用と管理が容易になります。ファサードパターンは、コンピューターの使用です。コンピューターをオンにすると、内部コンポーネントがどのように連携してシステムを起動する方法を理解する必要はありません。電源ボタン(ファサード)を押すだけで、複雑なプロセスが舞台裏で行われます。

    ファサードパターンを使用することの利点と欠点は何ですか?

    ファサードパターンの主な利点は、複雑なサブシステムへのインターフェイスを単純化し、クライアントが使いやすくすることです。また、サブシステムとそのクライアント間のデカップリングを促進し、システムをよりモジュール化し、維持しやすくすることができます。ただし、潜在的な不利な点は、ファサードにあまりにも多くの機能が置かれている場合、ファサードパターンがボトルネックになる可能性があることです。また、クライアントからサブシステムの有用な機能を非表示にすることができます。

    ファサードパターンは、他の構造設計パターンとどのように異なりますか?個々のオブジェクトの動作を追加または変更するために使用されます。ファサードパターンは、複雑なクラスシステムを簡素化するために使用されます。クライアントからサブシステムの複雑さを隠している複雑なサブシステムへの単純化されたインターフェイスを提供します。他のデザインパターンと組み合わせて使用​​されます。たとえば、シングルトンパターンで使用して、ファサードの1つのインスタンスのみが作成されるようにすることができます。また、抽象的な工場パターンで使用して、関連するオブジェクトのファミリを作成するための単純なインターフェイスを提供することもできます。オブジェクト間の通信を制限することにより、最小の知識(またはデメテルの法則)の原則に貢献します。クライアントは、サブシステムのクラスではなく、ファサードと通信する必要があります。これにより、オブジェクト間の依存関係が削減され、システムがより堅牢で維持が容易になります。マルチスレッドアプリケーション。ただし、ファサードがスレッドセーフであることを確認するために注意する必要があります。これは、人種条件を防ぐためにロックやセマフォなどの同期メカニズムを使用することで実現できます。

    ファサードパターンはパフォーマンスにどのように影響しますか?クライアントは対話する必要があります。これにより、オブジェクトの作成とメソッドの呼び出しのオーバーヘッドが減少します。ただし、ファサードがボトルネックになった場合、パフォーマンスに悪影響を与える可能性があります。複雑なサブシステムに簡素化されたインターフェイスを提供するファサードクラス。ファサードクラスは、サブシステムをカプセル化し、コールをサブシステムクラスに委任する必要があります。クライアントは、サブシステムクラスと直接ではなく、ファサードを介してサブシステムと対話する必要があります。

以上がPHPマスター|ファサードパターンで複雑さを管理しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPでセッションCookieパラメーターをどのように設定しますか?PHPでセッションCookieパラメーターをどのように設定しますか?Apr 22, 2025 pm 05:33 PM

PHPのセッションCookieパラメーターの設定は、session_set_cookie_params()関数を通じて達成できます。 1)この関数を使用して、有効期限、パス、ドメイン名、セキュリティフラグなどのパラメーターを設定します。 2)session_start()を呼び出して、パラメーターを有効にします。 3)ユーザーログインステータスなど、ニーズに応じてパラメーターを動的に調整します。 4)セキュリティを改善するために、セキュアとhttponlyフラグを設定することに注意してください。

PHPでセッションを使用する主な目的は何ですか?PHPでセッションを使用する主な目的は何ですか?Apr 22, 2025 pm 05:25 PM

PHPでセッションを使用する主な目的は、異なるページ間でユーザーのステータスを維持することです。 1)セッションはsession_start()関数を介して開始され、一意のセッションIDを作成し、ユーザーCookieに保存します。 2)セッションデータはサーバーに保存され、ログインステータスやショッピングカートのコンテンツなど、さまざまなリクエスト間でデータを渡すことができます。

サブドメイン間でセッションをどのように共有できますか?サブドメイン間でセッションをどのように共有できますか?Apr 22, 2025 pm 05:21 PM

サブドメイン間でセッションを共有する方法は?一般的なドメイン名にセッションCookieを設定することにより実装されます。 1.セッションCookieのドメインをサーバー側の.example.comに設定します。 2。メモリ、データベース、分散キャッシュなど、適切なセッションストレージ方法を選択します。 3. Cookieを介してセッションIDを渡すと、サーバーはIDに基づいてセッションデータを取得および更新します。

HTTPSを使用することはセッションセキュリティにどのように影響しますか?HTTPSを使用することはセッションセキュリティにどのように影響しますか?Apr 22, 2025 pm 05:13 PM

HTTPSは、データ送信を暗号化し、中間の攻撃を防ぎ、認証を提供することにより、セッションのセキュリティを大幅に改善します。 1)暗号化されたデータ送信:HTTPSはSSL/TLSプロトコルを使用してデータを暗号化して、送信中にデータが盗まれたり改ざんされたりしないようにします。 2)中間の攻撃を防ぐ:SSL/TLSハンドシェイクプロセスを通じて、クライアントはサーバー証明書を検証して接続の正当性を確保します。 3)認証の提供:HTTPSは、接続が正当なサーバーであることを保証し、データの整合性と機密性を保護します。

PHPの継続的な使用:その持久力の理由PHPの継続的な使用:その持久力の理由Apr 19, 2025 am 12:23 AM

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPおよびPython:類似点と相違点を調査しますPHPおよびPython:類似点と相違点を調査しますApr 19, 2025 am 12:21 AM

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Safe Exam Browser

Safe Exam Browser

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

メモ帳++7.3.1

メモ帳++7.3.1

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