Muda uliokadiriwa wa kusoma: 6 minuti
Mchoro wa muundo sio msimbo ambao tunaweza kunakili na kuingiza kwenye programu yetu, kama tunavyoweza kufanya na vitendakazi au maktaba za kawaida. Mchoro wa kubuni ni dhana ya jumla yenye uwezo wa kutatua tatizo fulani. Kimsingi ni mfano ambao maelezo yake tunaweza kufuata na kutekeleza suluhisho linalolingana na ukweli wa programu yetu.
Mifano mara nyingi huchanganyikiwa na algorithms, kwa sababu dhana zote mbili zinaelezea ufumbuzi wa kawaida kwa matatizo fulani yanayojulikana. Wakati algorithm defiIkiwa daima kuna seti ya wazi ya vitendo ambayo inaweza kufikia lengo fulani, mfano ni maelezo ya kiwango cha juu cha suluhisho. Msimbo kutoka kwa mfano sawa unaotumika kwa programu mbili tofauti unaweza kuwa tofauti.
Tunataka kufanya mlinganisho, tunaweza kufikiria kichocheo cha kupikia: wote wana hatua wazi za kufikia lengo. Walakini, mfano ni kama mradi, ambao unaweza kuona matokeo na sifa zake ni nini, lakini mpangilio halisi wa utekelezaji unategemea sisi tunaoandika nambari.
Mifumo mingi imeelezewa rasmi sana ili watu waweze kuizalisha tena katika miktadha mingi. Wacha tuone hapa chini vitu ambavyo vipo katika maelezo ya mfano:
Mpangaji programu anaweza kutengeneza programu bila kujua uwepo wa muundo wa muundo. Wengi hufanya hivyo, na kwa sababu hii wanatekeleza mipango fulani bila kujua. Lakini basi kwa nini tunapaswa kutumia wakati kuzijifunza?
Miundo ya muundo hutofautiana katika uchangamano, kiwango cha undani, na ukubwa wa utumiaji katika mfumo wote ulioundwa.
Kwa mlinganisho, tunaweza kufanya makutano kuwa salama zaidi kwa kusakinisha taa chache za trafiki au kujenga makutano yote ya ngazi mbalimbali na njia za chini ya ardhi kwa watembea kwa miguu.
Mifano ya msingi zaidi, ya kiwango cha chini huitwa mara nyingi nahau . Kawaida hutumika tu kwa lugha moja ya programu.
Mifano ya ulimwengu wote na ya juu ni mifano ya usanifu . Wasanidi wanaweza kutekeleza ruwaza hizi katika takriban lugha yoyote. Tofauti na mifumo mingine, inaweza kutumika kutengeneza usanifu wa programu nzima.
Zaidi ya hayo, mifano yote inaweza kuainishwa kulingana na yao alijaribu au kusudi. Madarasa makuu matatu ni:
Fadi ni muundo wa muundo ambao hutoa kiolesura kilichorahisishwa kwa maktaba, mfumo, au seti nyingine yoyote changamano ya madarasa.
Hebu tuchukulie tunahitaji kufanya programu kufanya kazi, kulingana na seti kubwa ya vitu ambavyo ni vya maktaba ya kisasa au mfumo. Kwa kawaida, tungehitaji kuanzisha vitu hivi vyote, kufuatilia utegemezi, kutekeleza mbinu kwa mpangilio sahihi, na kadhalika.
Kwa hivyo, mantiki ya biashara ya madarasa ingeunganishwa kwa uthabiti na maelezo ya utekelezaji wa madarasa ya wahusika wengine, na kuyafanya kuwa magumu kuelewa na kudhibiti.
a facade
ni darasa ambalo hutoa kiolesura rahisi kwa mfumo mdogo ambao una sehemu nyingi zinazosonga. A facade
inaweza kutoa utendakazi mdogo ikilinganishwa na kufanya kazi moja kwa moja na mfumo mdogo. Walakini, inajumuisha tu vipengele ambavyo wateja wanajali sana.
Kuwa na moja facade
ni muhimu tunapohitaji kuunganisha programu na maktaba ya kisasa ambayo ina vipengele vingi, lakini tunahitaji tu sehemu ndogo ya utendaji wake.
Kwa mfano, programu inayopakia video fupi za kuchekesha zinazoangazia paka kwenye mitandao jamii inaweza kutumia maktaba ya kitaalamu ya kugeuza video. Walakini, tunachohitaji sana ni darasa na njia moja encode(filename, format)
. Baada ya kuunda darasa kama hilo na kuiunganisha kwenye maktaba ya ubadilishaji wa video, tutakuwa na ya kwanza facade
.
Kwa mfano, opereta wa simu wa kituo cha simu ni kama a facade
. Kwa kweli, tunapoita huduma ya simu ya duka ili kuweka agizo la simu, opereta ni yetu facade
kuelekea huduma zote na idara za duka. Opereta hutoa interface rahisi ya sauti kwa mfumo wa kuagiza, lango la malipo na huduma mbalimbali za utoaji.
Fikiria kuhusu Fadi kama adapta rahisi kwa mifumo midogo midogo. Facade
hutenganisha utata ndani ya darasa moja na inaruhusu msimbo mwingine wa programu kutumia kiolesura rahisi.
Katika mfano huu, Facade
huficha utata wa API ya YouTube na maktaba ya FFmpeg kutoka kwa msimbo wa mteja. Badala ya kufanya kazi na madarasa kadhaa, mteja hutumia njia rahisi kwenye 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
Coveware by Veeam itaendelea kutoa huduma za kukabiliana na matukio ya ulaghai mtandaoni. Coveware itatoa uwezo wa uchunguzi na urekebishaji…
Matengenezo ya kitabiri yanaleta mapinduzi katika sekta ya mafuta na gesi, kwa mbinu bunifu na makini ya usimamizi wa mitambo.…
CMA ya Uingereza imetoa onyo kuhusu tabia ya Big Tech katika soko la kijasusi bandia. Hapo...
Amri ya "Nyumba za Kijani", iliyoundwa na Umoja wa Ulaya ili kuongeza ufanisi wa nishati ya majengo, imehitimisha mchakato wake wa kutunga sheria na…