Numatomas skaitymo laikas: 6 minuti
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ą.
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:
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 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:
Fasadas yra struktūrinio dizaino modelis, suteikiantis supaprastintą sąsają su biblioteka, sistema ar bet kokiu kitu sudėtingu klasių rinkiniu.
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.
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.
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
„Coveware by Veeam“ ir toliau teiks reagavimo į kibernetinio turto prievartavimo incidentus paslaugas. „Coveware“ pasiūlys teismo ekspertizės ir ištaisymo galimybes…
Nuspėjama priežiūra keičia naftos ir dujų sektorių, taikant naujovišką ir iniciatyvų požiūrį į gamyklų valdymą.…
JK CMA paskelbė įspėjimą dėl Big Tech elgesio dirbtinio intelekto rinkoje. Ten…
„Žaliųjų namų“ dekretas, kurį Europos Sąjunga suformulavo siekiant padidinti pastatų energijos vartojimo efektyvumą, baigė teisėkūros procesą su…