Maqolalar

Dizayn naqshlari nima: ularni nima uchun ishlatish, tasnifi, ijobiy va salbiy tomonlari

Dasturiy ta'minot muhandisligida dizayn naqshlari dasturiy ta'minotni loyihalashda tez-tez uchraydigan muammolarni hal qilishning maqbul echimidir.

Ular oldingi loyihalarga o'xshaydidefiSizning kodingizdagi takrorlanadigan dizayn muammosini hal qilish uchun sozlashingiz mumkin bo'lgan sinab ko'rilgan va sinovdan o'tgan vositalar.

Taxminiy o'qish vaqti: 6 daqiqada

Dizayn namunasi nima

Dizayn namunasi standart funksiyalar yoki kutubxonalar bilan qilishimiz mumkin bo'lganidek, biz nusxa ko'chirish va dasturimizga kiritishimiz mumkin bo'lgan kod emas. Dizayn namunasi ma'lum bir muammoni hal qilishga qodir bo'lgan umumiy tushunchadir. Asosan, biz uning tafsilotlariga amal qilishimiz va dasturimizning haqiqatiga mos keladigan yechimni amalga oshirishimiz mumkin bo'lgan model.

Modellar ko'pincha algoritmlar bilan chalkashib ketadi, chunki ikkala tushuncha ham ba'zi ma'lum muammolarning tipik echimlarini tavsiflaydi. Algoritm bo'lganda defiAgar har doim ma'lum bir maqsadga erishish mumkin bo'lgan aniq harakatlar to'plami mavjud bo'lsa, model - bu yechimning yuqori darajadagi tavsifi. Ikki xil dasturga qo'llaniladigan bir xil modeldagi kod boshqacha bo'lishi mumkin.

O'xshatishni istab, pishirish retsepti haqida o'ylashimiz mumkin: ikkalasi ham maqsadga erishish uchun aniq qadamlarga ega. Biroq, model ko'proq loyihaga o'xshaydi, uning natijasi va uning xususiyatlarini ko'rishingiz mumkin, ammo amalga oshirishning aniq tartibi kodni yozgan bizga bog'liq.

Dizayn namunasi nimadan yasalgan?

Aksariyat naqshlar juda rasmiy tarzda tasvirlangan, shuning uchun odamlar ularni turli kontekstlarda takrorlashlari mumkin. Keling, model tavsifida mavjud bo'lgan elementlarni quyida ko'rib chiqaylik:

  • Niyat model muammoni ham, yechimni ham qisqacha tavsiflaydi.
  • Motivatsiya model imkon beradigan muammo va yechimni yanada tushuntiradi.
  • Tuzilishi sinflar modelining har bir qismini va ular qanday bog'liqligini ko'rsatadi.
  • Kod misoli eng mashhur dasturlash tillaridan birida model ortidagi g'oyani tushunishni osonlashtiradi.

Nima uchun ulardan foydalanish kerak?

Dasturchi dizayn naqshlari mavjudligini bilmasdan dasturiy ta'minotni ishlab chiqishi mumkin. Ko'pchilik buni qiladi va shu sababli ular bilmagan holda ba'zi sxemalarni amalga oshiradilar. Ammo nega biz ularni o'rganishga vaqt sarflashimiz kerak?

  • Dizayn naqshlari to'plamidir sinab ko'rilgan va sinovdan o'tgan echimlar dasturiy ta'minotni loyihalashda keng tarqalgan muammolarga. Agar siz hech qachon bunday muammolarga duch kelmasangiz ham, naqshlarni bilish hali ham foydalidir, chunki u ob'ektga yo'naltirilgan dizayn tamoyillaridan foydalangan holda barcha turdagi muammolarni qanday hal qilishni o'rgatadi.
  • Dizayn modellari defiUlar siz va jamoangiz samaraliroq muloqot qilish uchun foydalanishi mumkin bo'lgan umumiy tilni yaratadi. Siz shunday deyishingiz mumkin: "Oh, buni amalga oshirish uchun faqat Singleton-dan foydalaning" va hamma sizning taklifingiz ortidagi g'oyani tushunadi. Agar siz naqsh va uning nomini bilsangiz, singleton nima ekanligini tushuntirishga hojat yo'q.

Dizayn naqshlarining tasnifi

Dizayn naqshlari murakkabligi, tafsilotlar darajasi va loyihalashtirilgan tizimda qo'llanilishi ko'lami bilan farqlanadi.

O'xshashlik bo'yicha, biz bir nechta svetoforlarni o'rnatish yoki piyodalar uchun er osti o'tish joylari bilan butun ko'p qavatli yo'lni qurish orqali chorraha xavfsizroq qilishimiz mumkin.

Eng asosiy, past darajadagi modellar ko'pincha chaqiriladi idiomalar . Ular odatda faqat bitta dasturlash tiliga tegishli.

Eng universal va yuqori darajadagi modellar arxitektura modellari . Ishlab chiquvchilar ushbu naqshlarni deyarli har qanday tilda amalga oshirishlari mumkin. Boshqa naqshlardan farqli o'laroq, ular butun ilovaning arxitekturasini loyihalash uchun ishlatilishi mumkin.

Bundan tashqari, barcha modellarni ularning xususiyatlariga ko'ra tasniflash mumkin harakat qildi yoki maqsad. Uchta asosiy sinflar:

Innovatsion axborot byulleteni
Innovatsiyalar haqidagi eng muhim yangiliklarni o'tkazib yubormang. Ularni elektron pochta orqali olish uchun ro'yxatdan o'ting.
  • Yaratuvchi modellar ular mavjud kodning moslashuvchanligi va qayta ishlatilishini oshiradigan ob'ekt yaratish mexanizmlarini ta'minlaydi.
  • Strukturaviy modellar ular ob'ektlar va sinflarni kattaroq tuzilmalarga qanday yig'ish kerakligini tushuntiradilar, bu tuzilmalarni moslashuvchan va samarali saqlashadi.
  • Xulq-atvor modellari ular ob'ektlar o'rtasida samarali aloqa va mas'uliyatni belgilash bilan shug'ullanadi.

Laraveldagi dizayn naqshiga misol: Fasad

Fasad kutubxona, ramka yoki boshqa har qanday murakkab sinflar to'plamiga soddalashtirilgan interfeysni ta'minlovchi tizimli dizayn namunasidir.

Muammo

Faraz qilaylik, biz dasturiy ta'minotni murakkab kutubxona yoki ramkaga tegishli bo'lgan katta ob'ektlar to'plamiga asoslangan holda ishlashimiz kerak. Odatda, biz ushbu ob'ektlarning barchasini ishga tushirishimiz, bog'liqliklarni kuzatib borishimiz, usullarni to'g'ri tartibda bajarishimiz va hokazo.

Natijada, sinflarning biznes mantig'i uchinchi tomon sinflarini amalga oshirish tafsilotlari bilan chambarchas bog'liq bo'lib, ularni tushunish va boshqarishni qiyinlashtiradi.

Qaror

Una facade ko'plab harakatlanuvchi qismlarni o'z ichiga olgan murakkab quyi tizimga oddiy interfeysni ta'minlovchi sinfdir. A facade to'g'ridan-to'g'ri quyi tizim bilan ishlashga nisbatan cheklangan funksionallikni ta'minlashi mumkin. Biroq, u faqat mijozlarga g'amxo'rlik qiladigan xususiyatlarni o'z ichiga oladi.

Bir bor facade biz ilovani o'nlab xususiyatlarga ega bo'lgan murakkab kutubxona bilan birlashtirishimiz kerak bo'lganda foydali bo'ladi, lekin biz uning funksionalligining kichik bir qismiga muhtojmiz.

Misol uchun, mushuklar bilan qisqa kulgili videolarni ijtimoiy tarmoqlarga yuklaydigan ilova professional video konversiya kutubxonasidan foydalanishi mumkin. Biroq, bizga haqiqatan ham kerak bo'lgan yagona usul - bu sinf encode(filename, format). Bunday sinfni yaratib, uni video konversiya kutubxonasiga ulaganimizdan so'ng, bizda birinchi bo'ladi facade.

Masalan, qo'ng'iroq markazining telefon operatori a facade. Darhaqiqat, biz telefon orqali buyurtma berish uchun do'konning telefon xizmatiga qo'ng'iroq qilsak, operator bizniki facade do'konning barcha xizmatlari va bo'limlariga. Operator buyurtma berish tizimi, to‘lov shlyuzlari va turli yetkazib berish xizmatlariga oddiy ovozli interfeysni taqdim etadi.

PHPda haqiqiy misol

Haqida o'ylamoq Fasad ba'zi murakkab quyi tizimlar uchun oddiy adapter sifatida. Facade murakkablikni bitta sinf ichida ajratib turadi va boshqa dastur kodlari oddiy interfeysdan foydalanishga imkon beradi.

Bu misolda, Facade YouTube API va FFmpeg kutubxonasining murakkabligini mijoz kodidan yashiradi. Mijoz o'nlab sinflar bilan ishlash o'rniga Fasadda oddiy usuldan foydalanadi.

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

Innovatsion axborot byulleteni
Innovatsiyalar haqidagi eng muhim yangiliklarni o'tkazib yubormang. Ularni elektron pochta orqali olish uchun ro'yxatdan o'ting.

So'nggi maqolalar

Veeam to'lov dasturini himoya qilishdan tortib javob berish va tiklashgacha bo'lgan eng keng qamrovli yordamga ega

Veeam tomonidan ishlab chiqarilgan Coveware kiber tovlamachilik hodisalariga javob berish xizmatlarini taqdim etishda davom etadi. Coveware sud tibbiyoti va remediatsiya imkoniyatlarini taklif qiladi ...

23 Aprel 2024

Yashil va raqamli inqilob: prognozli texnik xizmat ko'rsatish neft va gaz sanoatini qanday o'zgartirmoqda

Bashoratli texnik xizmat ko'rsatish zavodlarni boshqarishga innovatsion va proaktiv yondashuv bilan neft va gaz sektorini inqilob qilmoqda.…

22 Aprel 2024

Buyuk Britaniyaning monopoliyaga qarshi regulyatori GenAI ustidan BigTech signalini oshiradi

Buyuk Britaniya CMA Big Tech kompaniyasining sun'iy intellekt bozoridagi xatti-harakatlari haqida ogohlantirish e'lon qildi. U yerda…

18 Aprel 2024

Casa Green: Italiyada barqaror kelajak uchun energiya inqilobi

Evropa Ittifoqi tomonidan binolarning energiya samaradorligini oshirish uchun ishlab chiqilgan "Yashil uylar" qarori qonunchilik jarayonini yakunladi ...

18 Aprel 2024