Članci

Što su uzorci dizajna: zašto ih koristiti, klasifikacija, prednosti i mane

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

Oni su kao predprojektidefinajnoviji, isprobani i testirani alati koje možete prilagoditi za rješavanje problema dizajna koji se ponavljaju u vašem kodu.

Procijenjeno vrijeme čitanja: 6 minuti

Što je uzorak dizajna

Uzorak dizajna nije kôd koji možemo kopirati i umetnuti u naš program, kao što možemo učiniti sa standardnim funkcijama ili bibliotekama. Uzorak 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 stvarnosti našeg programa.

Modeli se često brkaju s algoritmima, jer oba koncepta opisuju tipična rješenja nekih poznatih problema. Dok algoritam defiAko uvijek postoji jasan skup radnji kojima se može postići određeni cilj, model je opis rješenja na višoj razini. Kod iz istog modela primijenjen na dva različita programa može se razlikovati.

Želeći napraviti analogiju, možemo se sjetiti recepta za kuhanje: oba imaju jasne korake za postizanje cilja. No, model je više kao projekt čiji se rezultat može vidjeti i karakteristike, no točan redoslijed implementacije ovisi o nama koji pišemo kod.

Od čega se sastoji dizajn uzorak?

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

  • Namjera modela ukratko opisuje i problem i rješenje.
  • Motivacija dodatno objašnjava problem i rješenje koje model omogućuje.
  • Struktura klasa pokazuje svaki dio modela i kako su oni povezani.
  • Primjer koda u 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 provode neke sheme a da toga nisu svjesni. Ali zašto bismo onda trošili vrijeme na njihovo učenje?

  • Dizajn uzorci su komplet isprobana rješenja na uobičajene probleme u dizajnu softvera. Čak i ako se nikada ne susrećete s ovim problemima, poznavanje uzoraka i dalje je korisno jer vas uči kako riješiti sve vrste problema korištenjem principa objektno orijentiranog dizajna.
  • Modeli dizajna defiOni stvaraju zajednički jezik koji vi i vaš tim možete koristiti za učinkovitiju komunikaciju. Mogli biste reći: "Oh, samo upotrijebite Singleton za ovo", i svi će razumjeti ideju iza vašeg prijedloga. Nema potrebe objašnjavati što je singleton ako znate obrazac i njegovo ime.

Klasifikacija uzoraka dizajna

Uzorci dizajna razlikuju se po složenosti, razini detalja i opsegu primjenjivosti kroz projektirani sustav.

Analogno tome, raskrižje možemo učiniti sigurnijim postavljanjem nekoliko semafora ili izgradnjom čitavog višeetažnog čvorišta s podzemnim prolazima za pješake.

Često se nazivaju najosnovniji modeli niske razine idiomi . Obično se odnose samo na jedan programski jezik.

Najuniverzalniji i modeli na visokoj razini su arhitektonski uzori . Programeri mogu implementirati ove obrasce u gotovo bilo kojem jeziku. Za razliku od drugih uzoraka, oni se mogu koristiti za dizajn arhitekture cijele aplikacije.

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

Innovation newsletter
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate e-poštom.
  • Kreativni modeli oni pružaju mehanizme stvaranja 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 te strukture fleksibilnima i učinkovitima.
  • Modeli ponašanja bave se učinkovitom komunikacijom i raspodjelom odgovornosti između objekata.

Primjer uzorka dizajna u Laravelu: Fasada

Fasada strukturni je obrazac dizajna koji pruža pojednostavljeno sučelje biblioteci, okviru ili bilo kojem drugom složenom skupu klasa.

Problem

Pretpostavimo da trebamo pokrenuti softver na temelju velikog skupa objekata koji pripadaju sofisticiranoj biblioteci ili okviru. Obično bismo morali inicijalizirati sve te objekte, pratiti ovisnosti, izvršavati metode ispravnim redoslijedom i tako dalje.

Kao rezultat toga, poslovna logika klasa postala bi usko povezana s pojedinostima implementacije klasa trećih strana, čineći ih teškima za razumijevanje i upravljanje.

Riješenje

Una facade je klasa koja pruža jednostavno sučelje složenom podsustavu koji sadrži mnogo pokretnih dijelova. A facade može pružiti ograničenu funkcionalnost u usporedbi s izravnim radom s podsustavom. Međutim, uključuje samo značajke do kojih je korisnicima stvarno stalo.

Uzmi jedan facade korisno je kada trebamo integrirati aplikaciju sa sofisticiranom bibliotekom koja ima desetke značajki, ali trebamo samo mali dio njezine funkcionalnosti.

Na primjer, aplikacija koja prenosi kratke smiješne videozapise s mačkama na društvene medije potencijalno bi mogla koristiti profesionalnu biblioteku za konverziju videozapisa. Međutim, sve što stvarno trebamo je klasa s jednom metodom encode(filename, format). Nakon što stvorimo takvu klasu i povežemo je s bibliotekom za video konverziju, imat ćemo svoju prvu facade.

Na primjer, telefonski operater pozivnog centra je kao facade. Zapravo, kada nazovemo telefonsku službu trgovine da naručimo telefonom, operater je naš facade prema svim službama i odjelima trgovine. Operater nudi jednostavno glasovno sučelje sustavu naručivanja, pristupnicima plaćanja i raznim uslugama dostave.

Pravi primjer u PHP-u

Misli o Fasada kao jednostavan adapter za neke složene podsustave. Facade izolira složenost unutar jedne klase i omogućuje drugom aplikacijskom kodu korištenje jednostavnog sučelja.

U ovom primjeru, Facade skriva složenost YouTube API-ja i FFmpeg biblioteke od koda klijenta. Umjesto rada s desecima klasa, klijent koristi jednostavnu metodu na Facadeu.

<?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

Innovation newsletter
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate e-poštom.

Nedavni članci

Veeam nudi najopsežniju podršku za ransomware, od zaštite do odgovora i oporavka

Coveware by Veeam nastavit će pružati usluge odgovora na incidente cyber iznude. Coveware će ponuditi forenziku i mogućnosti sanacije...

Travnja 23 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.…

Travnja 22 2024

Britansko antimonopolsko tijelo podiglo je BigTech alarm zbog GenAI-ja

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

Travnja 18 2024

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

Uredba o "zelenim kućama", koju je formulirala Europska unija za povećanje energetske učinkovitosti zgrada, završila je svoj zakonodavni proces s...

Travnja 18 2024