推定読書時間: 6 分
デザイン パターンは、標準関数やライブラリのように、コピーしてプログラムに挿入できるコードではありません。デザイン パターンは、特定の問題を解決できる一般的な概念です。基本的には、その詳細に従い、プログラムの現実に適合するソリューションを実装できるモデルです。
モデルはアルゴリズムと混同されることがよくあります。これは、両方の概念が既知の問題に対する典型的な解決策を説明しているためです。アルゴリズムでありながら、 defi特定の目標を達成できる一連の明確なアクションが常に存在する場合、モデルはソリューションのより高いレベルの記述になります。同じモデルのコードを 2 つの異なるプログラムに適用しても、異なる場合があります。
料理のレシピを例に挙げてみましょう。どちらにも、目標を達成するための明確な手順があります。ただし、モデルはプロジェクトに似ており、その結果とその特性がどのようなものであるかはわかりますが、実装の正確な順序はコードを作成する人によって異なります。
ほとんどのパターンは、人々がさまざまな文脈で再現できるように、非常に形式的に説明されています。モデルの説明に含まれる要素を以下に見てみましょう。
プログラマーはデザインパターンの存在を知らなくてもソフトウェアを開発できます。多くの人がそうしており、そのため、知らずにいくつかの計画を実行します。しかし、それではなぜそれらを学ぶために時間を費やす必要があるのでしょうか?
設計パターンは、設計されたシステム全体での複雑さ、詳細レベル、および適用可能性の規模が異なります。
類推すると、いくつかの信号機を設置したり、歩行者用の地下通路を備えた立体インターチェンジ全体を建設したりすることで、交差点をより安全にすることができます。
最も基本的な低レベルのモデルは、よく呼ばれます。 慣用句 。通常、これらは 1 つのプログラミング言語にのみ適用されます。
最も普遍的で高レベルのモデルは次のとおりです。 建築模型 。開発者は、これらのパターンを事実上あらゆる言語で実装できます。他のパターンとは異なり、アプリケーション全体のアーキテクチャを設計するために使用できます。
さらに、すべてのモデルはその特徴に従って分類できます。 インテント または目的。 3 つの主要なクラスは次のとおりです。
ファサード は、ライブラリ、フレームワーク、またはその他の複雑なクラスのセットに簡素化されたインターフェイスを提供する構造設計パターンです。
洗練されたライブラリまたはフレームワークに属する大規模なオブジェクトのセットに基づいてソフトウェアを動作させる必要があると仮定しましょう。通常、これらすべてのオブジェクトを初期化し、依存関係を追跡し、メソッドを正しい順序で実行するなどの作業が必要になります。
その結果、クラスのビジネス ロジックがサードパーティ クラスの実装の詳細と密接に結合することになり、クラスの理解と管理が困難になります。
A facade
は、多くの可動部分を含む複雑なサブシステムに単純なインターフェイスを提供するクラスです。あ facade
サブシステムを直接操作する場合と比較して、提供される機能が制限される場合があります。ただし、顧客が本当に気にする機能のみが含まれています。
持っている facade
これは、アプリを数十の機能を持つ洗練されたライブラリと統合する必要があるが、その機能のごく一部しか必要としない場合に役立ちます。
たとえば、猫が登場する短い面白いビデオをソーシャル メディアにアップロードするアプリは、プロ仕様のビデオ変換ライブラリを使用する可能性があります。ただし、実際に必要なのは、単一のメソッドを持つクラスだけです。 encode(filename, format)
。このようなクラスを作成し、ビデオ変換ライブラリに接続すると、最初のクラスが作成されます。 facade
.
たとえば、コールセンターの電話オペレーターは、 facade
。実際、電話注文のために店舗の電話サービスに電話すると、オペレーターが対応します。 facade
店舗のすべてのサービスと部門に向けて。オペレーターは、注文システム、支払いゲートウェイ、さまざまな配送サービスにシンプルな音声インターフェイスを提供します。
について考える ファサード いくつかの複雑なサブシステム用の単純なアダプターとして。 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
先週の月曜日、フィナンシャル・タイムズ紙はOpenAIとの契約を発表した。 FT は世界クラスのジャーナリズムにライセンスを供与しています…