Koha e parashikuar e leximit: 6 minuti
Një model dizajni nuk është kod që ne mund ta kopjojmë dhe futim në programin tonë, siç mund të bëjmë me funksionet standarde ose bibliotekat. Modeli i dizajnit është një koncept i përgjithshëm i aftë për të zgjidhur një problem të veçantë. Në thelb një model, detajet e të cilit mund të ndjekim dhe të zbatojmë një zgjidhje që i përshtatet realitetit të programit tonë.
Modelet shpesh ngatërrohen me algoritmet, sepse të dy konceptet përshkruajnë zgjidhje tipike për disa probleme të njohura. Ndërsa një algoritëm defiNëse ka gjithmonë një grup të qartë veprimesh që mund të arrijnë një qëllim të caktuar, një model është një përshkrim i nivelit më të lartë të një zgjidhjeje. Kodi nga i njëjti model i aplikuar në dy programe të ndryshme mund të jetë i ndryshëm.
Duke dashur të bëjmë një analogji, mund të mendojmë për një recetë gatimi: të dyja kanë hapa të qartë për të arritur një qëllim. Sidoqoftë, një model i ngjan më shumë një projekti, të cilit mund të shihni se cili është rezultati dhe karakteristikat e tij, por rendi i saktë i zbatimit varet nga ne që shkruajmë kodin.
Shumica e modeleve përshkruhen shumë zyrtarisht në mënyrë që njerëzit t'i riprodhojnë ato në shumë kontekste. Le të shohim më poshtë elementët që janë të pranishëm në përshkrimin e një modeli:
Një programues mund të zhvillojë softuer pa e ditur ekzistencën e modeleve të projektimit. Shumë e bëjnë, dhe për këtë arsye zbatojnë disa skema pa e ditur. Por atëherë pse duhet të shpenzojmë kohë duke i mësuar ato?
Modelet e projektimit ndryshojnë në kompleksitetin, nivelin e detajeve dhe shkallën e zbatueshmërisë në të gjithë sistemin e projektuar.
Për analogji, ne mund ta bëjmë një kryqëzim më të sigurt duke instaluar disa semaforë ose duke ndërtuar një shkëmbim të tërë shumënivelësh me kalime nëntokësore për këmbësorët.
Shpesh quhen modelet më themelore, të nivelit të ulët idioma . Zakonisht ato aplikohen vetëm për një gjuhë të vetme programimi.
Modelet më universale dhe të nivelit të lartë janë modele arkitekturore . Zhvilluesit mund t'i zbatojnë këto modele pothuajse në çdo gjuhë. Ndryshe nga modelet e tjera, ato mund të përdoren për të hartuar arkitekturën e një aplikacioni të tërë.
Për më tepër, të gjitha modelet mund të klasifikohen sipas tyre provuar ose qëllimi. Tre klasat kryesore janë:
fasadë është një model dizajni strukturor që ofron një ndërfaqe të thjeshtuar për një bibliotekë, kornizë ose çdo grup tjetër kompleks klasash.
Le të supozojmë se duhet ta bëjmë softuerin të funksionojë, bazuar në një grup të madh objektesh që i përkasin një biblioteke ose kornizë të sofistikuar. Normalisht, do të na duhet të inicializojmë të gjitha këto objekte, të mbajmë gjurmët e varësive, të ekzekutojmë metodat në rendin e duhur, e kështu me radhë.
Si rezultat, logjika e biznesit të klasave do të lidhej ngushtë me detajet e zbatimit të klasave të palëve të treta, duke i bërë ato të vështira për t'u kuptuar dhe menaxhuar.
një facade
është një klasë që ofron një ndërfaqe të thjeshtë për një nënsistem kompleks që përmban shumë pjesë lëvizëse. A facade
mund të sigurojë funksionalitet të kufizuar në krahasim me punën direkt me nënsistemin. Sidoqoftë, ai përfshin vetëm veçoritë për të cilat klientët interesohen vërtet.
Keni një facade
është e dobishme kur duhet të integrojmë aplikacionin me një bibliotekë të sofistikuar që ka dhjetëra veçori, por na duhet vetëm një pjesë e vogël e funksionalitetit të tij.
Për shembull, një aplikacion që ngarkon video të shkurtra qesharake me mace në mediat sociale mund të përdorë një bibliotekë profesionale të konvertimit të videove. Sidoqoftë, gjithçka që na nevojitet është një klasë me metodën e vetme encode(filename, format)
. Pasi të krijojmë një klasë të tillë dhe ta lidhim atë me bibliotekën e konvertimit të videove, do të kemi të parën facade
.
Për shembull, operatori telefonik i një qendre telefonike është si një facade
. Në fakt, kur telefonojmë shërbimin telefonik të një dyqani për të bërë një porosi telefonike, një operator është i yni facade
drejt të gjitha shërbimeve dhe departamenteve të dyqanit. Operatori ofron një ndërfaqe të thjeshtë zanore për sistemin e porositjes, portat e pagesave dhe shërbime të ndryshme shpërndarjeje.
Mendo per fasadë si një përshtatës i thjeshtë për disa nënsisteme komplekse. Facade
izolon kompleksitetin brenda një klase të vetme dhe lejon kodin tjetër të aplikacionit të përdorë ndërfaqen e thjeshtë.
Në këtë shembull, Facade
fsheh kompleksitetin e bibliotekës YouTube API dhe FFmpeg nga kodi i klientit. Në vend që të punojë me dhjetëra klasa, klienti përdor një metodë të thjeshtë në Fasadë.
<?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 nga Veeam do të vazhdojë të ofrojë shërbime të reagimit ndaj incidenteve të zhvatjes kibernetike. Coveware do të ofrojë aftësi mjeko-ligjore dhe riparimi…
Mirëmbajtja parashikuese po revolucionon sektorin e naftës dhe gazit, me një qasje inovative dhe proaktive për menaxhimin e impiantit.…
CMA e Mbretërisë së Bashkuar ka lëshuar një paralajmërim për sjelljen e Big Tech në tregun e inteligjencës artificiale. Aty…
Dekreti "Case Green", i formuluar nga Bashkimi Evropian për të rritur efiçencën energjetike të ndërtesave, ka përfunduar procesin e tij legjislativ me…