Artikuj

Cilat janë modelet e dizajnit: pse t'i përdorim ato, klasifikimi, të mirat dhe të këqijat

Në inxhinierinë e softuerit, modelet e projektimit janë zgjidhje optimale për problemet që ndodhin zakonisht në dizajnimin e softuerit.

Janë si para-projektedefinite, mjete të provuara dhe të testuara që mund t'i personalizoni për të zgjidhur një problem të përsëritur të dizajnit në kodin tuaj.

Koha e parashikuar e leximit: 6 minuti

Çfarë është një model dizajni

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.

Nga se përbëhet një model dizajni?

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:

  • Synimi i modelit përshkruan shkurtimisht si problemin ashtu edhe zgjidhjen.
  • Motivimi shpjegon më tej problemin dhe zgjidhjen që modeli bën të mundur.
  • Struktura e klasave tregon çdo pjesë të modelit dhe se si ato lidhen.
  • Shembulli i kodit në një nga gjuhët më të njohura të programimit e bën më të lehtë kuptimin e idesë që qëndron pas modelit.

Pse t'i përdorin ato?

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 dizajnit janë një komplet i zgjidhje të provuara dhe të testuara për problemet e zakonshme në dizajnimin e softuerit. Edhe nëse nuk i hasni kurrë këto probleme, njohja e modeleve është ende e dobishme sepse ju mëson se si të zgjidhni të gjitha llojet e problemeve duke përdorur parimet e projektimit të orientuar nga objekti.
  • Modelet e projektimit defiAta krijojnë një gjuhë të përbashkët që ju dhe ekipi juaj mund ta përdorni për të komunikuar në mënyrë më efektive. Ju mund të thoni, "Oh, thjesht përdorni një Singleton për ta bërë këtë", dhe të gjithë do ta kuptojnë idenë që qëndron pas sugjerimit tuaj. Nuk ka nevojë të shpjegohet se çfarë është beqarja nëse e dini modelin dhe emrin e tij.

Klasifikimi i modeleve të projektimit

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ë:

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.
  • Modele krijuese ato ofrojnë mekanizma të krijimit të objekteve që rrisin fleksibilitetin dhe ripërdorimin e kodit ekzistues.
  • Modelet strukturore ata shpjegojnë se si të mblidhen objektet dhe klasat në struktura më të mëdha, duke i mbajtur këto struktura fleksibël dhe efikase.
  • Modelet e sjelljes ato merren me komunikim efektiv dhe caktimin e përgjegjësive ndërmjet objekteve.

Shembull i modelit të dizajnit në Laravel: Fasada

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.

problem

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.

Zgjidhja

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.

Shembull i vërtetë në PHP

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

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.

Artikujt e fundit

Veeam përmban mbështetjen më të plotë për ransomware, nga mbrojtja te përgjigja dhe rikuperimi

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…

23 Prill 2024

Revolucioni i gjelbër dhe dixhital: Si mirëmbajtja parashikuese po transformon industrinë e naftës dhe gazit

Mirëmbajtja parashikuese po revolucionon sektorin e naftës dhe gazit, me një qasje inovative dhe proaktive për menaxhimin e impiantit.…

22 Prill 2024

Rregullatori antitrust në Mbretërinë e Bashkuar ngre alarmin e BigTech mbi GenAI

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…

18 Prill 2024

Casa Green: revolucion energjetik për një të ardhme të qëndrueshme në Itali

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…

18 Prill 2024