Artikel

Apa pola desain: kenapa digunakake, klasifikasi, pro lan kontra

Ing rekayasa piranti lunak, pola desain minangka solusi optimal kanggo masalah sing umume kedadeyan ing desain piranti lunak.

Padha kaya pra proyekdefinite, alat nyoba lan dites sing bisa ngatur kanggo ngatasi masalah desain ambalan ing kode.

Perkiraan wektu maca: 6 menit

Apa Pola Desain

Pola desain dudu kode sing bisa disalin lan dilebokake ing program, kaya sing bisa ditindakake kanthi fungsi utawa perpustakaan standar. Pola desain minangka konsep umum sing bisa ngrampungake masalah tartamtu. Sejatine model sing rincian bisa kita tindakake lan ngleksanakake solusi sing cocog karo kasunyatan program kita.

Model asring bingung karo algoritma, amarga loro konsep kasebut nggambarake solusi khas kanggo sawetara masalah sing dikenal. Nalika algoritma defiYen tansah ana tumindak sing jelas sing bisa nggayuh tujuan tartamtu, model minangka gambaran sing luwih dhuwur babagan solusi. Kode saka model sing padha ditrapake kanggo rong program beda bisa uga beda.

Kepengin nggawe analogi, kita bisa mikir babagan resep masak: loro-lorone duwe langkah sing jelas kanggo nggayuh tujuan. Nanging, model luwih kaya proyek, sing sampeyan bisa ndeleng apa asil lan karakteristike, nanging urutan implementasine gumantung marang kita sing nulis kode kasebut.

Apa Pola Desain digawe saka?

Umume pola diterangake kanthi resmi supaya wong bisa ngasilake ing pirang-pirang konteks. Ayo ndeleng ing ngisor iki unsur-unsur sing ana ing deskripsi model:

  • Niat saka model ringkes njlèntrèhaké loro masalah lan solusi.
  • Motivasi luwih nerangake masalah lan solusi sing model ndadekake bisa.
  • Struktur saka kelas nuduhake saben bagean saka model lan carane padha related.
  • Tuladha kode ing salah sawijining basa pamrograman sing paling populer nggampangake ngerti ide ing mburi model kasebut.

Apa gunane?

Programmer bisa ngembangake piranti lunak tanpa ngerti anane pola desain. Akeh sing nindakake, lan mulane dheweke nindakake sawetara rencana tanpa ngerti. Nanging kenapa kita kudu nglampahi wektu sinau?

  • Pola desain minangka kit solusi sing dicoba lan dites kanggo masalah umum ing desain piranti lunak. Sanajan sampeyan ora nate nemoni masalah kasebut, ngerti pola isih migunani amarga mulang sampeyan carane ngatasi kabeh jinis masalah nggunakake prinsip desain berorientasi obyek.
  • Model desain defiDheweke nggawe basa umum sing sampeyan lan tim bisa digunakake kanggo komunikasi kanthi luwih efektif. Sampeyan bisa ngomong, "Oh, mung nggunakake Singleton kanggo nindakake iki,"Lan kabeh wong bakal ngerti idea konco saran. Ora perlu nerangake apa singleton yen sampeyan ngerti pola lan jenenge.

Klasifikasi Pola Desain

Pola desain beda-beda ing kerumitan, tingkat detail, lan skala aplikasi ing saindhenging sistem sing dirancang.

Kanthi analogi, kita bisa nggawe prapatan luwih aman kanthi nginstal sawetara lampu lalu lintas utawa mbangun kabeh persimpangan multilevel kanthi dalan lemah kanggo para pejalan kaki.

Model paling dhasar, tingkat rendah asring diarani idiom . Biasane mung ditrapake kanggo basa pamrograman siji.

Model sing paling universal lan dhuwur yaiku model arsitektur . Pangembang bisa ngetrapake pola kasebut ing meh kabeh basa. Ora kaya pola liyane, bisa digunakake kanggo ngrancang arsitektur kabeh aplikasi.

Salajengipun, kabeh model bisa diklasifikasikaké miturut sing dicoba utawa tujuan. Telung kelas utama yaiku:

newsletter inovasi
Aja kantun warta paling penting babagan inovasi. Mlebu kanggo nampa wong-wong mau liwat email.
  • Model kreasi padha nyedhiyani mekanisme nggawe obyek sing nambah keluwesan lan nggunakake maneh kode ana.
  • Model struktural padha nerangake carane ngumpul obyek lan kelas menyang struktur luwih gedhe, tetep struktur iki fleksibel lan efisien.
  • Model prilaku padha menehi hasil karo komunikasi efektif lan assignment saka tanggung jawab antarane obyek.

Tuladha Pola Desain ing Laravel: Fasad

Adul minangka pola desain struktural sing nyedhiyakake antarmuka sing disederhanakake menyang perpustakaan, kerangka, utawa kelas kompleks liyane.

Masalah

Ayo nganggep kita kudu nggawe piranti lunak, adhedhasar sakumpulan obyek gedhe sing kalebu perpustakaan utawa kerangka kerja sing canggih. Biasane, kita kudu miwiti kabeh obyek kasebut, nglacak dependensi, nglakokake metode kanthi urutan sing bener, lan liya-liyane.

Akibaté, logika bisnis saka kelas bakal dadi tightly digandhengake karo rincian implementasine saka kelas pihak katelu, nggawe angel kanggo ngerti lan ngatur.

Solusi

Una facade iku kelas sing nyedhiyani antarmuka prasaja kanggo subsistem Komplek sing ngemot akeh bagean obah. A facade bisa nyedhiyakake fungsi sing winates dibandhingake karo kerja langsung karo subsistem. Nanging, iku mung kalebu fitur sing pelanggan tenan peduli.

Duwe siji facade iku migunani nalika kita kudu nggabungake app karo perpustakaan canggih sing wis Welasan fitur, nanging kita mung perlu bagean cilik saka sawijining fungsi.

Contone, aplikasi sing ngunggah video lucu sing cendhak karo kucing menyang media sosial bisa uga nggunakake perpustakaan konversi video profesional. Nanging, kabeh sing kita butuhake yaiku kelas kanthi metode tunggal encode(filename, format). Sawise nggawe kelas kasebut lan nyambungake menyang perpustakaan konversi video, kita bakal duwe sing pertama facade.

Contone, operator telpon call center kaya a facade. Nyatane, nalika kita nelpon layanan telpon toko kanggo nggawe pesenan telpon, operator iku kita facade menyang kabeh layanan lan departemen toko. Operator nyedhiyakake antarmuka swara sing prasaja kanggo sistem pesenan, gateway pembayaran lan macem-macem layanan pangiriman.

Conto nyata ing PHP

Mikir babagan Adul minangka adaptor prasaja kanggo sawetara subsistem Komplek. Facade ngisolasi kerumitan ing kelas siji lan ngidini kode aplikasi liyane nggunakake antarmuka prasaja.

Ing conto iki, Facade ndhelikake kerumitan API YouTube lan perpustakaan FFmpeg saka kode klien. Tinimbang nggarap puluhan kelas, klien nggunakake cara sing gampang ing 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

newsletter inovasi
Aja kantun warta paling penting babagan inovasi. Mlebu kanggo nampa wong-wong mau liwat email.

Artikel anyar

Veeam nduweni dhukungan paling lengkap kanggo ransomware, saka proteksi nganti respon lan pemulihan

Coveware dening Veeam bakal terus nyedhiyakake layanan respon insiden pemerasan cyber. Coveware bakal nawakake kemampuan forensik lan remediasi…

23 April 2024

Revolusi Ijo lan Digital: Kepiye Pangopènan Prediktif Ngowahi Industri Minyak & Gas

Pangopènan prediktif ngrevolusi sektor minyak & gas, kanthi pendekatan inovatif lan proaktif kanggo manajemen pabrik.…

22 April 2024

Regulator antitrust Inggris mundhakaken weker BigTech liwat GenAI

CMA UK wis ngetokake bebaya babagan prilaku Big Tech ing pasar intelijen buatan. Ana…

18 April 2024

Casa Green: revolusi energi kanggo masa depan sing lestari ing Italia

Keputusan "Case Green", sing dirumusake dening Uni Eropa kanggo ningkatake efisiensi energi bangunan, wis rampung proses legislatif kanthi…

18 April 2024