Чланци

Шта су обрасци дизајна: зашто их користити, класификација, предности и мане

У софтверском инжењерству, обрасци дизајна су оптимална решења за проблеме који се обично јављају у дизајну софтвера.

Они су као пред пројектиdefiбезброј, испробаних и тестираних алата које можете прилагодити да бисте решили проблем дизајна који се понавља у вашем коду.

Предвиђено време читања: 6 минута

Шта је образац дизајна

Образац дизајна није код који можемо да копирамо и убацимо у наш програм, као што то можемо да урадимо са стандардним функцијама или библиотекама. Образац дизајна је општи концепт који може да реши одређени проблем. У основи модел чије детаље можемо пратити и имплементирати решење које одговара реалности нашег програма.

Модели се често мешају са алгоритмима, јер оба концепта описују типична решења неких познатих проблема. Док је алгоритам defiАко увек постоји јасан скуп акција којима се може постићи одређени циљ, модел је опис решења вишег нивоа. Код из истог модела примењен на два различита програма може бити различит.

Желећи да направимо аналогију, можемо смислити рецепт за кување: оба имају јасне кораке за постизање циља. Међутим, модел више личи на пројекат чији се резултат и карактеристике могу видети, али тачан редослед имплементације зависи од нас који пишемо код.

Од чега је направљен шаблон дизајна?

Већина образаца је описана веома формално тако да људи могу да их репродукују у многим контекстима. Погледајмо у наставку елементе који су присутни у опису модела:

  • Намера модела укратко описује и проблем и решење.
  • Мотивација даље објашњава проблем и решење које модел омогућава.
  • Ла струттура класе приказује сваки део модела и како су они повезани.
  • Пример кода на једном од најпопуларнијих програмских језика олакшава разумевање идеје иза модела.

Зашто их користити?

Програмер може развити софтвер без знања о постојању образаца дизајна. Многи то раде и из тог разлога спроводе неке шеме а да то не знају. Али зашто бисмо онда трошили време на њихово учење?

  • Дизајнерски обрасци су комплет испробана и тестирана решења на уобичајене проблеме у дизајну софтвера. Чак и ако никада не наиђете на ове проблеме, познавање образаца је и даље корисно јер вас учи како да решите све врсте проблема користећи принципе објектно оријентисаног дизајна.
  • Дизајнерски модели defiОни стварају заједнички језик који ви и ваш тим можете користити за ефикаснију комуникацију. Могли бисте рећи: „Ох, само користите Синглетон да урадите ово“, и сви ће разумети идеју која стоји иза вашег предлога. Нема потребе да објашњавате шта је синглетон ако знате образац и његово име.

Класификација образаца дизајна

Дизајнерски обрасци се разликују по сложености, нивоу детаља и скали применљивости кроз пројектовани систем.

По аналогији, раскрсницу можемо учинити безбеднијом тако што ћемо поставити неколико семафора или изградити читаву вишеслојну петљу са подземним пролазима за пешаке.

Често се називају најосновнији модели ниског нивоа идиоми . Обично се примењују само на један програмски језик.

Најуниверзалнији и врхунски модели су архитектонски модели . Програмери могу имплементирати ове обрасце на практично било који језик. За разлику од других образаца, они се могу користити за дизајнирање архитектуре целе апликације.

Штавише, сви модели се могу класификовати према њиховој Покушали или сврха. Три главне класе су:

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.
  • Креативни модели обезбеђују механизме за креирање објеката који повећавају флексибилност и поновну употребу постојећег кода.
  • Структурни модели они објашњавају како саставити објекте и класе у веће структуре, одржавајући ове структуре флексибилним и ефикасним.
  • Модели понашања баве се ефикасном комуникацијом и додељивањем одговорности између објеката.

Пример узорка дизајна у Ларавел-у: Фасада

Фацаде је структурални образац дизајна који обезбеђује поједностављени интерфејс за библиотеку, оквир или било који други сложен скуп класа.

Проблем

Претпоставимо да треба да учинимо да софтвер функционише на основу великог скупа објеката који припадају софистицираној библиотеци или оквиру. Обично бисмо морали да иницијализујемо све ове објекте, да пратимо зависности, извршимо методе у исправном редоследу, итд.

Као резултат тога, пословна логика класа би постала тесно повезана са детаљима имплементације класа трећих страна, што би их чинило тешким за разумевање и управљање.

Решење

А facade је класа која пружа једноставан интерфејс за сложени подсистем који садржи много покретних делова. А facade може пружити ограничену функционалност у поређењу са директним радом са подсистемом. Међутим, укључује само оне карактеристике до којих је купцима заиста стало.

Има један facade корисно је када треба да интегришемо апликацију са софистицираном библиотеком која има десетине функција, али нам је потребан само мали део њене функционалности.

На пример, апликација која поставља кратке смешне видео записе са мачкама на друштвене мреже потенцијално би могла да користи професионалну библиотеку за конверзију видео записа. Међутим, све што нам је заиста потребно је класа са једним методом encode(filename, format). Након што креирамо такву класу и повежемо је са библиотеком за конверзију видео записа, имаћемо прву facade.

На пример, телефонски оператер кол центра је као а facade. У ствари, када позовемо телефонску службу продавнице да наручимо телефоном, оператер је наш facade према свим службама и одељењима продавнице. Оператер обезбеђује једноставан гласовни интерфејс за систем наручивања, платне пролазе и разне услуге доставе.

Прави пример у ПХП-у

Размисли о Фацаде као једноставан адаптер за неке сложене подсистеме. Facade изолује сложеност унутар једне класе и дозвољава другом коду апликације да користи једноставан интерфејс.

У овом примеру, 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

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Недавни чланци

Вееам има најсвеобухватнију подршку за рансомваре, од заштите до одговора и опоравка

Цовеваре од Вееам-а ће наставити да пружа услуге одговора на инциденте са сајбер изнудом. Цовеваре ће понудити форензику и могућности санације…

КСНУМКС април КСНУМКС

Зелена и дигитална револуција: Како предиктивно одржавање трансформише индустрију нафте и гаса

Предиктивно одржавање револуционише сектор нафте и гаса, са иновативним и проактивним приступом управљању постројењима.…

КСНУМКС април КСНУМКС

Британски антимонополски регулатор подигао је БигТецх аларм због ГенАИ

УК ЦМА је издао упозорење о понашању Биг Тецх-а на тржишту вештачке интелигенције. Тамо…

КСНУМКС април КСНУМКС

Цаса Греен: енергетска револуција за одрживу будућност у Италији

Уредба „Цасе Греен“, коју је формулисала Европска унија за побољшање енергетске ефикасности зграда, завршила је свој законодавни процес са…

КСНУМКС април КСНУМКС

Прочитајте Иновације на свом језику

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Пратите нас