Артиколи

Дизайн үлгілері дегеніміз не: оларды не үшін пайдалану, жіктеу, оң және теріс жақтары

Бағдарламалық жасақтама инженериясында дизайн үлгілері бағдарламалық жасақтаманы жобалауда жиі кездесетін мәселелердің оңтайлы шешімі болып табылады.

Олар алдын ала жобалар сияқтыdefiкодыңыздағы қайталанатын дизайн мәселесін шешу үшін теңшеуге болатын сыналған және сыналған құралдар.

Болжалды оқу уақыты: 6 минуты

Дизайн үлгісі дегеніміз не

Дизайн үлгісі стандартты функциялармен немесе кітапханалармен жасай алатындай, біз көшіріп, бағдарламамызға кірістіретін код емес. Дизайн үлгісі - бұл белгілі бір мәселені шешуге қабілетті жалпы түсінік. Негізінде біз егжей-тегжейлерін қадағалай алатын және бағдарламамыздың шындығына сәйкес шешімді жүзеге асыра алатын модель.

Модельдер көбінесе алгоритмдермен шатастырылады, өйткені екі ұғым да кейбір белгілі есептердің типтік шешімдерін сипаттайды. Алгоритм болған кезде defiБелгілі бір мақсатқа жетуге болатын іс-әрекеттердің әрқашан нақты жиынтығы болса, модель шешімнің жоғары деңгейлі сипаттамасы болып табылады. Екі түрлі бағдарламаға қолданылатын бір үлгідегі код әртүрлі болуы мүмкін.

Аналогия жасағымыз келсе, біз пісіру рецептін ойлай аламыз: екеуінде де мақсатқа жету үшін нақты қадамдар бар. Дегенмен, модель жобаға көбірек ұқсайды, оның нәтижесі қандай екенін және оның сипаттамаларын көруге болады, бірақ нақты жүзеге асыру тәртібі кодты жазған бізге байланысты.

Дизайн үлгісі неден жасалған?

Көптеген үлгілер адамдар оларды көптеген контексттерде ойната алатындай етіп өте ресми түрде сипатталған. Төменде модель сипаттамасында бар элементтерді қарастырайық:

  • Ниет Модель проблеманы да, шешімін де қысқаша сипаттайды.
  • Мотивация модель мүмкін ететін мәселені және шешімін одан әрі түсіндіреді.
  • Құрылым сыныптар үлгінің әрбір бөлігін және олардың байланысын көрсетеді.
  • Код мысалы ең танымал бағдарламалау тілдерінің бірінде модельдің идеясын түсінуді жеңілдетеді.

Неліктен оларды пайдалану керек?

Бағдарламалаушы дизайн үлгілерінің бар екенін білмей-ақ бағдарламалық жасақтаманы жасай алады. Көбісі жасайды, сол себепті олар білмей кейбір схемаларды жүзеге асырады. Бірақ неге біз оларды үйренуге уақыт бөлуіміз керек?

  • Дизайн үлгілері жиынтығы болып табылады сыналған шешімдер бағдарламалық қамтамасыз етуді жобалаудағы жалпы мәселелерге. Егер сіз бұл мәселелерге ешқашан тап болмасаңыз да, үлгілерді білу әлі де пайдалы, себебі ол объектіге бағытталған дизайн принциптерін пайдалана отырып, барлық мәселелерді шешуге үйретеді.
  • Дизайн үлгілері defiОлар сіз және сіздің командаңыз тиімдірек байланысу үшін пайдалана алатын ортақ тіл жасайды. Сіз: «Ой, мұны істеу үшін жай ғана Singleton пайдаланыңыз» деп айта аласыз, сонда бәрі сіздің ұсынысыңыздың идеясын түсінеді. Үлгі мен оның атын білсеңіз, синглтонның не екенін түсіндірудің қажеті жоқ.

Дизайн үлгілерінің классификациясы

Дизайн үлгілері күрделілігімен, егжей-тегжейлі деңгейімен және жобаланған жүйеде қолданылу ауқымымен ерекшеленеді.

Аналогия бойынша, біз бірнеше бағдаршам орнату немесе жаяу жүргіншілерге арналған жерасты өткелдері бар көп деңгейлі жол айырығын салу арқылы қиылысты қауіпсіз ете аламыз.

Ең негізгі, төменгі деңгейлі модельдер жиі аталады идиомалар . Олар әдетте бір бағдарламалау тіліне ғана қолданылады.

Ең әмбебап және жоғары деңгейлі модельдер сәулет үлгілері . Әзірлеушілер бұл үлгілерді іс жүзінде кез келген тілде жүзеге асыра алады. Басқа үлгілерден айырмашылығы, олар бүкіл қолданбаның архитектурасын жобалау үшін пайдаланылуы мүмкін.

Сонымен қатар, барлық модельдерді олардың түріне қарай жіктеуге болады тырысты немесе мақсат. Үш негізгі сыныптар:

Инновациялық ақпараттық бюллетень
Инновация туралы ең маңызды жаңалықтарды жіберіп алмаңыз. Оларды электрондық пошта арқылы алу үшін тіркеліңіз.
  • Шығармашылық модельдер олар икемділік пен бар кодты қайта пайдалануды арттыратын объект құру механизмдерін қамтамасыз етеді.
  • Құрылымдық модельдер олар нысандар мен сыныптарды үлкен құрылымдарға қалай жинау керектігін түсіндіреді, бұл құрылымдарды икемді және тиімді етеді.
  • Мінез-құлық үлгілері олар объектілер арасындағы тиімді қарым-қатынас пен жауапкершілікті тағайындаумен айналысады.

Ларавелдегі дизайн үлгісінің мысалы: қасбет

Фасад кітапханаға, фреймворкке немесе сыныптардың кез келген басқа күрделі жиынына оңайлатылған интерфейсті қамтамасыз ететін құрылымдық дизайн үлгісі.

Мәселе

Күрделі кітапханаға немесе фреймворкке жататын нысандардың үлкен жинағына негізделген бағдарламалық жасақтама жұмысын жасауымыз керек делік. Әдетте, бізге осы нысандардың барлығын инициализациялау, тәуелділіктерді қадағалау, әдістерді дұрыс ретпен орындау және т.б. қажет болады.

Нәтижесінде, сыныптардың іскерлік логикасы үшінші тарап сыныптарының іске асыру мәліметтерімен тығыз байланыста болады, бұл оларды түсіну мен басқаруды қиындатады.

Солузион

Una facade көптеген қозғалмалы бөліктерді қамтитын күрделі ішкі жүйеге қарапайым интерфейсті қамтамасыз ететін класс. А facade ішкі жүйемен тікелей жұмыс істеумен салыстырғанда шектеулі функционалдылықты қамтамасыз етуі мүмкін. Дегенмен, ол тек тұтынушылар шынымен қызықтыратын мүмкіндіктерді қамтиды.

Біреуі бар facade бұл қолданбаны ондаған мүмкіндіктері бар күрделі кітапханамен біріктіру қажет болғанда пайдалы, бірақ бізге оның функционалдығының аз ғана бөлігі қажет.

Мысалы, әлеуметтік медиаға мысықтар бейнеленген қысқа күлкілі бейнелерді жүктеп салатын қолданба кәсіби бейне түрлендіру кітапханасын пайдалануы мүмкін. Дегенмен, бізге шын мәнінде қажет нәрсе - жалғыз әдіспен класс encode(filename, format). Осындай класс жасап, оны бейне түрлендіру кітапханасына қосқаннан кейін бізде бірінші болады facade.

Мысалы, байланыс орталығының телефон операторы а facade. Шындығында, телефон арқылы тапсырыс беру үшін дүкеннің телефон қызметіне хабарлассақ, оператор біздікі facade дүкеннің барлық қызметтері мен бөлімдеріне қатысты. Оператор тапсырыс беру жүйесіне, төлем шлюзіне және әртүрлі жеткізу қызметтеріне қарапайым дауыстық интерфейсті ұсынады.

PHP тіліндегі нақты мысал

Ойлан Фасад кейбір күрделі ішкі жүйелер үшін қарапайым адаптер ретінде. Facade бір сынып ішінде күрделілікті оқшаулайды және басқа қолданба кодын қарапайым интерфейсті пайдалануға мүмкіндік береді.

Бұл мысалда, Facade YouTube API және 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

Инновациялық ақпараттық бюллетень
Инновация туралы ең маңызды жаңалықтарды жіберіп алмаңыз. Оларды электрондық пошта арқылы алу үшін тіркеліңіз.

Соңғы мақалалар

Veeam қорғаныстан жауап беруге және қалпына келтіруге дейін төлемдік бағдарламалық құралға ең жан-жақты қолдау көрсетеді

Veeam ұсынған Coveware кибербопсалау оқиғаларына жауап беру қызметтерін көрсетуді жалғастырады. Coveware криминалистикалық және қалпына келтіру мүмкіндіктерін ұсынады ...

23 Сәуір 2024

Жасыл және цифрлық революция: болжамды техникалық қызмет көрсету мұнай және газ саласын қалай өзгертеді

Болжалды техникалық қызмет көрсету зауытты басқаруға инновациялық және белсенді көзқараспен мұнай және газ секторында төңкеріс жасайды.…

22 Сәуір 2024

Ұлыбританияның монополияға қарсы реттеушісі GenAI-ге қатысты BigTech дабылын көтереді

Ұлыбританияның CMA жасанды интеллект нарығындағы Big Tech әрекеті туралы ескерту жасады. Ана жерде…

18 Сәуір 2024

Casa Green: Италиядағы тұрақты болашақ үшін энергетикалық революция

Ғимараттардың энергия тиімділігін арттыру үшін Еуропалық Одақ тұжырымдаған «Жасыл үйлер» жарлығы өзінің заң шығару процесін аяқтады ...

18 Сәуір 2024

Инновацияны өз тіліңізде оқыңыз

Инновациялық ақпараттық бюллетень
Инновация туралы ең маңызды жаңалықтарды жіберіп алмаңыз. Оларды электрондық пошта арқылы алу үшін тіркеліңіз.

Артымыздан