グッズ

デザインパターンとは何ですか: デザインパターンを使用する理由、分類、長所と短所

ソフトウェア エンジニアリングでは、設計パターンは、ソフトウェア設計でよく発生する問題に対する最適な解決策です。

プレプロジェクトのようなものですdefiコード内で繰り返し発生する設計上の問題を解決するためにカスタマイズできる、実証済みの優れたツールです。

推定読書時間: 6

デザインパターンとは

デザイン パターンは、標準関数やライブラリのように、コピーしてプログラムに挿入できるコードではありません。デザイン パターンは、特定の問題を解決できる一般的な概念です。基本的には、その詳細に従い、プログラムの現実に適合するソリューションを実装できるモデルです。

モデルはアルゴリズムと混同されることがよくあります。これは、両方の概念が既知の問題に対する典型的な解決策を説明しているためです。アルゴリズムでありながら、 defi特定の目標を達成できる一連の明確なアクションが常に存在する場合、モデルはソリューションのより高いレベルの記述になります。同じモデルのコードを 2 つの異なるプログラムに適用しても、異なる場合があります。

料理のレシピを例に挙げてみましょう。どちらにも、目標を達成するための明確な手順があります。ただし、モデルはプロジェクトに似ており、その結果とその特性がどのようなものであるかはわかりますが、実装の正確な順序はコードを作成する人によって異なります。

デザインパターンは何でできていますか?

ほとんどのパターンは、人々がさまざまな文脈で再現できるように、非常に形式的に説明されています。モデルの説明に含まれる要素を以下に見てみましょう。

  • 意図 モデルの部分では、問題と解決策の両方が簡単に説明されています。
  • 動機 さらに、問題とモデルによって可能になる解決策について説明します。
  • 構造 「クラスの」は、モデルの各部分とそれらがどのように関連しているかを示します。
  • コード例 最も人気のあるプログラミング言語の 1 つを使用すると、モデルの背後にある考え方を理解しやすくなります。

なぜそれらを使用するのでしょうか?

プログラマーはデザインパターンの存在を知らなくてもソフトウェアを開発できます。多くの人がそうしており、そのため、知らずにいくつかの計画を実行します。しかし、それではなぜそれらを学ぶために時間を費やす必要があるのでしょうか?

  • デザインパターンはキットになっています 実証済みのソリューション ソフトウェア設計における一般的な問題に対処します。これらの問題に遭遇したことがない場合でも、パターンを知っておくと、オブジェクト指向の設計原則を使用してあらゆる種類の問題を解決する方法がわかるため、役に立ちます。
  • デザインモデル defiこれらは、あなたとあなたのチームがより効果的にコミュニケーションするために使用できる共通言語を作成します。 「ああ、これを行うにはシングルトンを使用してください」と言えば、誰もがあなたの提案の背後にあるアイデアを理解するでしょう。パターンとその名前がわかっていれば、シングルトンが何であるかを説明する必要はありません。

デザインパターンの分類

設計パターンは、設計されたシステム全体での複雑さ、詳細レベル、および適用可能性の規模が異なります。

類推すると、いくつかの信号機を設置したり、歩行者用の地下通路を備えた立体インターチェンジ全体を建設したりすることで、交差点をより安全にすることができます。

最も基本的な低レベルのモデルは、よく呼ばれます。 慣用句 。通常、これらは 1 つのプログラミング言語にのみ適用されます。

最も普遍的で高レベルのモデルは次のとおりです。 建築模型 。開発者は、これらのパターンを事実上あらゆる言語で実装できます。他のパターンとは異なり、アプリケーション全体のアーキテクチャを設計するために使用できます。

さらに、すべてのモデルはその特徴に従って分類できます。 インテント または目的。 3 つの主要なクラスは次のとおりです。

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。
  • 創作モデル これらは、柔軟性を高め、既存のコードを再利用するオブジェクト作成メカニズムを提供します。
  • 構造モデル オブジェクトとクラスをより大きな構造に組み立てて、これらの構造を柔軟かつ効率的に保つ方法について説明します。
  • 行動モデル オブジェクト間の効果的なコミュニケーションと責任の割り当てを扱います。

Laravelのデザインパターン例:ファサード

ファサード は、ライブラリ、フレームワーク、またはその他の複雑なクラスのセットに簡素化されたインターフェイスを提供する構造設計パターンです。

問題

洗練されたライブラリまたはフレームワークに属する大規模なオブジェクトのセットに基づいてソフトウェアを動作させる必要があると仮定しましょう。通常、これらすべてのオブジェクトを初期化し、依存関係を追跡し、メソッドを正しい順序で実行するなどの作業が必要になります。

その結果、クラスのビジネス ロジックがサードパーティ クラスの実装の詳細と密接に結合することになり、クラスの理解と管理が困難になります。

ソルツィオーネ

A facade は、多くの可動部分を含む複雑なサブシステムに単純なインターフェイスを提供するクラスです。あ facade サブシステムを直接操作する場合と比較して、提供される機能が制限される場合があります。ただし、顧客が本当に気にする機能のみが含まれています。

持っている facade これは、アプリを数十の機能を持つ洗練されたライブラリと統合する必要があるが、その機能のごく一部しか必要としない場合に役立ちます。

たとえば、猫が登場する短い面白いビデオをソーシャル メディアにアップロードするアプリは、プロ仕様のビデオ変換ライブラリを使用する可能性があります。ただし、実際に必要なのは、単一のメソッドを持つクラスだけです。 encode(filename, format)。このようなクラスを作成し、ビデオ変換ライブラリに接続すると、最初のクラスが作成されます。 facade.

たとえば、コールセンターの電話オペレーターは、 facade。実際、電話注文のために店舗の電話サービスに電話すると、オペレーターが対応します。 facade 店舗のすべてのサービスと部門に向けて。オペレーターは、注文システム、支払いゲートウェイ、さまざまな配送サービスにシンプルな音声インターフェイスを提供します。

PHP での実際の例

について考える ファサード いくつかの複雑なサブシステム用の単純なアダプターとして。 Facade 単一クラス内の複雑さを分離し、他のアプリケーション コードが単純なインターフェイスを使用できるようにします。

この例では、 Facade YouTube API と FFmpeg ライブラリの複雑さをクライアント コードから隠します。クライアントは、数十のクラスを操作する代わりに、Facade で単純なメソッドを使用します。

<?php

namespace RefactoringGuru\Facade\RealWorld;

/**
 * The Facade provides a single method for downloading videos from YouTube. This
 * method hides all the complexity of the PHP network layer, YouTube API and the
 * video conversion library (FFmpeg).
 */
class YouTubeDownloader
{
    protected $youtube;
    protected $ffmpeg;

    /**
     * It is handy when the Facade can manage the lifecycle of the subsystem it
     * uses.
     */
    public function __construct(string $youtubeApiKey)
    {
        $this->youtube = new YouTube($youtubeApiKey);
        $this->ffmpeg = new FFMpeg();
    }

    /**
     * The Facade provides a simple method for downloading video and encoding it
     * to a target format (for the sake of simplicity, the real-world code is
     * commented-out).
     */
    public function downloadVideo(string $url): void
    {
        echo "Fetching video metadata from youtube...\n";
        // $title = $this->youtube->fetchVideo($url)->getTitle();
        echo "Saving video file to a temporary file...\n";
        // $this->youtube->saveAs($url, "video.mpg");

        echo "Processing source video...\n";
        // $video = $this->ffmpeg->open('video.mpg');
        echo "Normalizing and resizing the video to smaller dimensions...\n";
        // $video
        //     ->filters()
        //     ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
        //     ->synchronize();
        echo "Capturing preview image...\n";
        // $video
        //     ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
        //     ->save($title . 'frame.jpg');
        echo "Saving video in target formats...\n";
        // $video
        //     ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
        //     ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
        //     ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
        echo "Done!\n";
    }
}

/**
 * The YouTube API subsystem.
 */
class YouTube
{
    public function fetchVideo(): string { /* ... */ }

    public function saveAs(string $path): void { /* ... */ }

    // ...more methods and classes...
}

/**
 * The FFmpeg subsystem (a complex video/audio conversion library).
 */
class FFMpeg
{
    public static function create(): FFMpeg { /* ... */ }

    public function open(string $video): void { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}

class FFMpegVideo
{
    public function filters(): self { /* ... */ }

    public function resize(): self { /* ... */ }

    public function synchronize(): self { /* ... */ }

    public function frame(): self { /* ... */ }

    public function save(string $path): self { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}


/**
 * The client code does not depend on any subsystem's classes. Any changes
 * inside the subsystem's code won't affect the client code. You will only need
 * to update the Facade.
 */
function clientCode(YouTubeDownloader $facade)
{
    // ...

    $facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");

    // ...
}

$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);

Ercole Palmeri

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

最近の記事

Veeam は、保護から対応、回復まで、ランサムウェアに対する最も包括的なサポートを備えています

Coveware by Veeam は、サイバー恐喝インシデント対応サービスを引き続き提供します。 Coveware はフォレンジックと修復機能を提供します…

4月23 2024

グリーン革命とデジタル革命: 予知保全が石油・ガス業界をどのように変革するか

予知保全は、プラント管理に対する革新的かつ積極的なアプローチにより、石油・ガス部門に革命をもたらしています。

4月22 2024

英国の反トラスト規制当局がGenAIをめぐりビッグテックに警鐘を鳴らす

英国CMAは人工知能市場におけるビッグテック企業の行動について警告を発した。そこには…

4月18 2024

カーサ グリーン: イタリアの持続可能な未来のためのエネルギー革命

建物のエネルギー効率を高めるために欧州連合が制定した「グリーンハウス」法令は、立法手続きを次のように終了しました。

4月18 2024

あなたの言語でイノベーションを読む

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

Seguici