raksti

Kas ir dizaina modeļi: kāpēc tos izmantot, klasifikācija, plusi un mīnusi

Programmatūras inženierijā dizaina modeļi ir optimāli risinājumi problēmām, kas parasti rodas programmatūras projektēšanā.

Tie ir kā pirmprojektidefinite, izmēģināti un pārbaudīti rīki, kurus varat pielāgot, lai atrisinātu atkārtotu dizaina problēmu savā kodā.

Paredzamais lasīšanas laiks: 6 minūti

Kas ir dizaina modelis

Dizaina modelis nav kods, ko mēs varam kopēt un ievietot savā programmā, kā to varam darīt ar standarta funkcijām vai bibliotēkām. Dizaina modelis ir vispārējs jēdziens, kas spēj atrisināt noteiktu problēmu. Būtībā modelis, kura detaļām mēs varam sekot līdzi un ieviest risinājumu, kas atbilst mūsu programmas realitātei.

Modeļi bieži tiek sajaukti ar algoritmiem, jo ​​abi jēdzieni apraksta tipiskus dažu zināmu problēmu risinājumus. Kaut arī algoritms defiJa vienmēr ir skaidrs darbību kopums, ar ko var sasniegt noteiktu mērķi, modelis ir augstāka līmeņa risinājuma apraksts. Viena un tā paša modeļa kods, kas lietots divām dažādām programmām, var atšķirties.

Vēloties veikt analoģiju, mēs varam iedomāties ēdiena gatavošanas recepti: abiem ir skaidri soļi mērķa sasniegšanai. Taču modelis ir vairāk kā projekts, no kura var redzēt, kāds ir rezultāts un tā īpašības, bet precīza ieviešanas secība ir atkarīga no mums, kas raksta kodu.

No kā sastāv dizaina raksts?

Lielākā daļa modeļu ir aprakstīti ļoti formāli, lai cilvēki varētu tos reproducēt daudzos kontekstos. Tālāk apskatīsim elementus, kas ir modeļa aprakstā:

  • Nolūks no modeļa īsi apraksta gan problēmu, gan risinājumu.
  • Motivācija sīkāk izskaidro problēmu un risinājumu, ko modelis padara iespējamu.
  • Struktūra no klasēm parāda katru modeļa daļu un to saistību.
  • Koda piemērs vienā no populārākajām programmēšanas valodām ļauj vieglāk saprast modeļa ideju.

Kāpēc tos izmantot?

Programmētājs var izstrādāt programmatūru, nezinot par dizaina modeļu esamību. Daudzi to dara, un šī iemesla dēļ viņi īsteno dažas shēmas, to nezinot. Bet kāpēc tad mums vajadzētu tērēt laiku to apguvei?

  • Dizaina modeļi ir komplekts no pārbaudīti risinājumi izplatītām problēmām programmatūras projektēšanā. Pat ja jūs nekad nesaskarsities ar šīm problēmām, modeļu pārzināšana joprojām ir noderīga, jo tā iemāca atrisināt visa veida problēmas, izmantojot objektorientētas dizaina principus.
  • Dizaina modeļi defiTie veido kopīgu valodu, ko jūs un jūsu komanda varat izmantot, lai sazinātos efektīvāk. Jūs varētu teikt: "Ak, vienkārši izmantojiet Singleton, lai to izdarītu", un visi sapratīs jūsu ieteikuma ideju. Nav nepieciešams paskaidrot, kas ir vienvietīgs, ja zināt modeli un tā nosaukumu.

Dizaina modeļu klasifikācija

Dizaina modeļi atšķiras pēc sarežģītības, detalizācijas līmeņa un pielietojamības mēroga visā projektētajā sistēmā.

Pēc analoģijas mēs varam padarīt krustojumu drošāku, uzstādot dažus luksoforus vai izbūvējot visu daudzlīmeņu krustojumu ar pazemes ejām gājējiem.

Bieži tiek saukti visvienkāršākie, zema līmeņa modeļi idiomas . Tie parasti attiecas tikai uz vienu programmēšanas valodu.

Universālākie un augstākā līmeņa modeļi ir arhitektūras modeļi . Izstrādātāji var ieviest šos modeļus praktiski jebkurā valodā. Atšķirībā no citiem modeļiem, tos var izmantot, lai izstrādātu visas lietojumprogrammas arhitektūru.

Turklāt visus modeļus var klasificēt pēc to mēģinājusi vai mērķis. Trīs galvenās klases ir:

Inovāciju biļetens
Nepalaidiet garām svarīgākās ziņas par jauninājumiem. Reģistrējieties, lai tos saņemtu pa e-pastu.
  • Radošie modeļi tie nodrošina objektu izveides mehānismus, kas palielina elastību un esošā koda atkārtotu izmantošanu.
  • Strukturālie modeļi viņi izskaidro, kā objektus un klases montēt lielākās struktūrās, saglabājot šīs struktūras elastīgas un efektīvas.
  • Uzvedības modeļi tie nodarbojas ar efektīvu komunikāciju un pienākumu sadali starp objektiem.

Laravel dizaina modeļa piemērs: fasāde

Fasāde ir struktūras dizaina modelis, kas nodrošina vienkāršotu saskarni bibliotēkai, ietvaram vai jebkurai citai sarežģītai klašu kopai.

problēma

Pieņemsim, ka mums ir jāpanāk programmatūras darbība, pamatojoties uz lielu objektu kopu, kas pieder sarežģītai bibliotēkai vai sistēmai. Parasti mums būtu jāinicializē visi šie objekti, jāseko līdzi atkarībām, jāizpilda metodes pareizā secībā un tā tālāk.

Tā rezultātā nodarbību biznesa loģika būtu cieši saistīta ar trešo pušu nodarbību ieviešanas detaļām, padarot tās grūti saprotamas un pārvaldāmas.

Risinājums

A facade ir klase, kas nodrošina vienkāršu saskarni sarežģītai apakšsistēmai, kurā ir daudz kustīgu daļu. A facade var nodrošināt ierobežotu funkcionalitāti salīdzinājumā ar tiešu darbu ar apakšsistēmu. Tomēr tas ietver tikai tās funkcijas, kas klientiem patiešām rūp.

Ir viens facade tas ir noderīgi, ja mums ir jāintegrē lietotne ar izsmalcinātu bibliotēku, kurā ir desmitiem funkciju, taču mums ir nepieciešama tikai neliela daļa no tās funkcionalitātes.

Piemēram, lietotne, kas sociālajos saziņas līdzekļos augšupielādē īsus smieklīgus videoklipus ar kaķiem, varētu izmantot profesionālu video konvertēšanas bibliotēku. Tomēr viss, kas mums patiešām nepieciešams, ir klase ar vienu metodi encode(filename, format). Pēc šādas klases izveidošanas un pievienošanas video konvertēšanas bibliotēkai mums būs pirmā facade.

Piemēram, zvanu centra telefona operators ir kā a facade. Faktiski, kad mēs zvanām veikala telefona dienestam, lai veiktu tālruņa pasūtījumu, operators ir mūsu facade attiecībā uz visiem veikala pakalpojumiem un nodaļām. Operators nodrošina vienkāršu balss interfeisu pasūtīšanas sistēmai, maksājumu vārtejām un dažādiem piegādes pakalpojumiem.

Reāls piemērs PHP

Domāt par Fasāde kā vienkāršs adapteris dažām sarežģītām apakšsistēmām. Facade izolē sarežģītību vienā klasē un ļauj citam lietojumprogrammas kodam izmantot vienkāršo saskarni.

Šajā piemērā Facade slēpj YouTube API un FFmpeg bibliotēkas sarežģītību no klienta koda. Tā vietā, lai strādātu ar desmitiem nodarbību, klients izmanto vienkāršu metodi Fasādē.

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

Inovāciju biļetens
Nepalaidiet garām svarīgākās ziņas par jauninājumiem. Reģistrējieties, lai tos saņemtu pa e-pastu.

Jaunākie Raksti

Veeam piedāvā visplašāko atbalstu izspiedējvīrusu programmatūrai, sākot no aizsardzības līdz atbildei un atkopšanai

Veeam Coveware turpinās nodrošināt reaģēšanas pakalpojumus uz kiberizspiešanas incidentiem. Coveware piedāvās kriminālistikas un sanācijas iespējas…

23 aprīlis 2024

Zaļā un digitālā revolūcija: kā paredzamā apkope pārveido naftas un gāzes nozari

Prognozējošā apkope rada revolūciju naftas un gāzes nozarē, izmantojot novatorisku un proaktīvu pieeju rūpnīcu pārvaldībai.…

22 aprīlis 2024

Apvienotās Karalistes pretmonopola regulators ceļ BigTech trauksmi saistībā ar GenAI

Apvienotās Karalistes CMA ir izteikusi brīdinājumu par Big Tech uzvedību mākslīgā intelekta tirgū. Tur…

18 aprīlis 2024

Casa Green: enerģētikas revolūcija ilgtspējīgai nākotnei Itālijā

Eiropas Savienības izstrādātais dekrēts "Zaļās mājas", lai uzlabotu ēku energoefektivitāti, ir noslēdzis savu likumdošanas procesu ar…

18 aprīlis 2024