Straipsniai

Kas yra dizaino modeliai: kodėl juos naudoti, klasifikacija, privalumai ir trūkumai

Programinės įrangos inžinerijoje projektavimo modeliai yra optimalūs problemų, kurios dažniausiai kyla kuriant programinę įrangą, sprendimai.

Jie yra tarsi išankstiniai projektaidefinite, išbandyti ir išbandyti įrankiai, kuriuos galite pritaikyti, kad išspręstumėte pasikartojančią dizaino problemą savo kode.

Numatomas skaitymo laikas: 6 minuti

Kas yra dizaino modelis

Dizaino modelis nėra kodas, kurį galime nukopijuoti ir įterpti į savo programą, kaip tai galime padaryti naudodami standartines funkcijas ar bibliotekas. Dizaino modelis yra bendra koncepcija, galinti išspręsti konkrečią problemą. Iš esmės modelis, kurio detalėmis galime vadovautis ir įgyvendinti sprendimą, atitinkantį mūsų programos realybę.

Modeliai dažnai painiojami su algoritmais, nes abi sąvokos apibūdina tipinius kai kurių žinomų problemų sprendimus. Nors algoritmas defiJei visada yra aiškus veiksmų rinkinys, kuriuo galima pasiekti tam tikrą tikslą, modelis yra aukštesnio lygio sprendimo aprašymas. To paties modelio kodas, pritaikytas dviem skirtingoms programoms, gali skirtis.

Norėdami padaryti analogiją, galime galvoti apie gaminimo receptą: abu turi aiškius žingsnius tikslui pasiekti. Tačiau modelis labiau panašus į projektą, kurio rezultatas ir jo charakteristikos matosi, bet tiksli įgyvendinimo tvarka priklauso nuo mūsų, kas rašo kodą.

Iš ko sudarytas dizaino raštas?

Dauguma modelių yra aprašyti labai formaliai, kad žmonės galėtų juos atkurti įvairiuose kontekstuose. Žemiau pažiūrėkime, kokie elementai yra modelio aprašyme:

  • Ketinimas Modelyje trumpai aprašoma ir problema, ir sprendimas.
  • Motyvacija toliau paaiškinama problema ir sprendimas, kurį modelis leidžia.
  • Struktūra klasių rodo kiekvieną modelio dalį ir kaip jos yra susijusios.
  • Kodo pavyzdys vienoje iš populiariausių programavimo kalbų leidžia lengviau suprasti modelio idėją.

Kodėl juos naudoti?

Programuotojas gali kurti programinę įrangą nežinodamas apie dizaino modelių egzistavimą. Daugelis tai daro ir dėl šios priežasties kai kurias schemas įgyvendina to nežinodami. Bet kodėl tuomet turėtume skirti laiko jų mokymuisi?

  • Dizaino modeliai yra rinkinys išbandytus sprendimus į įprastas programinės įrangos projektavimo problemas. Net jei niekada nesusiduriate su šiomis problemomis, modelių žinojimas vis tiek yra naudingas, nes jis moko, kaip išspręsti įvairias problemas naudojant objektinio projektavimo principus.
  • Dizaino modeliai defiJie sukuria bendrą kalbą, kurią jūs ir jūsų komanda galite naudoti norėdami efektyviau bendrauti. Galite pasakyti: „O, tiesiog naudokite „Singleton“, kad tai padarytumėte“, ir visi supras jūsų pasiūlymo idėją. Nereikia aiškinti, kas yra viengubas, jei žinote modelį ir jo pavadinimą.

Dizaino modelių klasifikacija

Dizaino modeliai skiriasi sudėtingumu, detalumo lygiu ir pritaikymo mastu visoje suprojektuotoje sistemoje.

Analogiškai sankryžą galime padaryti saugesnę įrengę kelis šviesoforus arba nutiesę visą kelių lygių sankryžą su požeminėmis perėjomis pėstiesiems.

Dažnai vadinami patys pagrindiniai žemo lygio modeliai idiomos . Paprastai jie taikomi tik vienai programavimo kalbai.

Universaliausi ir aukščiausio lygio modeliai yra architektūriniai modeliai . Kūrėjai gali įgyvendinti šiuos modelius praktiškai bet kuria kalba. Skirtingai nuo kitų modelių, juos galima naudoti kuriant visos programos architektūrą.

Be to, visi modeliai gali būti klasifikuojami pagal jų tipą bandė arba tikslas. Trys pagrindinės klasės yra:

Inovacijų naujienlaiškis
Nepraleiskite svarbiausių naujienų apie naujoves. Prisiregistruokite, kad gautumėte juos el.
  • Kūrybiniai modeliai jie suteikia objektų kūrimo mechanizmus, kurie padidina esamo kodo lankstumą ir pakartotinį naudojimą.
  • Struktūriniai modeliai jie paaiškina, kaip surinkti objektus ir klases į didesnes struktūras, išlaikant šias struktūras lanksčias ir efektyvias.
  • Elgesio modeliai jie susiję su efektyviu bendravimu ir atsakomybės tarp objektų paskirstymu.

Laravel dizaino modelio pavyzdys: fasadas

Fasadas yra struktūrinio dizaino modelis, suteikiantis supaprastintą sąsają su biblioteka, sistema ar bet kokiu kitu sudėtingu klasių rinkiniu.

Problema

Tarkime, kad reikia, kad programinė įranga veiktų remiantis dideliu objektų rinkiniu, priklausančiu sudėtingai bibliotekai ar sistemai. Paprastai turėtume inicijuoti visus šiuos objektus, sekti priklausomybes, vykdyti metodus teisinga tvarka ir pan.

Dėl to klasių verslo logika būtų glaudžiai susieta su trečiųjų šalių klasių diegimo detalėmis, todėl jas būtų sunku suprasti ir valdyti.

Sprendimas

A facade yra klasė, kuri suteikia paprastą sąsają sudėtingam posistemiui, kuriame yra daug judančių dalių. A facade gali teikti ribotas funkcijas, palyginti su tiesioginiu darbu su posistemiu. Tačiau tai apima tik tas funkcijas, kurios klientams tikrai rūpi.

Turiu viena facade tai naudinga, kai reikia integruoti programėlę su sudėtinga biblioteka, kurioje yra dešimtys funkcijų, tačiau mums reikia tik nedidelės jos funkcionalumo dalies.

Pavyzdžiui, programa, kuri į socialinę žiniasklaidą įkelia trumpus juokingus vaizdo įrašus su katėmis, gali naudoti profesionalią vaizdo įrašų konvertavimo biblioteką. Tačiau viskas, ko mums tikrai reikia, yra klasė su vienu metodu encode(filename, format). Sukūrę tokią klasę ir prijungę ją prie vaizdo konvertavimo bibliotekos turėsime savo pirmąją facade.

Pavyzdžiui, skambučių centro telefono operatorius yra kaip a facade. Tiesą sakant, kai skambiname į parduotuvės telefono tarnybą, kad pateiktume užsakymą telefonu, operatorius yra mūsų facade visų parduotuvės paslaugų ir skyrių atžvilgiu. Operatorius suteikia paprastą balso sąsają su užsakymų sistema, mokėjimo šliuzai ir įvairiomis pristatymo paslaugomis.

Tikras pavyzdys PHP

Pagalvok apie Fasadas kaip paprastas adapteris kai kurioms sudėtingoms posistemėms. Facade išskiria sudėtingumą vienoje klasėje ir leidžia kitam programos kodui naudoti paprastą sąsają.

Šiame pavyzdyje Facade slepia „YouTube“ API ir FFmpeg bibliotekos sudėtingumą nuo kliento kodo. Užuot dirbęs su dešimtimis klasių, klientas naudoja paprastą metodą Fasade.

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

Inovacijų naujienlaiškis
Nepraleiskite svarbiausių naujienų apie naujoves. Prisiregistruokite, kad gautumėte juos el.

Naujausi straipsniai

Veeam siūlo išsamiausią išpirkos reikalaujančių programų palaikymą – nuo ​​apsaugos iki atsako ir atkūrimo

„Coveware by Veeam“ ir toliau teiks reagavimo į kibernetinio turto prievartavimo incidentus paslaugas. „Coveware“ pasiūlys teismo ekspertizės ir ištaisymo galimybes…

23 balandis 2024

Žalioji ir skaitmeninė revoliucija: kaip numatoma priežiūra keičia naftos ir dujų pramonę

Nuspėjama priežiūra keičia naftos ir dujų sektorių, taikant naujovišką ir iniciatyvų požiūrį į gamyklų valdymą.…

22 balandis 2024

JK antimonopolinis reguliatorius kelia „BigTech“ aliarmą dėl „GenAI“.

JK CMA paskelbė įspėjimą dėl Big Tech elgesio dirbtinio intelekto rinkoje. Ten…

18 balandis 2024

Casa Green: energetikos revoliucija tvariai ateičiai Italijoje

„Žaliųjų namų“ dekretas, kurį Europos Sąjunga suformulavo siekiant padidinti pastatų energijos vartojimo efektyvumą, baigė teisėkūros procesą su…

18 balandis 2024