Artikoloj

Kio estas dezajnaj ŝablonoj: kial uzi ilin, klasifiko, avantaĝoj kaj malavantaĝoj

En softvarinĝenierado, dezajnopadronoj estas optimumaj solvoj al problemoj kiuj ofte okazas en softvardezajno.

Ili estas kiel antaŭprojektojdefifinitaj, elprovitaj iloj, kiujn vi povas personecigi por solvi ripetiĝantan projektan problemon en via kodo.

Laŭtaksa legotempo: 6 minutoj

Kio estas Dezajna Ŝablono

Dezajna ŝablono ne estas kodo, kiun ni povas kopii kaj enmeti en nian programon, kiel ni povas fari kun normaj funkcioj aŭ bibliotekoj. La dezajnopadrono estas ĝenerala koncepto kapabla je solvi specialan problemon. Esence modelo, kies detalojn ni povas sekvi kaj efektivigi solvon, kiu kongruas kun la realeco de nia programo.

Modeloj ofte estas konfuzitaj kun algoritmoj, ĉar ambaŭ konceptoj priskribas tipajn solvojn al kelkaj konataj problemoj. Dum algoritmo defiSe ĉiam estas klara aro de agoj, kiuj povas atingi certan celon, modelo estas pli alta nivela priskribo de solvo. Kodo de la sama modelo aplikita al du malsamaj programoj povas esti malsama.

Volante fari analogion, ni povas pensi pri kuira recepto: ambaŭ havas klarajn paŝojn por atingi celon. Tamen, modelo pli similas al projekto, de kiu vi povas vidi, kio estas la rezulto kaj ĝiaj trajtoj, sed la ĝusta ordo de efektivigo dependas de ni, kiuj skribas la kodon.

El kio estas Dezajna Ŝablono?

Plej multaj ŝablonoj estas priskribitaj tre formale, por ke homoj povu reprodukti ilin en multaj kuntekstoj. Ni vidu sube la elementojn, kiuj ĉeestas en la priskribo de modelo:

  • La intenco de la modelo mallonge priskribas kaj la problemon kaj la solvon.
  • La instigo plue klarigas la problemon kaj la solvon, kiujn la modelo ebligas.
  • Strukturo de klasoj montras ĉiun parton de la modelo kaj kiel ili rilatas.
  • La koda ekzemplo en unu el la plej popularaj programlingvoj faciligas kompreni la ideon malantaŭ la modelo.

Kial uzi ilin?

Programisto povas evoluigi programaron sen scii la ekziston de dezajnaj ŝablonoj. Multaj faras, kaj tial ili efektivigas iujn skemojn sen scii ĝin. Sed kial do ni pasigu tempon lernante ilin?

  • La dezajnaj ŝablonoj estas kompleto provitaj solvoj al oftaj problemoj en programardezajno. Eĉ se vi neniam renkontas ĉi tiujn problemojn, koni ŝablonojn ankoraŭ utilas, ĉar ĝi instruas vin kiel solvi ĉiajn problemojn uzante principojn de dezajno orientitaj al objektoj.
  • La dezajnomodeloj defiIli kreas komunan lingvon, kiun vi kaj via teamo povas uzi por komuniki pli efike. Vi povus diri, "Ho, nur uzu Singleton por fari ĉi tion", kaj ĉiuj komprenos la ideon malantaŭ via sugesto. Ne necesas klarigi kio estas singleton se vi konas la ŝablonon kaj ĝian nomon.

Klasifiko de Dezajnaj Ŝablonoj

Dezajnaj padronoj malsamas en komplekseco, nivelo de detalo kaj skalo de aplikebleco ĉie en la dizajnita sistemo.

Analogie, ni povas fari intersekciĝon pli sekura instalante kelkajn trafiklumojn aŭ konstruante tutan plurnivelan vojnodon kun subteraj trairejoj por piedirantoj.

La plej bazaj, malaltnivelaj modeloj ofte estas nomitaj idiomaĵoj . Ili kutime validas nur por ununura programlingvo.

La plej universalaj kaj altnivelaj modeloj estas arkitekturaj modeloj . Programistoj povas efektivigi ĉi tiujn ŝablonojn en preskaŭ ajna lingvo. Male al aliaj ŝablonoj, ili povas esti uzataj por desegni la arkitekturon de tuta aplikaĵo.

Krome, ĉiuj modeloj povas esti klasifikitaj laŭ ilia provis aŭ celo. La tri ĉefaj klasoj estas:

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.
  • Kreaj modeloj ili disponigas objektokreajn mekanismojn kiuj pliigas flekseblecon kaj reuzon de ekzistanta kodo.
  • Strukturaj modeloj ili klarigas kiel kunveni objektojn kaj klasojn en pli grandajn strukturojn, konservante tiujn strukturojn flekseblaj kaj efikaj.
  • Kondutismaj modeloj ili traktas efikan komunikadon kaj asignadon de respondecoj inter objektoj.

Ekzemplo de Dezajno-Patrono en Laravel: Fasado

Fasadon estas struktura dezajnopadrono kiu disponigas simpligitan interfacon al biblioteko, kadro, aŭ ajna alia kompleksa aro de klasoj.

Problemo

Ni supozu, ke ni devas fari programaron funkcii, surbaze de granda aro da objektoj, kiuj apartenas al altnivela biblioteko aŭ kadro. Normale, ni bezonus pravalorigi ĉiujn ĉi objektojn, konservi trakon de dependecoj, ekzekuti metodojn en la ĝusta ordo, ktp.

Kiel rezulto, la komerca logiko de la klasoj iĝus malloze kunligita al la efektivigdetaloj de triaj klasoj, malfaciligante ilin kompreni kaj administri.

Solvo

una facade estas klaso kiu disponigas simplan interfacon al kompleksa subsistemo kiu enhavas multajn moviĝantajn partojn. A facade povas disponigi limigitan funkciecon komparite kun laborado rekte kun la subsistemo. Tamen ĝi nur inkluzivas la funkciojn, pri kiuj la klientoj vere zorgas.

Havu unu facade ĝi estas utila kiam ni bezonas integri la apon kun kompleksa biblioteko kiu havas dekojn da funkcioj, sed ni bezonas nur malgrandan parton de ĝia funkcieco.

Ekzemple, aplikaĵo kiu alŝutas mallongajn amuzajn filmetojn kun katoj al sociaj amaskomunikiloj povus eble uzi profesian videokonvertan bibliotekon. Tamen, ĉio, kion ni vere bezonas, estas klaso kun la ununura metodo encode(filename, format). Post krei tian klason kaj konekti ĝin al la videokonverta biblioteko, ni havos nian unuan facade.

Ekzemple, la telefonisto de telefoncentro estas kiel a facade. Fakte, kiam ni vokas la telefonservon de vendejo por fari telefonmendon, telefonisto estas nia facade al ĉiuj servoj kaj fakoj de la vendejo. La funkciigisto provizas simplan voĉan interfacon al la menda sistemo, pagpordoj kaj diversaj liverservoj.

Vera ekzemplo en PHP

Pripensi Fasadon kiel simpla adaptilo por kelkaj kompleksaj subsistemoj. Facade izolas la kompleksecon ene de ununura klaso kaj permesas al alia aplikaĵokodo uzi la simplan interfacon.

En ĉi tiu ekzemplo, Facade kaŝas la kompleksecon de la biblioteko de YouTube API kaj FFmpeg de la klientokodo. Anstataŭ labori kun dekoj da klasoj, la kliento uzas simplan metodon sur Fasado.

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

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.

Lastaj artikoloj

Veeam havas la plej ampleksan subtenon por ransomware, de protekto ĝis respondo kaj reakiro

Coveware de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...

23 aprilo 2024

Verda kaj Cifereca Revolucio: Kiel Prognoza Prizorgado Transformas la Petrolo kaj Gasa Industrio

Prognoza prizorgado revolucias la petrolon kaj gasan sektoron, kun noviga kaj iniciatema aliro al plantadministrado...

22 aprilo 2024

UK-antitrusta reguligisto vekas BigTech-alarmon pri GenAI

La UK CMA publikigis averton pri la konduto de Big Tech en la merkato de artefarita inteligenteco. Tie…

18 aprilo 2024

Casa Green: energia revolucio por daŭripova estonteco en Italio

La Dekreto "Verdaj Domoj", formulita de Eŭropa Unio por plibonigi la energi-efikecon de konstruaĵoj, finis sian leĝdonan procezon per...

18 aprilo 2024