Məqalələr

Dizayn nümunələri nədir: niyə istifadə olunur, təsnifatı, müsbət və mənfi cəhətləri

Proqram mühəndisliyində dizayn nümunələri proqram dizaynında tez-tez baş verən problemlərin optimal həllidir.

Onlar əvvəlki layihələr kimidirdefikodunuzda təkrarlanan dizayn problemini həll etmək üçün fərdiləşdirə biləcəyiniz sınaqdan keçmiş və sınaqdan keçirilmiş alətlər.

Təxmini oxuma vaxtı: 6 minuti

Dizayn nümunəsi nədir

Dizayn nümunəsi standart funksiyalar və ya kitabxanalarla edə biləcəyimiz kimi kopyalayıb proqramımıza daxil edə biləcəyimiz kod deyil. Dizayn nümunəsi müəyyən bir problemi həll etməyə qadir olan ümumi bir anlayışdır. Əsasən, təfərrüatlarını izləyə və proqramımızın reallığına uyğun bir həll tətbiq edə biləcəyimiz bir model.

Modellər çox vaxt alqoritmlərlə qarışdırılır, çünki hər iki anlayış bəzi məlum problemlərin tipik həll yollarını təsvir edir. Bir alqoritm olarkən defiMüəyyən bir məqsədə nail ola biləcək hər zaman aydın hərəkətlər toplusu varsa, model həllin daha yüksək səviyyəli təsviridir. İki fərqli proqrama tətbiq edilən eyni modeldən kod fərqli ola bilər.

Bənzətmə etmək istəsək, yemək reseptini düşünə bilərik: hər ikisinin də məqsədə çatmaq üçün aydın addımları var. Bununla belə, model daha çox layihəyə bənzəyir, onun nəticəsinin və onun xüsusiyyətlərinin nə olduğunu görə bilərsiniz, lakin həyata keçirilməsinin dəqiq ardıcıllığı kodu yazan bizdən asılıdır.

Dizayn nümunəsi nədən hazırlanır?

Əksər nümunələr çox rəsmi şəkildə təsvir edilmişdir ki, insanlar onları bir çox kontekstdə təkrarlaya bilsinlər. Modelin təsvirində mövcud olan elementlərə aşağıda baxaq:

  • Niyyət model həm problemi, həm də həllini qısaca təsvir edir.
  • Motivasiya problemi və modelin mümkün etdiyi həlli daha da izah edir.
  • Struktur siniflərin sayı modelin hər bir hissəsini və onların necə əlaqəli olduğunu göstərir.
  • Kod nümunəsi ən məşhur proqramlaşdırma dillərindən birində modelin arxasında duran fikri başa düşməyi asanlaşdırır.

Niyə onlardan istifadə edin?

Proqramçı dizayn nümunələrinin mövcudluğunu bilmədən proqram təminatı hazırlaya bilər. Çoxları bunu edir və bu səbəbdən də bilmədən bəzi sxemləri həyata keçirirlər. Bəs onda niyə biz onları öyrənməyə vaxt sərf etməliyik?

  • Dizayn nümunələri bir dəstdir sınaqdan keçirilmiş həllər proqram dizaynında ümumi problemlərə. Bu problemlərlə heç vaxt qarşılaşmasanız belə, nümunələri bilmək hələ də faydalıdır, çünki o, sizə obyekt yönümlü dizayn prinsiplərindən istifadə edərək hər cür problemləri necə həll etməyi öyrədir.
  • Dizayn modelləri defiOnlar sizin və komandanızın daha effektiv ünsiyyət qurmaq üçün istifadə edə biləcəyi ümumi dil yaradır. Siz deyə bilərsiniz: "Oh, bunu etmək üçün sadəcə Singleton istifadə edin" və hər kəs təklifinizin arxasında duran fikri başa düşəcək. Nümunəni və adını bilirsinizsə, singletonun nə olduğunu izah etməyə ehtiyac yoxdur.

Dizayn nümunələrinin təsnifatı

Dizayn nümunələri mürəkkəbliyi, təfərrüat səviyyəsi və dizayn edilmiş sistemdə tətbiq olunma miqyası ilə fərqlənir.

Analoji olaraq, bir neçə svetofor quraşdırmaqla və ya piyadalar üçün yeraltı keçidlərlə bütöv çoxsəviyyəli yol qovşağı tikməklə kəsişməni daha təhlükəsiz edə bilərik.

Ən əsas, aşağı səviyyəli modellər tez-tez adlanır idiomlar . Onlar adətən yalnız bir proqramlaşdırma dilinə aiddir.

Ən universal və yüksək səviyyəli modellərdir memarlıq modelləri . Tərtibatçılar bu nümunələri faktiki olaraq istənilən dildə həyata keçirə bilərlər. Digər nümunələrdən fərqli olaraq, onlar bütün tətbiqin arxitekturasını tərtib etmək üçün istifadə edilə bilər.

Bundan əlavə, bütün modellər öz xüsusiyyətlərinə görə təsnif edilə bilər çalışdı və ya məqsəd. Üç əsas sinif bunlardır:

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.
  • Yaradıcı modellər onlar çevikliyi və mövcud kodun təkrar istifadəsini artıran obyekt yaratma mexanizmlərini təmin edir.
  • Struktur modellər onlar obyektlərin və siniflərin daha böyük strukturlara necə yığılacağını izah edir, bu strukturları çevik və səmərəli saxlayır.
  • Davranış modelləri onlar obyektlər arasında səmərəli ünsiyyət və vəzifələrin təyin edilməsi ilə məşğul olurlar.

Laraveldə Dizayn Nümunəsinə Nümunə: Fasad

Fasad kitabxanaya, çərçivəyə və ya hər hansı digər mürəkkəb siniflər dəstinə sadələşdirilmiş interfeys təqdim edən struktur dizayn nümunəsidir.

Problem

Fərz edək ki, mürəkkəb kitabxanaya və ya çərçivəyə aid olan çoxlu obyektlər dəsti əsasında proqram təminatının işləməsi lazımdır. Normalda biz bütün bu obyektləri işə salmalı, asılılıqları izləməli, metodları düzgün ardıcıllıqla icra etməli və s.

Nəticədə, siniflərin biznes məntiqi üçüncü tərəf siniflərinin icra detalları ilə sıx birləşəcək və onları başa düşmək və idarə etmək çətinləşəcəkdir.

Həll

bir facade çoxlu hərəkət edən hissələri ehtiva edən mürəkkəb alt sistemə sadə interfeys təqdim edən sinifdir. A facade birbaşa alt sistemlə işləmək ilə müqayisədə məhdud funksionallıq təmin edə bilər. Bununla belə, o, yalnız müştərilərin həqiqətən əhəmiyyət verdiyi xüsusiyyətləri ehtiva edir.

Bir var facade tətbiqi onlarla funksiyaya malik olan mürəkkəb kitabxana ilə inteqrasiya etmək lazım olduqda faydalıdır, lakin onun funksionallığının yalnız kiçik bir hissəsinə ehtiyacımız var.

Məsələn, sosial mediaya pişiklərin yer aldığı qısa gülməli videolar yükləyən proqram potensial olaraq peşəkar video çevirmə kitabxanasından istifadə edə bilər. Bununla belə, həqiqətən ehtiyacımız olan tək metodlu bir sinifdir encode(filename, format). Belə bir sinif yaratdıqdan və onu video çevirmə kitabxanasına qoşduqdan sonra birincimiz olacaq facade.

Məsələn, zəng mərkəzinin telefon operatoru a facade. Əslində biz telefon sifarişi vermək üçün mağazanın telefon xidmətinə zəng edəndə operator bizimdir facade mağazanın bütün xidmət və şöbələrinə doğru. Operator sifariş sisteminə, ödəniş şlüzlərinə və müxtəlif çatdırılma xidmətlərinə sadə səsli interfeys təqdim edir.

PHP-də əsl nümunə

Düşün Fasad bəzi mürəkkəb alt sistemlər üçün sadə adapter kimi. Facade bir sinif daxilində mürəkkəbliyi təcrid edir və digər proqram koduna sadə interfeysdən istifadə etməyə imkan verir.

Bu misalda, Facade YouTube API və FFmpeg kitabxanasının mürəkkəbliyini müştəri kodundan gizlədir. Müştəri onlarla siniflə işləmək əvəzinə Fasadda sadə üsuldan istifadə edir.

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

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.

Articoli recenti

Veeam müdafiədən tutmuş cavab və bərpaya qədər ransomware üçün ən əhatəli dəstəyi təqdim edir

Coveware by Veeam kiber qəsb hallarına cavab xidmətləri göstərməyə davam edəcək. Coveware məhkəmə və remediasiya imkanları təklif edəcək...

23 Aprel 2024

Yaşıl və Rəqəmsal İnqilab: Proqnozlaşdırılan Baxım Neft və Qaz Sənayesini necə çevirir?

Proqnozlaşdırılan texniki xidmət zavodun idarə edilməsinə innovativ və proaktiv yanaşma ilə neft və qaz sektorunda inqilab edir.…

22 Aprel 2024

Böyük Britaniyanın antiinhisar tənzimləyicisi GenAI üzərində BigTech həyəcanını qaldırır

Böyük Britaniyanın CMA süni intellekt bazarında Big Tech-in davranışı ilə bağlı xəbərdarlıq edib. Orada…

18 Aprel 2024

Casa Green: İtaliyada davamlı gələcək üçün enerji inqilabı

Avropa İttifaqı tərəfindən binaların enerji səmərəliliyini artırmaq üçün tərtib edilən "Yaşıl Evlər" Fərmanı qanunvericilik prosesini yekunlaşdırdı ...

18 Aprel 2024