Članci

Šta su obrasci dizajna: zašto ih koristiti, klasifikacija, prednosti i nedostaci

U softverskom inženjerstvu, obrasci dizajna su optimalna rješenja za probleme koji se obično javljaju u dizajnu softvera.

Oni su kao pred projektidefibezbroj, isprobanih i testiranih alata koje možete prilagoditi da biste riješili ponavljajući problem dizajna u vašem kodu.

Predviđeno vrijeme čitanja: 6 minute

Šta je uzorak dizajna

Obrazac dizajna nije kod koji možemo kopirati i umetnuti u naš program, kao što to možemo učiniti sa standardnim funkcijama ili bibliotekama. Obrazac dizajna je opći koncept koji može riješiti određeni problem. U osnovi model čije detalje možemo pratiti i implementirati rješenje koje odgovara realnosti našeg programa.

Modeli se često brkaju sa algoritmima, jer oba koncepta opisuju tipična rješenja nekih poznatih problema. Dok je algoritam defiAko uvijek postoji jasan skup akcija koje mogu postići određeni cilj, model je opis rješenja višeg nivoa. Kod iz istog modela primijenjen na dva različita programa može biti različit.

Želeći da napravimo analogiju, možemo smisliti recept za kuhanje: oba imaju jasne korake za postizanje cilja. Međutim, model je više kao projekat čiji se rezultat može vidjeti i njegove karakteristike, ali tačan redoslijed implementacije ovisi o nama koji pišemo kod.

Od čega se pravi uzorak dizajna?

Većina obrazaca opisana je vrlo formalno tako da ih ljudi mogu reproducirati u mnogim kontekstima. Pogledajmo u nastavku elemente koji su prisutni u opisu modela:

  • Namjera modela ukratko opisuje i problem i rješenje.
  • Motivacija dalje objašnjava problem i rješenje koje model omogućava.
  • Struktura klasa pokazuje svaki dio modela i kako su povezani.
  • Primjer koda na jednom od najpopularnijih programskih jezika olakšava razumijevanje ideje iza modela.

Zašto ih koristiti?

Programer može razviti softver bez znanja o postojanju obrazaca dizajna. Mnogi to rade i iz tog razloga implementiraju neke šeme, a da to ne znaju. Ali zašto bismo onda trošili vrijeme na njihovo učenje?

  • Dizajnerski uzorci su komplet isprobana i testirana rješenja na uobičajene probleme u dizajnu softvera. Čak i ako nikada ne naiđete na ove probleme, poznavanje obrazaca je i dalje korisno jer vas uči kako riješiti sve vrste problema koristeći principe objektno orijentiranog dizajna.
  • Dizajnerski modeli defiOni stvaraju zajednički jezik koji vi i vaš tim možete koristiti za efikasniju komunikaciju. Mogli biste reći: „Oh, samo upotrijebite Singleton da to učinite“, i svi će razumjeti ideju koja stoji iza vašeg prijedloga. Nema potrebe objašnjavati šta je singleton ako znate obrazac i njegovo ime.

Klasifikacija obrazaca dizajna

Dizajnerski obrasci se razlikuju po složenosti, nivou detalja i skali primenljivosti kroz projektovani sistem.

Po analogiji, raskrsnicu možemo učiniti sigurnijom postavljanjem nekoliko semafora ili izgradnjom cijele petlje na više nivoa sa podzemnim prolazima za pješake.

Često se nazivaju najosnovniji modeli niskog nivoa idiomi . Obično se primjenjuju samo na jedan programski jezik.

Najuniverzalniji i vrhunski modeli su arhitektonski modeli . Programeri mogu implementirati ove obrasce na gotovo bilo koji jezik. Za razliku od drugih obrazaca, oni se mogu koristiti za dizajniranje arhitekture cijele aplikacije.

Nadalje, svi modeli se mogu klasificirati prema njihovoj pokušao ili svrha. Tri glavne klase su:

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.
  • Kreativni modeli oni pružaju mehanizme za kreiranje objekata koji povećavaju fleksibilnost i ponovnu upotrebu postojećeg koda.
  • Strukturni modeli oni objašnjavaju kako sastaviti objekte i klase u veće strukture, održavajući ove strukture fleksibilnim i efikasnim.
  • Modeli ponašanja bave se efikasnom komunikacijom i dodjelom odgovornosti između objekata.

Primjer uzorka dizajna u Laravelu: Fasada

Fasada je strukturalni obrazac dizajna koji pruža pojednostavljeno sučelje za biblioteku, okvir ili bilo koji drugi složeni skup klasa.

Problem

Pretpostavimo da je potrebno da softver funkcioniše na osnovu velikog skupa objekata koji pripadaju sofisticiranoj biblioteci ili okviru. Obično bismo morali inicijalizirati sve ove objekte, pratiti ovisnosti, izvršiti metode ispravnim redoslijedom, itd.

Kao rezultat toga, poslovna logika klasa bi postala usko povezana sa detaljima implementacije klasa trećih strana, što bi ih činilo teškim za razumevanje i upravljanje.

Rješenje

Una facade je klasa koja pruža jednostavan interfejs za složeni podsistem koji sadrži mnogo pokretnih delova. A facade može pružiti ograničenu funkcionalnost u poređenju sa direktnim radom sa podsistemom. Međutim, uključuje samo one karakteristike do kojih je kupcima zaista stalo.

Uzmi jedan facade korisno je kada trebamo integrirati aplikaciju sa sofisticiranom bibliotekom koja ima desetke funkcija, ali nam je potreban samo mali dio njene funkcionalnosti.

Na primjer, aplikacija koja postavlja kratke smiješne videozapise s mačkama na društvene mreže potencijalno bi mogla koristiti profesionalnu biblioteku za konverziju videa. Međutim, sve što nam zaista treba je klasa sa jednom metodom encode(filename, format). Nakon kreiranja takve klase i povezivanja sa bibliotekom video konverzije, imat ćemo prvu facade.

Na primjer, telefonski operater pozivnog centra je kao a facade. U stvari, kada pozovemo telefonsku službu prodavnice da naručimo telefonom, naš je operater facade prema svim službama i odjelima trgovine. Operater pruža jednostavan glasovni interfejs za sistem naručivanja, platne prolaze i razne usluge dostave.

Pravi primjer u PHP-u

Misliti o Fasada kao jednostavan adapter za neke složene podsisteme. Facade izoluje složenost unutar jedne klase i dozvoljava drugom kodu aplikacije da koristi jednostavno sučelje.

U ovom primjeru, Facade skriva složenost YouTube API-ja i FFmpeg biblioteke od klijentskog koda. Umjesto rada sa desetinama klasa, klijent koristi jednostavnu metodu na 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

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.

Nedavni članak

Veeam nudi najsveobuhvatniju podršku za ransomware, od zaštite do odgovora i oporavka

Coveware od strane Veeam-a će nastaviti da pruža usluge odgovora na incidente u slučaju sajber iznude. Coveware će ponuditi mogućnosti forenzike i sanacije…

23 april 2024

Zelena i digitalna revolucija: Kako prediktivno održavanje transformira industriju nafte i plina

Prediktivno održavanje revolucionira sektor nafte i plina, s inovativnim i proaktivnim pristupom upravljanju postrojenjima.…

22 april 2024

Britanski antimonopolski regulator podigao je BigTech uzbunu zbog GenAI

UK CMA izdao je upozorenje o ponašanju Big Tech-a na tržištu umjetne inteligencije. Tamo…

18 april 2024

Casa Green: energetska revolucija za održivu budućnost u Italiji

Uredba o „zelenim kućama“, koju je formulisala Evropska unija za poboljšanje energetske efikasnosti zgrada, završila je svoj zakonodavni proces sa…

18 april 2024