Članki

Kaj so oblikovalski vzorci: zakaj jih uporabljati, razvrstitev, prednosti in slabosti

V programskem inženiringu so načrtovalski vzorci optimalne rešitve za težave, ki se pogosto pojavljajo pri načrtovanju programske opreme.

So kot predprojektidefikončna, preizkušena orodja, ki jih lahko prilagodite za reševanje ponavljajočih se problemov oblikovanja v vaši kodi.

Predvideni čas branja: 6 min

Kaj je oblikovalski vzorec

Oblikovalski vzorec ni koda, ki bi jo lahko kopirali in vstavili v naš program, kot lahko storimo s standardnimi funkcijami ali knjižnicami. Oblikovalski vzorec je splošen koncept, ki lahko reši določen problem. V bistvu model, katerega podrobnostim lahko sledimo in implementiramo rešitev, ki ustreza realnosti našega programa.

Modele pogosto zamenjujemo z algoritmi, ker oba koncepta opisujeta tipične rešitve nekaterih znanih problemov. Medtem ko je algoritem defiČe vedno obstaja jasen niz dejanj, s katerimi je mogoče doseči določen cilj, je model opis rešitve na višji ravni. Koda iz istega modela, uporabljena za dva različna programa, se lahko razlikuje.

Če želimo narediti analogijo, se lahko spomnimo kuharskega recepta: oba imata jasne korake za dosego cilja. Je pa model bolj kot projekt, katerega rezultat lahko vidite in kakšne so njegove značilnosti, točen vrstni red implementacije pa je odvisen od nas, ki pišemo kodo.

Iz česa je oblikovan vzorec?

Večina vzorcev je opisanih zelo formalno, tako da jih lahko ljudje reproducirajo v številnih kontekstih. Spodaj si poglejmo elemente, ki so prisotni v opisu modela:

  • Namen modela na kratko opiše problem in rešitev.
  • Motivacija dodatno razloži problem in rešitev, ki jo model omogoča.
  • Struktura razredov prikazuje vsak del modela in kako sta povezana.
  • Primer kode v enem izmed najbolj priljubljenih programskih jezikov olajša razumevanje ideje modela.

Zakaj jih uporabljati?

Programer lahko razvije programsko opremo, ne da bi vedel za obstoj oblikovalskih vzorcev. Mnogi to počnejo in zato izvajajo nekatere sheme, ne da bi se tega zavedali. Toda zakaj bi potem porabili čas za njihovo učenje?

  • Oblikovalski vzorci so komplet preizkušene rešitve do pogostih težav pri načrtovanju programske opreme. Tudi če se nikoli ne srečate s temi težavami, je poznavanje vzorcev še vedno koristno, saj vas nauči, kako rešiti vse vrste težav z uporabo načel objektno usmerjenega oblikovanja.
  • Oblikovalski modeli defiUstvarijo skupni jezik, ki ga lahko vi in ​​vaša ekipa uporabite za učinkovitejšo komunikacijo. Lahko bi rekli: "Oh, samo uporabite Singleton za to," in vsi bodo razumeli idejo za vašim predlogom. Ni vam treba razlagati, kaj je singleton, če poznate vzorec in njegovo ime.

Razvrstitev oblikovalskih vzorcev

Oblikovalski vzorci se razlikujejo po kompleksnosti, stopnji podrobnosti in obsegu uporabnosti v celotnem oblikovanem sistemu.

Po analogiji lahko naredimo križišče varnejše tako, da postavimo nekaj semaforjev ali zgradimo celotno večnivojsko križišče s podzemnimi prehodi za pešce.

Pogosto se imenujejo najosnovnejši modeli nizke ravni idiomi . Običajno veljajo samo za en sam programski jezik.

Najbolj univerzalni in visokokakovostni modeli so arhitekturni modeli . Razvijalci lahko implementirajo te vzorce v skoraj katerem koli jeziku. Za razliko od drugih vzorcev jih je mogoče uporabiti za oblikovanje arhitekture celotne aplikacije.

Poleg tega lahko vse modele razvrstimo glede na njihovo poskusili ali namen. Trije glavni razredi so:

Glasilo o inovacijah
Ne zamudite najpomembnejših novic o inovacijah. Prijavite se, če jih želite prejemati po e-pošti.
  • Kreativni modeli zagotavljajo mehanizme za ustvarjanje objektov, ki povečujejo prilagodljivost in ponovno uporabo obstoječe kode.
  • Strukturni modeli pojasnjujejo, kako sestaviti predmete in razrede v večje strukture, pri čemer te strukture ostanejo prožne in učinkovite.
  • Vedenjski modeli ukvarjajo se z učinkovito komunikacijo in razporejanjem odgovornosti med objekti.

Primer oblikovalskega vzorca v Laravelu: fasada

Fasada je strukturni oblikovalski vzorec, ki zagotavlja poenostavljen vmesnik za knjižnico, ogrodje ali kateri koli drug zapleten nabor razredov.

Problem

Predpostavimo, da moramo omogočiti delovanje programske opreme na podlagi velikega nabora objektov, ki pripadajo sofisticirani knjižnici ali ogrodju. Običajno bi morali inicializirati vse te objekte, slediti odvisnostim, izvajati metode v pravilnem vrstnem redu in tako naprej.

Posledično bi poslovna logika razredov postala tesno povezana z izvedbenimi podrobnostmi razredov tretjih oseb, zaradi česar bi jih bilo težko razumeti in upravljati.

Rešitev

A facade je razred, ki zagotavlja preprost vmesnik za kompleksen podsistem, ki vsebuje veliko gibljivih delov. A facade lahko zagotovi omejeno funkcionalnost v primerjavi z neposrednim delom s podsistemom. Vendar pa vključuje samo funkcije, ki so stranke resnično pomembne.

Imej ga facade uporaben je, ko moramo aplikacijo integrirati s sofisticirano knjižnico, ki ima na desetine funkcij, vendar potrebujemo le majhen del njene funkcionalnosti.

Na primer, aplikacija, ki naloži kratke smešne videoposnetke z mačkami v družabne medije, bi lahko potencialno uporabila profesionalno knjižnico za pretvorbo videa. Vse, kar resnično potrebujemo, pa je razred z enojno metodo encode(filename, format). Ko ustvarimo tak razred in ga povežemo s knjižnico za pretvorbo videa, bomo imeli svojega prvega facade.

Na primer, telefonist v klicnem centru je kot a facade. Pravzaprav, ko pokličemo telefonsko službo trgovine, da oddamo telefonsko naročilo, je operater naš facade do vseh storitev in oddelkov trgovine. Operater omogoča preprost glasovni vmesnik za sistem naročanja, plačilne prehode in različne dostavne službe.

Pravi primer v PHP

Razmisliti Fasada kot preprost adapter za nekatere kompleksne podsisteme. Facade izolira kompleksnost znotraj posameznega razreda in omogoča drugi aplikacijski kodi uporabo preprostega vmesnika.

V tem primeru Facade skrije zapletenost YouTube API-ja in knjižnice FFmpeg pred kodo odjemalca. Namesto dela z desetinami razredov stranka uporablja preprosto metodo 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

Glasilo o inovacijah
Ne zamudite najpomembnejših novic o inovacijah. Prijavite se, če jih želite prejemati po e-pošti.

Nedavni članki

Veeam ponuja najobsežnejšo podporo za izsiljevalsko programsko opremo, od zaščite do odziva in obnovitve

Coveware by Veeam bo še naprej zagotavljal storitve odzivanja na incidente kibernetskega izsiljevanja. Coveware bo nudil forenziko in zmogljivosti sanacije ...

April 23 2024

Zelena in digitalna revolucija: kako predvideno vzdrževanje preoblikuje naftno in plinsko industrijo

Prediktivno vzdrževanje revolucionira sektor nafte in plina z inovativnim in proaktivnim pristopom k upravljanju obratov.…

April 22 2024

Britanski protimonopolni regulator sproži alarm BigTech zaradi GenAI

Britanski CMA je izdal opozorilo glede obnašanja Big Tech na trgu umetne inteligence. tam …

April 18 2024

Casa Green: energetska revolucija za trajnostno prihodnost v Italiji

Odlok "Case Green", ki ga je oblikovala Evropska unija za povečanje energetske učinkovitosti stavb, je zaključil svoj zakonodajni postopek z ...

April 18 2024