Greinar

Hvað eru hönnunarmynstur: hvers vegna nota þau, flokkun, kostir og gallar

Í hugbúnaðarverkfræði eru hönnunarmynstur ákjósanlegar lausnir á vandamálum sem venjulega koma upp í hugbúnaðarhönnun.

Þau eru eins og forverkefnidefinítt, reynt og prófað verkfæri sem þú getur sérsniðið til að leysa endurtekið hönnunarvandamál í kóðanum þínum.

Áætlaður lestrartími: 6 minuti

Hvað er hönnunarmynstur

Hönnunarmynstur er ekki kóði sem við getum afritað og sett inn í forritið okkar, eins og við getum gert með stöðluðum aðgerðum eða bókasöfnum. Hönnunarmynstrið er almennt hugtak sem getur leyst tiltekið vandamál. Í grundvallaratriðum líkan sem við getum fylgst með og útfært lausn sem passar við raunveruleika forritsins okkar.

Líkönum er oft ruglað saman við reiknirit vegna þess að bæði hugtökin lýsa dæmigerðum lausnum á nokkrum þekktum vandamálum. Þó reiknirit defiEf það er alltaf skýrt sett af aðgerðum sem geta náð ákveðnu markmiði er líkan lýsing á lausn á hærra stigi. Kóði úr sömu gerð sem notaður er á tvö mismunandi forrit getur verið mismunandi.

Við viljum gera líkingu, við getum hugsað okkur matreiðsluuppskrift: bæði hafa skýr skref til að ná markmiði. Hins vegar er líkan meira eins og verkefni, þar sem þú getur séð hver útkoman er og einkenni þess, en nákvæm útfærsluröð fer eftir okkur sem skrifum kóðann.

Úr hverju er hönnunarmynstur gert?

Flestum mynstrum er lýst mjög formlega þannig að fólk geti endurskapað þau í mörgum samhengi. Við skulum sjá fyrir neðan þá þætti sem eru til staðar í lýsingu á líkani:

  • Ætlunin líkansins lýsir í stuttu máli bæði vandamálinu og lausninni.
  • Hvatinn útskýrir frekar vandamálið og þá lausn sem líkanið gerir mögulega.
  • Uppbygging af bekkjum sýnir hvern hluta líkansins og hvernig þeir tengjast.
  • Kóða dæmið á einu vinsælasta forritunarmálinu gerir það auðveldara að skilja hugmyndina á bak við líkanið.

Af hverju að nota þá?

Forritari getur þróað hugbúnað án þess að vita tilvist hönnunarmynstra. Margir gera það og af þessum sökum innleiða þeir sum kerfi án þess að vita af því. En hvers vegna ættum við þá að eyða tíma í að læra þau?

  • Hönnunarmynstrin eru sett af reynt og prófað lausnir til algengra vandamála í hugbúnaðarhönnun. Jafnvel þótt þú lendir aldrei í þessum vandamálum, þá er samt gagnlegt að þekkja mynstur vegna þess að það kennir þér hvernig á að leysa alls kyns vandamál með hlutbundnum hönnunarreglum.
  • Hönnunarlíkönin defiÞeir búa til sameiginlegt tungumál sem þú og teymið þitt getur notað til að eiga skilvirkari samskipti. Þú gætir sagt, "Ó, notaðu bara Singleton til að gera þetta," og allir munu skilja hugmyndina á bak við tillögu þína. Það er engin þörf á að útskýra hvað singleton er ef þú þekkir mynstrið og nafn þess.

Flokkun hönnunarmynstra

Hönnunarmynstur eru mismunandi hvað varðar flókið, smáatriði og umfang notkunar í gegnum hannaða kerfið.

Á hliðstæðan hátt getum við gert gatnamót öruggari með því að setja upp nokkur umferðarljós eða byggja heila fjölþrepa skiptistöð með neðanjarðargöngum fyrir gangandi vegfarendur.

Algengustu, lágu módelin eru oft kölluð orðatiltæki . Þeir eiga venjulega aðeins við um eitt forritunarmál.

Alhliða og hágæða módelin eru byggingarlistarlíkön . Hönnuðir geta innleitt þessi mynstur á nánast hvaða tungumáli sem er. Ólíkt öðrum mynstrum er hægt að nota þau til að hanna arkitektúr heils forrits.

Ennfremur er hægt að flokka allar gerðir eftir þeim reyndi eða tilgangi. Aðalflokkarnir þrír eru:

Nýsköpunarfréttabréf
Ekki missa af mikilvægustu fréttunum um nýsköpun. Skráðu þig til að fá þau með tölvupósti.
  • Skapandi módel þeir bjóða upp á kerfi til að búa til hluti sem auka sveigjanleika og endurnotkun á núverandi kóða.
  • Byggingarlíkön þeir útskýra hvernig á að setja saman hluti og flokka í stærri mannvirki og halda þessum mannvirkjum sveigjanlegum og skilvirkum.
  • Hegðunarlíkön þau fjalla um skilvirk samskipti og úthlutun ábyrgðar milli hluta.

Dæmi um hönnunarmynstur í Laravel: Framhlið

Framhlið er burðarvirkishönnunarmynstur sem veitir einfaldað viðmót við bókasafn, ramma eða önnur flókin flokkaflokk.

Vandamál

Gerum ráð fyrir að við þurfum að láta hugbúnað virka, byggt á stóru safni af hlutum sem tilheyra háþróuðu bókasafni eða ramma. Venjulega þyrftum við að frumstilla alla þessa hluti, halda utan um ósjálfstæði, framkvæma aðferðir í réttri röð og svo framvegis.

Fyrir vikið myndi viðskiptarökfræði flokkanna verða þétt tengd útfærsluupplýsingum þriðja aðila flokka, sem gerir þá erfitt að skilja og stjórna.

Lausn

a facade er flokkur sem veitir einfalt viðmót við flókið undirkerfi sem inniheldur marga hreyfanlega hluta. A facade getur veitt takmarkaða virkni miðað við að vinna beint með undirkerfinu. Hins vegar inniheldur það aðeins þá eiginleika sem viðskiptavinum þykir mjög vænt um.

Hafðu einn facade það er gagnlegt þegar við þurfum að samþætta appið við háþróað bókasafn sem hefur heilmikið af eiginleikum, en við þurfum aðeins lítinn hluta af virkni þess.

Til dæmis gæti app sem hleður upp stuttum fyndnum myndböndum með köttum á samfélagsmiðla mögulega notað faglegt myndbandsumbreytingarsafn. Hins vegar, allt sem við þurfum í raun er flokkur með einni aðferð encode(filename, format). Eftir að hafa búið til slíkan flokk og tengt hann við myndbandsumbreytingarsafnið munum við hafa okkar fyrsta facade.

Til dæmis er símastjóri símavers eins og a facade. Reyndar, þegar við hringjum í símaþjónustu verslana til að leggja inn símapöntun, þá er símafyrirtækið okkar facade gagnvart allri þjónustu og deildum verslunarinnar. Rekstraraðili útvegar einfalt raddviðmót við pöntunarkerfið, greiðslugáttir og ýmsa afhendingarþjónustu.

Raunverulegt dæmi í PHP

Hugsa um Framhlið sem einfalt millistykki fyrir sum flókin undirkerfi. Facade einangrar flókið innan eins flokks og gerir öðrum forritakóða kleift að nota einfalda viðmótið.

Í þessu dæmi, Facade felur margbreytileika YouTube API og FFmpeg bókasafnsins fyrir biðlarakóðanum. Í stað þess að vinna með tugi flokka notar viðskiptavinurinn einfalda aðferð á 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

Nýsköpunarfréttabréf
Ekki missa af mikilvægustu fréttunum um nýsköpun. Skráðu þig til að fá þau með tölvupósti.

Nýlegar greinar

Veeam býður upp á umfangsmesta stuðninginn fyrir lausnarhugbúnað, allt frá vernd til viðbragða og bata

Coveware frá Veeam mun halda áfram að veita viðbragðsþjónustu fyrir tölvukúgun. Coveware mun bjóða upp á réttar- og úrbótamöguleika ...

23 Apríl 2024

Græn og stafræn bylting: Hvernig forspárviðhald er að umbreyta olíu- og gasiðnaðinum

Forspárviðhald er að gjörbylta olíu- og gasgeiranum, með nýstárlegri og fyrirbyggjandi nálgun við verksmiðjustjórnun.…

22 Apríl 2024

Breska samkeppniseftirlitið vekur BigTech viðvörun vegna GenAI

Breska CMA hefur gefið út viðvörun um hegðun Big Tech á gervigreindarmarkaði. Þarna…

18 Apríl 2024

Casa Green: orkubylting fyrir sjálfbæra framtíð á Ítalíu

„Case Green“ tilskipunin, mótuð af Evrópusambandinu til að auka orkunýtni bygginga, hefur lokið löggjafarferli sínu með...

18 Apríl 2024