макалалар

Дизайн үлгүлөрү деген эмне: аларды эмне үчүн колдонуу, классификация, жакшы жана жаман жактары

Программалык камсыздоо инженериясында дизайн үлгүлөрү программалык камсыздоодо көбүнчө пайда болгон көйгөйлөрдүн оптималдуу чечимдери болуп саналат.

Алар алдын ала долбоорлор сыяктууdefiкодуңуздагы кайталануучу дизайн маселесин чечүү үчүн ыңгайлаштыра турган сыналган жана сыналган куралдар.

Болжолдуу окуу убактысы: 6 мүнөт

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

Дизайн үлгүсү стандарттуу функциялар же китепканалар менен жасай тургандай, биз көчүрүп алып, программабызга киргизе турган код эмес. Дизайн үлгүсү белгилүү бир маселени чечүүгө жөндөмдүү жалпы түшүнүк. Негизинен биз анын деталдарын ээрчип, программабыздын реалдуулугуна туура келген чечимди ишке ашыра турган модель.

Моделдерди көбүнчө алгоритмдер менен чаташтырышат, анткени эки түшүнүк тең кээ бир белгилүү маселелердин типтүү чечимдерин сүрөттөйт. Алгоритм болуп жатканда defiБелгилүү бир максатка жетүү мүмкүн болгон иш-аракеттердин так комплекси ар дайым бар болсо, модель чечимдин жогорку деңгээлдеги сүрөттөлүшү болуп саналат. Эки башка программага колдонулган бир эле моделдин коду ар кандай болушу мүмкүн.

Аналогия жасагыбыз келсе, биз тамак даярдоонун рецепти жөнүндө ойлонсок болот: экөө тең максатка жетүү үчүн ачык кадамдарга ээ. Бирок, модель көбүрөөк долбоорго окшош, анын жыйынтыгы жана анын мүнөздөмөлөрү кандай экенин көрө аласыз, бирок ишке ашыруунун так тартиби кодду жазган бизден көз каранды.

Дизайн үлгүсү эмнеден жасалган?

Көпчүлүк үлгүлөр абдан формалдуу сүрөттөлгөн, ошондуктан адамдар аларды көптөгөн контексттерде кайра чыгара алышат. Төмөндө моделдин сүрөттөлүшүндө бар элементтерди карап көрөлү:

  • ниет моделдин кыскача көйгөйдү жана чечүү жолун сүрөттөйт.
  • Түрткү андан ары көйгөйдү жана модель мүмкүн кылган чечимди түшүндүрөт.
  • Структура класстар моделдин ар бир бөлүгүн жана алардын кандай байланышта экенин көрсөтөт.
  • Код мисалы таанымал программалоо тилдеринин биринде моделдин артында идеяны түшүнүүнү жеңилдетет.

Эмне үчүн аларды колдонуу керек?

Программист программалык камсыздоону дизайн үлгүлөрүнүн бар экенин билбей туруп иштеп чыга алат. Көпчүлүгү жасайт, ошол себептүү кээ бир схемаларды билбей туруп ишке ашырышат. Бирок эмне үчүн биз аларды үйрөнүүгө убакыт коротушубуз керек?

  • Дизайн үлгүлөрү бир комплект болуп саналат сыналган чечимдер программалык камсыздоону долбоорлоодо жалпы көйгөйлөргө. Эгер сиз бул көйгөйлөргө эч качан жолукпасаңыз да, үлгүлөрдү билүү дагы деле пайдалуу, анткени ал объектке багытталган дизайн принциптерин колдонуу менен ар кандай маселелерди чечүүнү үйрөтөт.
  • Дизайн моделдери defiАлар сиз жана сиздин командаңыз натыйжалуураак баарлашуу үчүн колдоно турган жалпы тилди түзөт. Сиз: "Ой, бул үчүн Singleton колдонуңуз" деп айтсаңыз болот, ошондо баары сиздин сунушуңуздун артында турган идеяны түшүнөт. Эгер сиз үлгүсүн жана анын атын билсеңиз, синглтон деген эмне экенин түшүндүрүүнүн кереги жок.

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

Дизайн үлгүлөрү татаалдыгы, деталдык деңгээли жана долбоорлонгон тутумда колдонулуу масштабы боюнча айырмаланат.

Аналогия боюнча, биз бир нече светофорлорду орнотуу же жөө жүргүнчүлөр үчүн жер астындагы өтмөктөр менен бүтүндөй көп баскычтуу өтмөк куруу менен кесилишти коопсуз кыла алабыз.

Эң негизги, төмөнкү деңгээлдеги моделдер көбүнчө деп аталат идиомалар . Алар, адатта, бир гана программалоо тилине колдонулат.

Эң универсалдуу жана жогорку деңгээлдеги моделдер архитектуралык моделдер . Иштеп чыгуучулар бул үлгүлөрдү дээрлик каалаган тилде ишке ашыра алышат. Башка үлгүлөрдөн айырмаланып, алар бүтүндөй колдонмонун архитектурасын долбоорлоо үчүн колдонулушу мүмкүн.

Мындан тышкары, бардык моделдер алардын жараша классификацияланышы мүмкүн аракет кылды же максат. үч негизги класстар болуп төмөнкүлөр саналат:

Инновациялык бюллетень
Инновация боюнча эң маанилүү жаңылыктарды өткөрүп жибербеңиз. Аларды электрондук почта аркылуу алуу үчүн катталыңыз.
  • Жаратуу моделдери алар ийкемдүүлүктү жана учурдагы кодду кайра колдонууну жогорулатуучу объект түзүү механизмдерин камсыз кылат.
  • Структуралык моделдер алар объекттерди жана класстарды чоң структураларга кантип чогултууну түшүндүрүп, бул структураларды ийкемдүү жана эффективдүү кармап турушат.
  • Жүрүм-турум моделдери алар объектилердин ортосунда натыйжалуу байланыш жана милдеттерди бөлүштүрүү менен алектенет.

Ларавелдеги дизайн үлгүсүнүн мисалы: Фасад

жакшыдай китепканага, алкактарга же класстардын башка татаал топтомуна жөнөкөйлөштүрүлгөн интерфейсти камсыз кылган структуралык дизайн үлгүсү.

маселе

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

Натыйжада, класстардын бизнес логикасы үчүнчү жактын класстарынын ишке ашыруу деталдары менен тыгыз байланышта болуп, аларды түшүнүүнү жана башкарууну кыйындатат.

Solution

Una facade көптөгөн кыймылдуу бөлүктөрдү камтыган татаал подсистемага жөнөкөй интерфейсти камсыз кылган класс. А facade подсистема менен түздөн-түз иштөөгө салыштырмалуу чектелген функцияларды камсыздай алат. Бирок, ал кардарларга чындап көңүл бурган функцияларды гана камтыйт.

Бирөө бар facade бул колдонмону ондогон өзгөчөлүктөргө ээ татаал китепкана менен интеграциялоо керек болгондо пайдалуу, бирок бизге анын функционалдуулугунун бир аз гана бөлүгү керек.

Мисалы, мышыктар тартылган кыска күлкүлүү видеолорду социалдык медиага жүктөгөн колдонмо профессионалдуу видео конвертациялоо китепканасын колдонушу мүмкүн. Бирок, бизге чындап эле керек болгон жалгыз методу бар класс encode(filename, format). Мындай классты түзүп, аны видеоконвертациялоо китепканасына туташтыргандан кийин, биз биринчи класска ээ болобуз facade.

Мисалы, колл-борбордун телефон оператору А facade. Негизи дүкөндүн телефон кызматына телефон аркылуу заказ берсек, оператор биздики facade дүкөндүн бардык кызматтарына жана бөлүмдөрүнө. Оператор заказ берүү системасына, төлөм шлюздарына жана ар кандай жеткирүү кызматтарына жөнөкөй үн интерфейсин берет.

PHPдеги чыныгы мисал

ойлон жакшыдай кээ бир татаал подсистемалар үчүн жөнөкөй адаптер катары. Facade бир класстын ичиндеги татаалдыкты изоляциялайт жана башка колдонмо кодун жөнөкөй интерфейсти колдонууга мүмкүндүк берет.

Бул мисалда, Facade YouTube API жана FFmpeg китепканасынын татаалдыгын кардар кодунан жашырат. Кардар ондогон класстар менен иштөөнүн ордуна Фасад боюнча жөнөкөй ыкманы колдонот.

<?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 ransomware үчүн коргоодон баштап жооп кайтарууга жана калыбына келтирүүгө чейин эң комплекстүү колдоону камтыйт

Veeam тарабынан Coveware кибер опузалап инциденттерге жооп берүү кызматтарын көрсөтүүнү улантат. Coveware криминалистика жана ремедиация мүмкүнчүлүктөрүн сунуштайт ...

April 23 2024

Жашыл жана санариптик революция: алдын ала тейлөө мунай жана газ өнөр жайын кантип өзгөртөт

Болжолдуу тейлөө заводду башкарууга инновациялык жана жигердүү мамиле кылуу менен мунай жана газ секторун революция кылып жатат.…

April 22 2024

Улуу Британиянын монополияга каршы жөнгө салуучу органы GenAI боюнча BigTech коңгуроосун көтөрөт

Улуу Британиянын CMA жасалма интеллект рыногунда Big Tech жүрүм-туруму жөнүндө эскертүү берди. Ал жерде…

April 18 2024

Casa Green: Италияда туруктуу келечек үчүн энергетикалык революция

Имараттардын энергетикалык натыйжалуулугун жогорулатуу үчүн Европа Биримдиги тарабынан иштелип чыккан "Case Green" Декрети өзүнүн мыйзам чыгаруу процессин аяктады ...

April 18 2024

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

Инновациялык бюллетень
Инновация боюнча эң маанилүү жаңылыктарды өткөрүп жибербеңиз. Аларды электрондук почта аркылуу алуу үчүн катталыңыз.

бизди ээрчи