Dè a th’ ann am pàtrain dealbhaidh: carson a thathas gan cleachdadh, seòrsachadh, buannachdan agus eas-bhuannachdan
Ann an innleadaireachd bathar-bog, tha pàtrain dealbhaidh nam fuasglaidhean as fheàrr do dhuilgheadasan a tha gu tric a’ nochdadh ann an dealbhadh bathar-bog.
Tha iad coltach ri dealbhaidhean ro-thogte, deuchainneach as urrainn dhut a ghnàthachadh gus fuasgladh fhaighinn air duilgheadas dealbhaidh ath-chuairteachaidh sa chòd agad.
Ùine leughaidh tuairmseach: 6 minuti
Dè a th 'ann am pàtran dealbhaidh
Chan e còd a th’ ann am pàtran dealbhaidh as urrainn dhuinn a chopaigeadh agus a chuir a-steach don phrògram againn, mar as urrainn dhuinn a dhèanamh le gnìomhan àbhaisteach no leabharlannan. Tha am pàtran dealbhaidh na bhun-bheachd coitcheann a tha comasach air fuasgladh fhaighinn air duilgheadas sònraichte. Gu bunaiteach modail leis am faod sinn mion-fhiosrachadh a leantainn agus fuasgladh a chuir an gnìomh a fhreagras air fìrinn ar prògram.
I modelli vengono spesso confusi con gli algoritmi, perché entrambi i concetti descrivono soluzioni tipiche ad alcuni problemi noti. Mentre un algorithm definisce sempre un insieme chiaro di azioni che possono raggiungere un certo obiettivo, un modello è una descrizione di livello più alto di una soluzione. Il codice dello stesso modello applicato a due programmi diversi potrebbe essere diverso.
Ag iarraidh samhlachadh a dhèanamh, is urrainn dhuinn smaoineachadh air reasabaidh còcaireachd: tha ceumannan soilleir aig an dithis aca gus amas a choileanadh. Ach, tha modail nas coltaiche ri pròiseact, agus chì thu dè an toradh agus na feartan aige, ach tha an dearbh òrdugh buileachaidh an urra ri cò a sgrìobhas an còd.
Cò às a tha Pàtran Dealbhaidh air a dhèanamh?
Tha a’ mhòr-chuid de phàtranan air am mìneachadh gu foirmeil gus an urrainn do dhaoine an ath-riochdachadh ann an iomadh suidheachadh. Chì sinn gu h-ìosal na h-eileamaidean a tha an làthair anns an tuairisgeul air modail:
- An rùn den mhodail a’ toirt cunntas goirid air an dà chuid an duilgheadas agus am fuasgladh.
- An spreagadh mìnichidh e an duilgheadas agus am fuasgladh a tha am modail comasach.
- Structar de chlasaichean a’ sealltainn gach pàirt den mhodail agus mar a tha iad càirdeach.
- Eisimpleir còd ann an aon de na cànanan prògramaidh as mòr-chòrdte ga dhèanamh nas fhasa am beachd air cùl a’ mhodail a thuigsinn.
Carson a chleachdas tu iad?
Faodaidh prògramadair bathar-bog a leasachadh gun fhios gu bheil pàtrain dealbhaidh ann. Bidh mòran a 'dèanamh, agus air an adhbhar seo bidh iad a' cur an gnìomh cuid de sgeamaichean gun fhios dha. Ach an uairsin carson a bu chòir dhuinn ùine a chaitheamh gan ionnsachadh?
- Tha na pàtrain dealbhaidh nan seata de fuasglaidhean deuchainneach agus deuchainneach gu duilgheadasan cumanta ann an dealbhadh bathar-bog. Fiù mura coinnich thu ris na duilgheadasan sin a-riamh, tha eòlas air pàtrain fhathast feumail oir bidh e a’ teagasg dhut mar a dh ’fhuasglas tu a h-uile seòrsa duilgheadas a’ cleachdadh prionnsapalan dealbhaidh a tha ag amas air nithean.
- Bidh pàtrain dealbhaidh a’ mìneachadh cànan cumanta as urrainn dhut fhèin agus an sgioba agad a chleachdadh gus conaltradh nas èifeachdaiche a dhèanamh. Dh’ fhaodadh tu a ràdh, “O, dìreach cleachd Singleton airson seo a dhèanamh,” agus tuigidh a h-uile duine am beachd a tha air cùl do mholadh. Chan fheumar mìneachadh dè a th’ ann an singleton ma tha thu eòlach air a’ phàtran agus an t-ainm a th’ air.
Seòrsachadh phàtranan dealbhaidh
Tha pàtrain dealbhaidh eadar-dhealaichte ann an iom-fhillteachd, ìre mion-fhiosrachaidh, agus meud iomchaidheachd air feadh an t-siostam dealbhaichte.
Le samhlachadh, is urrainn dhuinn eadar-ghearradh a dhèanamh nas sàbhailte le bhith a’ stàladh beagan sholais trafaic no a’ togail iomlaid ioma-ìre gu lèir le trannsaichean fon talamh airson luchd-coiseachd.
Canar gu tric na modailean as bunaitiche, ìre ìosal gnàthasan-cainnte . Mar as trice chan eil iad a’ buntainn ach ri aon chànan prògramaidh.
Is e na modailean as cruinne agus àrd-ìre modailean ailtireachd . Faodaidh luchd-leasachaidh na pàtrain sin a chuir an gnìomh ann an cha mhòr cànan sam bith. Eu-coltach ri pàtrain eile, faodar an cleachdadh gus ailtireachd tagradh slàn a dhealbhadh.
A bharrachd air an sin, faodar a h-uile modal a sheòrsachadh a rèir an cuid dh ’fheuch no adhbhar. Is iad na trì prìomh chlasaichean:
- Modailean cruthachail bidh iad a’ toirt seachad dòighean cruthachaidh stuthan a mheudaicheas sùbailteachd agus ath-chleachdadh a’ chòd a th’ ann mar-thà.
- Modailean structarail bidh iad a’ mìneachadh mar a chruinnicheas iad nithean agus clasaichean gu structaran nas motha, a’ cumail nan structaran sin sùbailte agus èifeachdach.
- Modailean giùlain bidh iad a’ dèiligeadh ri conaltradh èifeachdach agus sònrachadh dhleastanasan eadar nithean.
Eisimpleir de phàtran dealbhaidh ann an Laravel: Facade
aodann na phàtran dealbhaidh structarail a bheir seachad eadar-aghaidh nas sìmplidhe do leabharlann, frèam, no seata chlasaichean iom-fhillte sam bith eile.
Duilgheadas
Gabhamaid ris gum feum sinn toirt air bathar-bog obrachadh, stèidhichte air seata mòr de nithean a bhuineas do leabharlann no frèam sòlaimte. Mar as trice, dh'fheumadh sinn na nithean sin uile a thòiseachadh, sùil a chumail air eisimeileachd, dòighean a chur an gnìomh san òrdugh cheart, agus mar sin air adhart.
Mar thoradh air an sin, bhiodh loidsig gnìomhachais nan clasaichean ceangailte gu teann ri mion-fhiosrachadh buileachaidh chlasaichean treas-phàrtaidh, gan dèanamh duilich a thuigsinn agus a riaghladh.
Fuasgladh
Una facade
na chlas a bheir seachad eadar-aghaidh sìmplidh gu fo-shiostam iom-fhillte anns a bheil mòran phàirtean gluasadach. A facade
faodaidh iad comas-gnìomh cuibhrichte a thoirt seachad an taca ri bhith ag obair gu dìreach leis an fho-shiostam. Ach, chan eil e a’ toirt a-steach ach na feartan a tha fìor dha-rìribh do luchd-ceannach.
Tha aon agad facade
tha e feumail nuair a dh’ fheumas sinn an aplacaid fhilleadh a-steach le leabharlann sòlaimte anns a bheil dusanan de fheartan, ach chan fheum sinn ach pàirt bheag den ghnìomhachd aige.
Mar eisimpleir, dh’ fhaodadh aplacaid a luchdaicheas suas bhideothan goirid èibhinn le cait gu na meadhanan sòisealta leabharlann tionndaidh bhidio proifeasanta a chleachdadh. Ach, chan eil againn ach clas leis an aon dòigh encode(filename, format)
. Às deidh a leithid de chlas a chruthachadh agus a cheangal ris an leabharlann tionndadh bhidio, bidh a’ chiad fhear againn facade
.
Mar eisimpleir, tha gnìomhaiche fòn ionad gairm mar a facade
. Gu dearbh, nuair a chuireas sinn fios gu seirbheis fòn stòr gus òrdugh fòn a chuir a-steach, is ann leinn fhìn a tha gnìomhaiche facade
a dh’ ionnsaigh a h-uile seirbheis agus roinn den bhùth. Bidh an gnìomhaiche a’ toirt seachad eadar-aghaidh guth sìmplidh don t-siostam òrdachaidh, geataichean pàighidh agus diofar sheirbheisean lìbhrigidh.
Eisimpleir fìor ann am PHP
Smaoinich air aodann mar inneal-atharrachaidh sìmplidh airson cuid de fo-shiostaman iom-fhillte. Facade
a’ dealachadh iom-fhillteachd taobh a-staigh aon chlas agus a’ leigeil le còd tagraidh eile an eadar-aghaidh sìmplidh a chleachdadh.
Anns an eisimpleir seo, Facade
a’ falach iom-fhillteachd leabharlann YouTube API agus FFmpeg bhon chòd teachdaiche. An àite a bhith ag obair le dusanan de chlasaichean, an neach-dèiligidh a 'cleachdadh modh sìmplidh air 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