Artiklid

Mis on disainimustrid: miks neid kasutada, klassifikatsioon, plussid ja miinused

Tarkvaratehnikas on disainimustrid optimaalsed lahendused probleemidele, mis tarkvara kujundamisel tavaliselt esinevad.

Need on nagu eelprojektiddefinite, proovitud ja testitud tööriistad, mida saate kohandada, et lahendada oma koodis korduvaid kujundusprobleeme.

Eeldatav lugemisaeg: 6 minutit

Mis on kujundusmuster

Kujundusmuster ei ole kood, mida saame kopeerida ja oma programmi sisestada, nagu me saame teha standardsete funktsioonide või teekide puhul. Kujundusmuster on üldine kontseptsioon, mis suudab lahendada konkreetse probleemi. Põhimõtteliselt mudel, mille üksikasju saame jälgida ja rakendada lahendust, mis sobib meie programmi tegelikkusega.

Mudeleid aetakse sageli segi algoritmidega, sest mõlemad mõisted kirjeldavad tüüpilisi lahendusi mõnele teadaolevale probleemile. Kuigi algoritm defiKui alati on olemas selge tegevuste kogum, millega saab teatud eesmärgi saavutada, on mudel lahenduse kõrgema taseme kirjeldus. Kahe erineva programmiga sama mudeli kood võib olla erinev.

Soovides teha analoogiat, võime mõelda toiduvalmistamise retseptile: mõlemal on eesmärgi saavutamiseks selged sammud. Mudel on aga pigem projekt, mille tulemus ja omadused on näha, aga täpne realiseerimise järjekord sõltub meist, kes koodi kirjutame.

Millest disainimuster koosneb?

Enamikku mustreid kirjeldatakse väga formaalselt, et inimesed saaksid neid paljudes kontekstides reprodutseerida. Vaatame allpool elemente, mis mudeli kirjelduses on:

  • Kavatsus Mudel kirjeldab lühidalt nii probleemi kui ka lahendust.
  • Motivatsioon selgitab täpsemalt probleemi ja lahendust, mille mudel võimaldab.
  • Struktuur klassidest kuvatakse mudeli iga osa ja kuidas need on omavahel seotud.
  • Koodi näide ühes populaarseimas programmeerimiskeeles muudab mudeli idee mõistmise lihtsamaks.

Miks neid kasutada?

Programmeerija saab tarkvara arendada, teadmata disainimustrite olemasolust. Paljud teevad seda ja seetõttu rakendavad nad mõningaid skeeme teadmata. Aga miks peaksime siis kulutama aega nende õppimisele?

  • Disainimustrid on komplekt proovitud lahendused tarkvaradisaini levinumad probleemid. Isegi kui te neid probleeme kunagi ei puutu, on mustrite tundmine siiski kasulik, sest see õpetab teile, kuidas objektorienteeritud disaini põhimõtteid kasutades lahendada igasuguseid probleeme.
  • Disaini mudelid defiNeed loovad ühise keele, mida teie ja teie meeskond saate kasutada tõhusamaks suhtlemiseks. Võite öelda: "Oh, kasutage selleks Singletonit" ja kõik saavad teie soovituse ideest aru. Pole vaja selgitada, mis on üksik, kui teate mustrit ja selle nime.

Disainimustrite klassifikatsioon

Disainimustrid erinevad kogu kavandatud süsteemi keerukuse, üksikasjalikkuse ja rakendatavuse skaala poolest.

Analoogia põhjal saame muuta ristmiku turvalisemaks, paigaldades mõne foori või ehitades terve mitmetasandilise ristmiku koos maa-aluste käikudega jalakäijatele.

Sageli nimetatakse kõige elementaarsemaid madala taseme mudeleid idioomid . Tavaliselt kehtivad need ainult ühe programmeerimiskeele kohta.

Kõige universaalsemad ja kõrgetasemelised mudelid on arhitektuursed mudelid . Arendajad saavad neid mustreid rakendada peaaegu igas keeles. Erinevalt teistest mustritest saab neid kasutada kogu rakenduse arhitektuuri kujundamiseks.

Lisaks saab kõiki mudeleid klassifitseerida nende järgi üritas või eesmärk. Kolm peamist klassi on:

Innovatsiooni uudiskiri
Ärge jätke ilma kõige olulisematest uuendustest. Registreeruge, et saada neid meili teel.
  • Loomingulised mudelid need pakuvad objektide loomise mehhanisme, mis suurendavad paindlikkust ja olemasoleva koodi taaskasutamist.
  • Struktuurimudelid nad selgitavad, kuidas objekte ja klasse suuremateks struktuurideks kokku panna, hoides need struktuurid paindlikud ja tõhusad.
  • Käitumismudelid nad tegelevad tõhusa suhtlemise ja objektidevahelise vastutuse määramisega.

Laraveli disainimustri näide: fassaad

Fassaad on struktuurse disaini muster, mis pakub lihtsustatud liidest teegile, raamistikule või mõnele muule keerukale klassikomplektile.

Probleem

Oletame, et peame tarkvara tööle panema, tuginedes suurele hulgale objektidele, mis kuuluvad keerukasse teeki või raamistikku. Tavaliselt peaksime kõik need objektid lähtestama, jälgima sõltuvusi, käivitama meetodeid õiges järjekorras ja nii edasi.

Selle tulemusel seotakse klasside äriloogika tihedalt kolmandate osapoolte klasside rakendamise üksikasjadega, mistõttu on neid raske mõista ja hallata.

Lahendus

A. facade on klass, mis pakub lihtsa liidese keerukale allsüsteemile, mis sisaldab palju liikuvaid osi. A facade võib pakkuda piiratud funktsionaalsust võrreldes otse allsüsteemiga töötamisega. See sisaldab aga ainult neid funktsioone, millest kliendid tõeliselt hoolivad.

Kas teil on üks facade see on kasulik, kui peame integreerima rakenduse keeruka teegiga, millel on kümneid funktsioone, kuid vajame vaid väikest osa selle funktsionaalsusest.

Näiteks rakendus, mis laadib sotsiaalmeediasse üles lühikesi naljakaid videoid kassidega, võib potentsiaalselt kasutada professionaalset videoteeki. Kuid kõik, mida me tegelikult vajame, on ühe meetodiga klass encode(filename, format). Pärast sellise klassi loomist ja ühendamist videokonversiooni teegiga on meil esimene facade.

Näiteks kõnekeskuse telefonioperaator on nagu a facade. Tegelikult, kui helistame telefonitellimuse tegemiseks poe telefoniteenindusse, on operaator meie päralt facade kõigi kaupluse teenuste ja osakondade suhtes. Operaator pakub lihtsat häälliidest tellimissüsteemile, makseväravatele ja erinevatele kohaletoimetamisteenustele.

Tõeline näide PHP-s

Mõtlema Fassaad lihtsa adapterina mõne keeruka alamsüsteemi jaoks. Facade isoleerib keerukuse ühes klassis ja võimaldab teistel rakenduskoodidel kasutada lihtsat liidest.

Selles näites Facade peidab kliendikoodi eest YouTube'i API ja FFmpegi teegi keerukuse. Selle asemel, et töötada kümnete klassidega, kasutab klient Fassaadil lihtsat meetodit.

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

Innovatsiooni uudiskiri
Ärge jätke ilma kõige olulisematest uuendustest. Registreeruge, et saada neid meili teel.

Viimased artiklid

Veeam pakub lunavarale kõige põhjalikumat tuge alates kaitsest kuni reageerimise ja taastamiseni

Veeami Coveware jätkab küberväljapressimise juhtumitele reageerimise teenuste pakkumist. Coveware pakub kohtuekspertiisi ja heastamisvõimalusi…

Aprill 23 2024

Roheline ja digitaalne revolutsioon: kuidas ennustav hooldus muudab nafta- ja gaasitööstust

Ennustav hooldus muudab nafta- ja gaasisektori pöördeliseks uuendusliku ja ennetava lähenemisega tehaste juhtimisele.…

Aprill 22 2024

Ühendkuningriigi monopolivastane regulaator tõstab BigTechi häire GenAI pärast

Ühendkuningriigi CMA on väljastanud hoiatuse Big Techi käitumise kohta tehisintellekti turul. Seal…

Aprill 18 2024

Casa Green: energiarevolutsioon jätkusuutliku tuleviku nimel Itaalias

Euroopa Liidu poolt hoonete energiatõhususe suurendamiseks koostatud roheliste majade dekreet on lõpetanud oma seadusandliku protsessi…

Aprill 18 2024