Artikoli

X'inhuma l-mudelli tad-disinn: għaliex tużahom, klassifikazzjoni, vantaġġi u liżvantaġġi

Fl-inġinerija tas-softwer, il-mudelli tad-disinn huma l-aħjar soluzzjonijiet għall-problemi li jseħħu b'mod komuni fid-disinn tas-softwer.

Huma bħal proġetti ta 'qabeldefiGħodod nite, ippruvati u ttestjati li tista 'tippersonalizza biex issolvi problema rikorrenti tad-disinn fil-kodiċi tiegħek.

Ħin tal-qari stmat: 6 minuta

X'inhu Mudell tad-Disinn

Mudell tad-disinn mhuwiex kodiċi li nistgħu nikkopjah u ndaħħal fil-programm tagħna, kif nistgħu nagħmlu b'funzjonijiet jew libreriji standard. Il-mudell tad-disinn huwa kunċett ġenerali li kapaċi jsolvi problema partikolari. Bażikament mudell li d-dettalji tiegħu nistgħu nsegwu u nimplimentaw soluzzjoni li taqbel mar-realtà tal-programm tagħna.

Mudelli ħafna drabi huma konfużi ma 'algoritmi, għaliex iż-żewġ kunċetti jiddeskrivu soluzzjonijiet tipiċi għal xi problemi magħrufa. Filwaqt li algoritmu defiJekk dejjem ikun hemm sett ċar ta 'azzjonijiet li jistgħu jiksbu ċertu għan, mudell huwa deskrizzjoni ta' livell ogħla ta 'soluzzjoni. Kodiċi mill-istess mudell applikat għal żewġ programmi differenti jistgħu jkunu differenti.

Billi rridu nagħmlu analoġija, nistgħu naħsbu f'riċetta tat-tisjir: it-tnejn għandhom passi ċari biex jilħqu għan. Madankollu, mudell huwa aktar bħal proġett, li minnu tista 'tara x'inhuma r-riżultat u l-karatteristiċi tiegħu, iżda l-ordni eżatta tal-implimentazzjoni tiddependi minna li niktbu l-kodiċi.

Minn xiex huwa magħmul Mudell tad-Disinn?

Ħafna mudelli huma deskritti formalment ħafna sabiex in-nies ikunu jistgħu jirriproduċuhom f'ħafna kuntesti. Ejja naraw hawn taħt l-elementi li huma preżenti fid-deskrizzjoni ta 'mudell:

  • L-intenzjoni tal-mudell jiddeskrivi fil-qosor kemm il-problema kif ukoll is-soluzzjoni.
  • Il-motivazzjoni jispjega aktar il-problema u s-soluzzjoni li l-mudell jagħmel possibbli.
  • Struttura tal-klassijiet juri kull parti tal-mudell u kif huma relatati.
  • L-eżempju tal-kodiċi f'waħda mill-lingwi ta 'programmar l-aktar popolari tagħmilha aktar faċli li wieħed jifhem l-idea wara l-mudell.

Għaliex tużahom?

Programmatur jista 'jiżviluppa softwer mingħajr ma jkun jaf l-eżistenza ta' mudelli tad-disinn. Ħafna jagħmlu, u għal din ir-raġuni jimplimentaw xi skemi mingħajr ma jkunu jafu. Imma allura għala għandna nqattgħu ħin nitgħallmuhom?

  • Il-mudelli tad-disinn huma kit ta ' soluzzjonijiet ippruvati u ttestjati għal problemi komuni fid-disinn tas-softwer. Anke jekk qatt ma tiltaqa 'ma' dawn il-problemi, l-għarfien tal-mudelli għadu utli għaliex jgħallem kif issolvi kull tip ta 'problemi billi tuża prinċipji ta' disinn orjentat lejn l-oġġetti.
  • Il-mudelli tad-disinn defiHuma joħolqu lingwa komuni li inti u t-tim tiegħek tista 'tuża biex tikkomunika b'mod aktar effettiv. Tista 'tgħid, "Oh, uża Singleton biex tagħmel dan," u kulħadd jifhem l-idea wara s-suġġeriment tiegħek. M'hemmx għalfejn tispjega x'inhu singleton jekk taf il-mudell u l-isem tiegħu.

Klassifikazzjoni ta' Disinn ta' Disinn

Il-mudelli tad-disinn ivarjaw fil-kumplessità, fil-livell ta 'dettall, u fl-iskala ta' applikabilità matul is-sistema ddisinjata.

B'analoġija, nistgħu nagħmlu intersezzjoni aktar sigura billi ninstallaw ftit dwal tat-traffiku jew nibnu skambju sħiħ f'diversi livelli b'passaġġi taħt l-art għall-pedestrians.

L-aktar mudelli bażiċi, ta 'livell baxx ħafna drabi jissejħu idjomi . Normalment japplikaw biss għal lingwa ta' programmar waħda.

L-aktar mudelli universali u ta 'livell għoli huma mudelli arkitettoniċi . L-iżviluppaturi jistgħu jimplimentaw dawn il-mudelli prattikament fi kwalunkwe lingwa. B'differenza mudelli oħra, jistgħu jintużaw biex tiddisinja l-arkitettura ta 'applikazzjoni sħiħa.

Barra minn hekk, il-mudelli kollha jistgħu jiġu kklassifikati skond tagħhom ippruvat jew għan. It-tliet klassijiet ewlenin huma:

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.
  • Mudelli kreattivi jipprovdu mekkaniżmi ta' ħolqien ta' oġġetti li jżidu l-flessibbiltà u l-użu mill-ġdid tal-kodiċi eżistenti.
  • Mudelli strutturali jispjegaw kif jiġbru oġġetti u klassijiet fi strutturi akbar, filwaqt li jżommu dawn l-istrutturi flessibbli u effiċjenti.
  • Mudelli ta' mġiba jittrattaw komunikazzjoni effettiva u assenjazzjoni tar-responsabbiltajiet bejn l-oġġetti.

Eżempju ta 'Disinn Pattern f'Laravel: Faċċata

Faċċata huwa mudell ta 'disinn strutturali li jipprovdi interface simplifikata għal librerija, qafas, jew kwalunkwe sett kumpless ieħor ta' klassijiet.

Problema

Ejja nassumu li rridu nagħmlu xogħol ta' softwer, ibbażat fuq sett kbir ta' oġġetti li jappartjenu għal librerija jew qafas sofistikat. Normalment, ikollna bżonn ninizjalizzaw dawn l-oġġetti kollha, inżommu rekord tad-dipendenzi, inwettqu metodi fl-ordni korretta, eċċ.

Bħala riżultat, il-loġika tan-negozju tal-klassijiet tkun akkoppjata sewwa mad-dettalji tal-implimentazzjoni ta 'klassijiet ta' partijiet terzi, u tagħmilhom diffiċli biex jifhmu u jimmaniġġjaw.

Soluzzjoni

a facade hija klassi li tipprovdi interface sempliċi għal sottosistema kumplessa li fiha ħafna partijiet li jiċċaqilqu. A facade jista' jipprovdi funzjonalità limitata meta mqabbel ma' xogħol dirett mas-subsistema. Madankollu, tinkludi biss il-karatteristiċi li l-klijenti verament jimpurtahom.

Għandek waħda facade huwa utli meta għandna bżonn nintegraw l-app ma 'librerija sofistikata li għandha għexieren ta' karatteristiċi, iżda għandna bżonn biss parti żgħira tal-funzjonalità tagħha.

Pereżempju, app li ttella’ vidjows qosra umoristiċi bil-qtates fuq il-midja soċjali tista’ potenzjalment tuża librerija professjonali ta’ konverżjoni tal-vidjo. Madankollu, kulma neħtieġu huwa klassi bil-metodu uniku encode(filename, format). Wara li toħloq klassi bħal din u tgħaqqadha mal-librerija tal-konverżjoni tal-vidjo, se jkollna l-ewwel waħda tagħna facade.

Pereżempju, l-operatur tat-telefon ta’ call center huwa bħal a facade. Fil-fatt, meta nsejħu servizz tat-telefon ta’ ħanut biex nagħmlu ordni bit-telefon, operatur huwa tagħna facade lejn is-servizzi u d-dipartimenti kollha tal-maħżen. L-operatur jipprovdi interface tal-vuċi sempliċi għas-sistema tal-ordnijiet, gateways tal-ħlas u diversi servizzi ta 'kunsinna.

Eżempju reali fil-PHP

Aħseb dwar Faċċata bħala adapter sempliċi għal xi sottosistemi kumplessi. Facade jiżola l-kumplessità fi ħdan klassi waħda u jippermetti kodiċi ta 'applikazzjoni oħra li juża l-interface sempliċi.

F'dan l-eżempju, Facade jaħbi l-kumplessità tal-librerija YouTube API u FFmpeg mill-kodiċi tal-klijent. Minflok ma jaħdem ma 'għexieren ta' klassijiet, il-klijent juża metodu sempliċi fuq Faċċata.

<?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

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.

Artikoli riċenti

Veeam għandu l-aktar appoġġ komprensiv għar-ransomware, mill-protezzjoni għar-rispons u l-irkupru

Coveware minn Veeam se jkompli jipprovdi servizzi ta' rispons għal inċidenti ta' estorsjoni ċibernetika. Coveware se joffri forensiċi u kapaċitajiet ta' rimedju...

April 23 2024

Rivoluzzjoni Ekoloġika u Diġitali: Kif il-Manutenzjoni Predittiva qed tittrasforma l-Industrija taż-Żejt u l-Gass

Il-manutenzjoni ta’ tbassir qed tirrivoluzzjona s-settur taż-żejt u l-gass, b’approċċ innovattiv u proattiv għall-ġestjoni tal-impjant...

April 22 2024

Ir-regolatur tal-antitrust tar-Renju Unit iqajjem allarm ta’ BigTech fuq GenAI

Is-CMA tar-Renju Unit ħarġet twissija dwar l-imġieba ta 'Big Tech fis-suq tal-intelliġenza artifiċjali. Hemm…

April 18 2024

Casa Green: rivoluzzjoni tal-enerġija għal futur sostenibbli fl-Italja

Id-Digriet "Case Green", ifformulat mill-Unjoni Ewropea biex itejjeb l-effiċjenza enerġetika tal-bini, ikkonkluda l-proċess leġiżlattiv tiegħu bi...

April 18 2024