بیشتر

د ډیزاین نمونې څه دي: ولې یې وکاروئ، طبقه بندي، ګټې او زیانونه

د سافټویر انجینرۍ کې، ډیزاین نمونې د هغو ستونزو لپاره غوره حلونه دي چې معمولا د سافټویر ډیزاین کې واقع کیږي.

دوی د مخکې پروژو په څیر ديdefiنایټ، هڅه شوي او ازمول شوي وسیلې چې تاسو کولی شئ په خپل کوډ کې د تکراري ډیزاین ستونزې حل کولو لپاره دودیز کړئ.

د لوستلو اټکل شوی وخت: 6 منیوټ

د ډیزاین نمونه څه ده

د ډیزاین نمونه کوډ نه دی چې موږ کولی شو کاپي او زموږ په برنامه کې دننه کړو، لکه څنګه چې موږ کولی شو د معیاري کارونو یا کتابتونونو سره ترسره کړو. د ډیزاین نمونه یو عمومي مفهوم دی چې د یوې ځانګړې ستونزې حل کولو توان لري. اساسا یو ماډل چې توضیحات یې موږ کولی شو یو داسې حل تعقیب او پلي کړو چې زموږ د برنامې واقعیت سره سمون ولري.

ماډلونه اکثرا د الګوریتم سره مغشوش کیږي، ځکه چې دواړه مفکورې د ځینو پیژندل شویو ستونزو لپاره عادي حلونه بیانوي. پداسې حال کې چې یو الګوریتم defiکه چیرې تل د عملونو روښانه مجموعه شتون ولري چې کولی شي یو ټاکلی هدف ترلاسه کړي، یو ماډل د حل لوړه کچه تشریح کوي. د ورته ماډل څخه کوډ چې په دوه مختلف برنامو کې پلي کیږي ممکن توپیر ولري.

د مشابهت کولو په لټه کې، موږ کولی شو د پخلي ترکیب په اړه فکر وکړو: دواړه د هدف ترلاسه کولو لپاره روښانه ګامونه لري. په هرصورت، یو ماډل د پروژې په څیر ډیر دی، چې تاسو یې لیدلی شئ چې پایله او ځانګړتیاوې یې څه دي، مګر د پلي کولو دقیق ترتیب په موږ پورې اړه لري چې کوډ لیکي.

د ډیزاین نمونه له څه څخه جوړه شوې ده؟

ډیری نمونې په رسمی توګه بیان شوي ترڅو خلک په ډیری شرایطو کې بیا تولید کړي. راځئ چې لاندې عناصر وګورو چې د ماډل په توضیح کې شتون لري:

  • اراده د ماډل په لنډه توګه ستونزه او حل دواړه بیانوي.
  • هڅونه نوره ستونزه او حل تشریح کوي چې ماډل یې ممکنه کوي.
  • جوړښت د ټولګیو شمیر د ماډل هره برخه ښیي او دا چې دوی څنګه تړاو لري.
  • د کوډ مثال په یوه خورا مشهور پروګرامینګ ژبو کې د ماډل تر شا نظر پوهیدل اسانه کوي.

ولې دوی وکاروئ؟

یو پروګرامر کولی شي سافټویر رامینځته کړي پرته لدې چې د ډیزاین نمونو شتون پوه شي. ډیری یې کوي، او د دې دلیل لپاره دوی ځینې سکیمونه پلي کوي پرته له دې چې پوه شي. مګر بیا ولې موږ باید د دوی په زده کړه وخت ولګوو؟

  • د ډیزاین نمونې یو کټ دی هڅه او ازمول شوي حلونه د سافټویر ډیزاین کې عام ستونزو ته. حتی که تاسو هیڅکله له دې ستونزو سره مخ نه یاست، د نمونو پیژندل لاهم ګټور دي ځکه چې دا تاسو ته درس درکوي چې څنګه د اعتراض پر بنسټ ډیزاین اصولو په کارولو سره هر ډول ستونزې حل کړئ.
  • د ډیزاین ماډلونه defiدوی یوه ګډه ژبه رامینځته کوي چې تاسو او ستاسو ټیم کولی شي د لا مؤثره خبرو اترو لپاره وکاروئ. تاسو کولی شئ ووایاست، "او، یوازې د دې کولو لپاره یو واحد وکاروئ،" او هرڅوک به ستاسو د وړاندیز تر شا نظر پوه شي. د دې تشریح کولو ته اړتیا نشته چې یو سینګټن څه شی دی که تاسو نمونه او نوم پیژنئ.

د ډیزاین نمونو طبقه بندي

د ډیزاین نمونې په ټول ډیزاین شوي سیسټم کې په پیچلتیا، د توضیحاتو کچه، او د تطبیق اندازه سره توپیر لري.

د مشابهت له مخې، موږ کولی شو د یو څو ترافیکي څراغونو په نصبولو یا د پیاده رانو لپاره د ځمکې لاندې لارو سره د څو سطحې تبادلې په جوړولو سره یو تقاطع خوندي کړو.

ډیری بنسټیز، ټیټې کچې ماډلونه اکثرا ویل کیږي محاورې . دوی معمولا یوازې د یوې برنامې ژبې لپاره پلي کیږي.

ترټولو نړیوال او د لوړې کچې ماډلونه دي د معمارۍ ماډلونه . پرمخ وړونکي کولی شي دا نمونې په حقیقت کې په هره ژبه کې پلي کړي. د نورو نمونو برعکس، دوی د ټول غوښتنلیک د جوړښت ډیزاین کولو لپاره کارول کیدی شي.

سربیره پردې ، ټول ماډلونه د دوی له مخې طبقه بندي کیدی شي هڅه یې وکړه یا هدف. درې اصلي ټولګي دي:

د نوښت خبر پاڼه
د نوښت په اړه خورا مهم خبرونه له لاسه مه ورکوئ. د بریښنالیک له لارې دوی ترلاسه کولو لپاره لاسلیک وکړئ.
  • تخلیقي ماډلونه دوی د اعتراض جوړولو میکانیزمونه چمتو کوي چې د موجوده کوډ انعطاف او بیا کارول زیاتوي.
  • ساختماني موډلونه دوی تشریح کوي چې څنګه شیان او ټولګي په لویو جوړښتونو کې راټول کړي، دا جوړښتونه انعطاف وړ او اغیزمن ساتي.
  • د چلند ماډلونه دوی د اغیزمنو اړیکو او د شیانو تر منځ د مسؤلیتونو ګمارلو سره معامله کوي.

په لارویل کې د ډیزاین نمونې بیلګه: مخ

مخ د ساختماني ډیزاین نمونه ده چې کتابتون، چوکاټ، یا کوم بل پیچلي ټولګیو ته یو ساده انٹرفیس چمتو کوي.

ستونزه

راځئ فرض کړو چې موږ د سافټویر کار کولو ته اړتیا لرو، د شیانو د لوی سیټ پراساس چې د پیچلي کتابتون یا چوکاټ سره تړاو لري. په نورمال ډول، موږ به د دې ټولو شیانو پیل کولو ته اړتیا ولرو، د انحصار تعقیب وساتو، په سم ترتیب کې میتودونه اجرا کړو، او داسې نور.

د پایلې په توګه، د ټولګیو سوداګریز منطق به د دریمې ډلې ټولګیو پلي کولو توضیحاتو سره په کلکه سره یوځای شي، چې د دوی پوهیدل او اداره کول ستونزمن کوي.

حل

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 د ransomware لپاره خورا پراخه ملاتړ وړاندې کوي ، له محافظت څخه تر غبرګون او رغیدو پورې

د Veeam لخوا Coveware به د سایبر غصب پیښو غبرګون خدماتو چمتو کولو ته دوام ورکړي. Coveware به د عدلي او درملنې وړتیاوې وړاندې کړي ...

23 اپریل 2024

شنه او ډیجیټل انقلاب: د وړاندوینې وړ ساتنه څنګه د تیلو او ګاز صنعت بدلوي

د وړاندوینې ساتنه د تیلو او ګاز سکتور کې انقلاب رامینځته کوي ، د نبات مدیریت لپاره د نوښت او فعال چلند سره.

22 اپریل 2024

د انګلستان ضد باور تنظیم کونکي د GenAI په اړه د BigTech الارم راپورته کوي

د انګلستان CMA د مصنوعي استخباراتو په بازار کې د لوی ټیک چلند په اړه خبرداری خپور کړی. هلته…

18 اپریل 2024

کاسا ګرین: په ایټالیا کې د دوامداره راتلونکي لپاره د انرژي انقلاب

د "شنو خونو" فرمان، چې د اروپایي اتحادیې لخوا د ودانیو د انرژۍ موثریت لوړولو لپاره جوړ شوی، خپل مقننه پروسه پای ته رسولې ده ...

18 اپریل 2024

نوښت په خپله ژبه ولولئ

د نوښت خبر پاڼه
د نوښت په اړه خورا مهم خبرونه له لاسه مه ورکوئ. د بریښنالیک له لارې دوی ترلاسه کولو لپاره لاسلیک وکړئ.

مونږ سره په