Perkiraan waktu membaca: 6 minuti
Pola desain bukanlah kode yang bisa kita salin dan sisipkan ke dalam program kita, seperti yang bisa kita lakukan dengan fungsi atau pustaka standar. Pola desain merupakan suatu konsep umum yang mampu memecahkan suatu permasalahan tertentu. Pada dasarnya sebuah model yang detailnya dapat kami ikuti dan terapkan solusi yang sesuai dengan realitas program kami.
Model sering kali dikacaukan dengan algoritma, karena kedua konsep tersebut menggambarkan solusi tipikal untuk beberapa masalah yang diketahui. Sedangkan suatu algoritma defiJika selalu ada serangkaian tindakan yang jelas yang dapat mencapai tujuan tertentu, model adalah deskripsi solusi pada tingkat yang lebih tinggi. Kode dari model yang sama yang diterapkan pada dua program berbeda mungkin berbeda.
Jika ingin dianalogikan, kita bisa memikirkan resep masakannya: sama-sama memiliki langkah yang jelas untuk mencapai suatu tujuan. Namun, model lebih seperti sebuah proyek, yang mana Anda dapat melihat apa hasil dan karakteristiknya, tetapi urutan implementasi yang tepat bergantung pada kita yang menulis kodenya.
Kebanyakan pola dideskripsikan dengan sangat formal sehingga orang dapat mereproduksinya dalam banyak konteks. Mari kita lihat di bawah elemen-elemen yang ada dalam deskripsi suatu model:
Seorang programmer dapat mengembangkan perangkat lunak tanpa mengetahui keberadaan pola desain. Banyak yang melakukan hal tersebut, dan karena alasan ini mereka menerapkan beberapa skema tanpa menyadarinya. Namun mengapa kita harus meluangkan waktu untuk mempelajarinya?
Pola desain berbeda dalam kompleksitas, tingkat detail, dan skala penerapan di seluruh sistem yang dirancang.
Dengan analogi, kita dapat membuat persimpangan lebih aman dengan memasang beberapa lampu lalu lintas atau membangun persimpangan bertingkat dengan jalur bawah tanah untuk pejalan kaki.
Model tingkat rendah yang paling dasar sering disebut idiom . Biasanya hanya berlaku untuk satu bahasa pemrograman.
Model yang paling universal dan tingkat tinggi adalah model arsitektur . Pengembang dapat menerapkan pola ini di hampir semua bahasa. Tidak seperti pola lainnya, pola ini dapat digunakan untuk merancang arsitektur seluruh aplikasi.
Selanjutnya semua model dapat diklasifikasikan menurutnya mencoba atau tujuan. Tiga kelas utama tersebut adalah:
Fasad adalah pola desain struktural yang menyediakan antarmuka yang disederhanakan ke perpustakaan, kerangka kerja, atau kumpulan kelas kompleks lainnya.
Mari kita asumsikan kita perlu membuat perangkat lunak berfungsi, berdasarkan pada sekumpulan besar objek milik perpustakaan atau kerangka kerja yang canggih. Biasanya, kita perlu menginisialisasi semua objek ini, melacak dependensi, mengeksekusi metode dalam urutan yang benar, dan seterusnya.
Akibatnya, logika bisnis kelas akan menjadi sangat terkait dengan detail implementasi kelas pihak ketiga, sehingga sulit untuk dipahami dan dikelola.
sebuah facade
adalah kelas yang menyediakan antarmuka sederhana ke subsistem kompleks yang berisi banyak bagian yang bergerak. A facade
mungkin menyediakan fungsionalitas terbatas dibandingkan dengan bekerja secara langsung dengan subsistem. Namun, ini hanya mencakup fitur-fitur yang benar-benar dipedulikan pelanggan.
Punya satu facade
ini berguna ketika kita perlu mengintegrasikan aplikasi dengan perpustakaan canggih yang memiliki lusinan fitur, namun kita hanya memerlukan sebagian kecil dari fungsinya.
Misalnya, aplikasi yang mengunggah video pendek lucu dengan kucing ke media sosial berpotensi menggunakan perpustakaan konversi video profesional. Namun, yang kita perlukan hanyalah kelas dengan metode tunggal encode(filename, format)
. Setelah membuat kelas seperti itu dan menghubungkannya ke perpustakaan konversi video, kita akan memiliki kelas pertama facade
.
Misalnya, operator telepon suatu call center adalah seperti a facade
. Faktanya, ketika kita menghubungi layanan telepon toko untuk melakukan pemesanan melalui telepon, operator adalah milik kita facade
terhadap semua layanan dan departemen toko. Operator menyediakan antarmuka suara sederhana ke sistem pemesanan, gateway pembayaran, dan berbagai layanan pengiriman.
Memikirkan tentang Fasad sebagai adaptor sederhana untuk beberapa subsistem yang kompleks. Facade
mengisolasi kompleksitas dalam satu kelas dan memungkinkan kode aplikasi lain menggunakan antarmuka sederhana.
Dalam contoh ini, Facade
menyembunyikan kompleksitas API YouTube dan perpustakaan FFmpeg dari kode klien. Daripada bekerja dengan lusinan kelas, klien menggunakan metode sederhana di Fasad.
<?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
Operasi oftalmoplasti menggunakan penampil komersial Apple Vision Pro dilakukan di Poliklinik Catania…
Mengembangkan keterampilan motorik halus melalui mewarnai mempersiapkan anak untuk keterampilan yang lebih kompleks seperti menulis. Mewarnai…
Sektor angkatan laut adalah kekuatan ekonomi global sejati, yang telah menuju pasar 150 miliar...
Senin lalu, Financial Times mengumumkan kesepakatan dengan OpenAI. FT melisensikan jurnalisme kelas dunianya…