Dè a th’ ann am pàtrain dealbhaidh: carson a thathas gan cleachdadh, seòrsachadh, buannachdan agus eas-bhuannachdan

pàtran dealbhaidh

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.

pàtran dealbhadh facade
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

Autore