Артыкулы

Што такое шаблоны праектавання: навошта іх выкарыстоўваць, класіфікацыя, плюсы і мінусы

У распрацоўцы праграмнага забеспячэння шаблоны праектавання з'яўляюцца аптымальным рашэннем праблем, якія звычайна ўзнікаюць пры распрацоўцы праграмнага забеспячэння.

Яны як папярэднія праектыdefiнаканечныя правераныя інструменты, якія вы можаце наладзіць для вырашэння перыядычных праблем дызайну ў вашым кодзе.

Разліковы час чытання: 6 хвілін

Што такое шаблон дызайну

Шаблон праектавання - гэта не код, які мы можам скапіяваць і ўставіць у нашу праграму, як мы можам зрабіць са стандартнымі функцыямі або бібліятэкамі. Шаблон праектавання - гэта агульная канцэпцыя, здольная вырашыць пэўную задачу. У асноўным мадэль, дэталі якой мы можам прытрымлівацца і рэалізаваць рашэнне, якое адпавядае рэальнасці нашай праграмы.

Мадэлі часта блытаюць з алгарытмамі, таму што абедзве канцэпцыі апісваюць тыповыя рашэнні некаторых вядомых праблем. Пакуль алгарытм defiКалі заўсёды ёсць дакладны набор дзеянняў, якія могуць дасягнуць пэўнай мэты, мадэль - гэта апісанне рашэння больш высокага ўзроўню. Код адной мадэлі, ужыты да дзвюх розных праграм, можа адрознівацца.

Жадаючы правесці аналогію, можна ўспомніць рэцэпт прыгатавання: у абодвух ёсць дакладныя крокі да дасягнення мэты. Аднак мадэль больш падобная на праект, вынік і характарыстыкі якога можна ўбачыць, але дакладны парадак рэалізацыі залежыць ад нас, хто піша код.

З чаго зроблены шаблон дызайну?

Большасць шаблонаў апісаны вельмі фармальна, каб людзі маглі прайграць іх у розных кантэкстах. Давайце паглядзім ніжэй элементы, якія прысутнічаюць у апісанні мадэлі:

  • Намер мадэлі коратка апісвае праблему і рашэнне.
  • Матывацыя дадаткова тлумачыць праблему і рашэнне, якое робіць магчымай мадэль.
  • Структура класаў паказвае кожную частку мадэлі і тое, як яны звязаны.
  • Прыклад кода на адной з самых папулярных моў праграмавання палягчае разуменне ідэі мадэлі.

Навошта іх выкарыстоўваць?

Праграміст можа распрацоўваць праграмнае забеспячэнне, не ведаючы пра існаванне шаблонаў праектавання. Многія так і робяць, і таму самі таго не ведаючы рэалізуюць нейкія схемы. Але чаму тады мы павінны марнаваць час на іх вывучэнне?

  • Выкрайкі дызайну ўяўляюць сабой камплект апрабаваныя рашэнні агульныя праблемы ў распрацоўцы праграмнага забеспячэння. Нават калі вы ніколі не сутыкаецеся з гэтымі праблемамі, веданне шаблонаў усё роўна карысна, таму што яно навучыць вас вырашаць разнастайныя праблемы з выкарыстаннем прынцыпаў аб'ектна-арыентаванага праектавання.
  • Дызайнерскія мадэлі defiЯны ствараюць агульную мову, якую вы і ваша каманда можаце выкарыстоўваць для больш эфектыўнага зносін. Вы можаце сказаць: «О, проста выкарыстоўвайце Singleton, каб зрабіць гэта», і кожны зразумее ідэю вашай прапановы. Няма неабходнасці тлумачыць, што такое сінглтон, калі вы ведаеце шаблон і яго назву.

Класіфікацыя шаблонаў праектавання

Патэрны праектавання адрозніваюцца складанасцю, узроўнем дэталізацыі і маштабам дастасавальнасці ў распрацаванай сістэме.

Па аналогіі можна зрабіць скрыжаванне больш бяспечным, усталяваўшы некалькі святлафораў або пабудаваўшы цэлую шматузроўневую развязку з падземнымі пераходамі для пешаходаў.

Самымі базавымі часта называюць нізкаўзроўневыя мадэлі ідыёмы . Звычайна яны прымяняюцца толькі да адной мовы праграмавання.

Найбольш універсальнымі і высокага ўзроўню з'яўляюцца мадэлі архітэктурныя мадэлі . Распрацоўшчыкі могуць рэалізаваць гэтыя шаблоны практычна на любой мове. У адрозненне ад іншых шаблонаў, іх можна выкарыстоўваць для распрацоўкі архітэктуры ўсяго прыкладання.

Акрамя таго, усе мадэлі можна класіфікаваць па іх паспрабаваў або мэта. Тры асноўныя класы:

Інавацыйны бюлетэнь
Не прапусціце самыя важныя навіны пра інавацыі. Падпішыцеся, каб атрымліваць іх па электроннай пошце.
  • Творчыя мадэлі яны забяспечваюць механізмы стварэння аб'ектаў, якія павялічваюць гнуткасць і паўторнае выкарыстанне існуючага кода.
  • Структурныя мадэлі яны тлумачаць, як сабраць аб'екты і класы ў больш буйныя структуры, захоўваючы гэтыя структуры гнуткімі і эфектыўнымі.
  • Паводніцкія мадэлі яны займаюцца эфектыўнай камунікацыяй і размеркаваннем абавязкаў паміж аб'ектамі.

Прыклад шаблону дызайну ў Laravel: Фасад

Фасад гэта структурны шаблон праектавання, які забяспечвае спрошчаны інтэрфейс для бібліятэкі, структуры або любога іншага складанага набору класаў.

праблема

Давайце выкажам здагадку, што нам трэба прымусіць праграмнае забеспячэнне працаваць на аснове вялікага набору аб'ектаў, якія належаць складанай бібліятэцы або фрэймворку. Звычайна нам трэба будзе ініцыялізаваць усе гэтыя аб'екты, сачыць за залежнасцямі, выконваць метады ў правільным парадку і гэтак далей.

У выніку бізнес-логіка класаў будзе цесна звязана з дэталямі рэалізацыі класаў іншых вытворцаў, што робіць іх цяжкімі для разумення і кіравання.

Рашэнне

Una facade гэта клас, які забяспечвае просты інтэрфейс для складанай падсістэмы, якая змяшчае мноства рухомых частак. А facade можа забяспечваць абмежаваную функцыянальнасць у параўнанні з непасрэднай працай з падсістэмай. Аднак ён уключае толькі тыя функцыі, якія сапраўды важныя для кліентаў.

Ёсць адзін facade гэта карысна, калі нам трэба інтэграваць прыкладанне са складанай бібліятэкай, якая мае дзесяткі функцый, але нам патрэбна толькі невялікая частка яго функцыянальнасці.

Напрыклад, праграма, якая загружае ў сацыяльныя сеткі кароткія смешныя відэаролікі з выявай катоў, патэнцыйна можа выкарыстоўваць прафесійную бібліятэку пераўтварэння відэа. Аднак усё, што нам сапраўды трэба, гэта клас з адзіным метадам encode(filename, format). Пасля стварэння такога класа і падключэння яго да бібліятэкі пераўтварэння відэа ў нас будзе наш першы facade.

Напрыклад, тэлефаніст колл-цэнтра падобны на а facade. Фактычна, калі мы тэлефануем у тэлефонную службу крамы, каб зрабіць заказ па тэлефоне, аператар - гэта наш facade да ўсіх службаў і аддзелаў крамы. Аператар прадастаўляе просты галасавы інтэрфейс для сістэмы заказаў, плацежных шлюзаў і розных службаў дастаўкі.

Рэальны прыклад у PHP

Думаць аб Фасад як просты адаптар для некаторых складаных падсістэм. Facade ізалюе складанасць у адным класе і дазваляе іншаму коду прыкладання выкарыстоўваць просты інтэрфейс.

У гэтым прыкладзе Facade хавае складанасць API YouTube і бібліятэкі FFmpeg ад кліенцкага кода. Замест таго, каб працаваць з дзесяткамі класаў, кліент выкарыстоўвае просты метад на 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

Інавацыйны бюлетэнь
Не прапусціце самыя важныя навіны пра інавацыі. Падпішыцеся, каб атрымліваць іх па электроннай пошце.

Апошнія артыкулы

Будучыня тут: як індустрыя суднаходства рэвалюцыянізуе сусветную эканоміку

Ваенна-марскі сектар - гэта сапраўдная глабальная эканамічная сіла, якая перайшла да 150-мільярднага рынку...

1 мая 2024

Выдаўцы і OpenAI падпісваюць пагадненні аб рэгуляванні патоку інфармацыі, апрацаванай штучным інтэлектам

У мінулы панядзелак Financial Times абвясціла аб здзелцы з OpenAI. FT ліцэнзуе сваю журналістыку сусветнага ўзроўню...

Красавік 30 2024

Інтэрнэт-плацяжы: вось як паслугі струменевай перадачы прымушаюць вас плаціць вечна

Мільёны людзей плацяць за струменевыя паслугі, плацячы штомесячную абаненцкую плату. Распаўсюджана меркаванне, што вы…

Красавік 29 2024

Veeam прапануе самую поўную падтрымку праграм-вымагальнікаў - ад абароны да адказу і аднаўлення

Coveware ад Veeam працягне прадастаўляць паслугі рэагавання на інцыдэнты кібервымагальніцтва. Coveware будзе прапаноўваць судова-медыцынскую экспертызу і магчымасці выпраўлення…

Красавік 23 2024

Чытайце Innovation на сваёй мове

Інавацыйны бюлетэнь
Не прапусціце самыя важныя навіны пра інавацыі. Падпішыцеся, каб атрымліваць іх па электроннай пошце.

Выконвайце за намі