مقالات

الگوهای طراحی چیست: چرا از آنها استفاده کنیم، طبقه بندی، جوانب مثبت و منفی

در مهندسی نرم افزار، الگوهای طراحی راه حل های بهینه برای مشکلاتی هستند که معمولا در طراحی نرم افزار رخ می دهند.

آنها مانند پروژه های قبلی هستندdefinite، ابزارهای آزمایش شده و آزمایش شده ای که می توانید برای حل یک مشکل طراحی تکراری در کد خود سفارشی کنید.

زمان تخمینی مطالعه: 6 minuti

الگوی طراحی چیست؟

الگوی طراحی کدی نیست که بتوانیم آن را کپی کرده و در برنامه خود وارد کنیم، همانطور که می توانیم با توابع یا کتابخانه های استاندارد انجام دهیم. الگوی طراحی یک مفهوم کلی است که قادر به حل یک مشکل خاص است. اساساً مدلی که جزئیات آن را می توانیم دنبال کرده و راه حلی متناسب با واقعیت برنامه خود اجرا کنیم.

مدل‌ها اغلب با الگوریتم‌ها اشتباه گرفته می‌شوند، زیرا هر دو مفهوم راه‌حل‌های معمولی برای برخی مسائل شناخته شده را توصیف می‌کنند. در حالی که یک الگوریتم defiاگر همیشه مجموعه ای واضح از اقدامات وجود داشته باشد که بتواند به یک هدف خاص دست یابد، یک مدل توصیف سطح بالاتری از یک راه حل است. کدهای یک مدل اعمال شده برای دو برنامه مختلف ممکن است متفاوت باشند.

اگر بخواهیم یک قیاس انجام دهیم، می توانیم به یک دستور پخت فکر کنیم: هر دو گام های روشنی برای رسیدن به یک هدف دارند. با این حال، یک مدل بیشتر شبیه یک پروژه است که می توانید ببینید نتیجه و ویژگی های آن چیست، اما ترتیب دقیق پیاده سازی به ما بستگی دارد که کد را می نویسیم.

الگوی طراحی از چه چیزی ساخته شده است؟

بیشتر الگوها بسیار رسمی توصیف شده اند تا مردم بتوانند آنها را در زمینه های مختلف بازتولید کنند. بیایید در زیر عناصری را که در توضیح یک مدل وجود دارد، ببینیم:

  • قصد مدل به طور خلاصه هم مشکل و هم راه حل را شرح می دهد.
  • انگیزه بیشتر مشکل و راه حلی را که مدل ممکن می سازد توضیح می دهد.
  • ساختار کلاسها هر بخش از مدل و نحوه ارتباط آنها را نشان می دهد.
  • نمونه کد در یکی از محبوب ترین زبان های برنامه نویسی، درک ایده پشت مدل را آسان تر می کند.

چرا از آنها استفاده کنید؟

یک برنامه نویس می تواند بدون اطلاع از وجود الگوهای طراحی نرم افزار توسعه دهد. بسیاری این کار را انجام می دهند و به همین دلیل بدون اینکه بدانند برخی از طرح ها را اجرا می کنند. اما پس چرا باید برای یادگیری آنها وقت بگذاریم؟

  • الگوهای طراحی مجموعه ای از راه حل های آزمایش شده و آزمایش شده مشکلات رایج در طراحی نرم افزار حتی اگر هرگز با این مشکلات روبرو نشدید، دانستن الگوها همچنان مفید است زیرا به شما می آموزد که چگونه انواع مشکلات را با استفاده از اصول طراحی شی گرا حل کنید.
  • مدل های طراحی defiآنها زبان مشترکی ایجاد می کنند که شما و تیمتان می توانید برای برقراری ارتباط موثرتر از آن استفاده کنید. می توانید بگویید، "اوه، فقط از یک سینگلتون برای انجام این کار استفاده کنید" و همه ایده پشت پیشنهاد شما را درک خواهند کرد. اگر الگو و نام آن را بدانید نیازی به توضیح نیست که تک تن چیست.

طبقه بندی الگوهای طراحی

الگوهای طراحی در پیچیدگی، سطح جزئیات و مقیاس کاربرد در سراسر سیستم طراحی شده متفاوت است.

به قیاس، می‌توانیم با نصب چند چراغ راهنمایی یا ایجاد یک تقاطع چندسطحی با معابر زیرزمینی برای عابران پیاده، یک تقاطع را ایمن‌تر کنیم.

ابتدایی ترین مدل های سطح پایین اغلب نامیده می شوند اصطلاحات . آنها معمولا فقط برای یک زبان برنامه نویسی اعمال می شوند.

جهانی ترین و سطح بالا ترین مدل ها هستند مدل های معماری . توسعه دهندگان می توانند این الگوها را تقریباً در هر زبانی پیاده سازی کنند. بر خلاف سایر الگوها، می توان از آنها برای طراحی معماری کل برنامه استفاده کرد.

علاوه بر این، همه مدل ها را می توان بر اساس آنها طبقه بندی کرد تلاش کرد یا هدف سه کلاس اصلی عبارتند از:

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.
  • مدل های خلاقیت آنها مکانیسم های ایجاد شی را ارائه می دهند که انعطاف پذیری و استفاده مجدد از کد موجود را افزایش می دهد.
  • مدل های سازه ای آنها توضیح می دهند که چگونه می توان اشیاء و کلاس ها را در ساختارهای بزرگتر جمع کرد و این ساختارها را انعطاف پذیر و کارآمد نگه داشت.
  • مدل های رفتاری آنها با ارتباط موثر و تخصیص مسئولیت ها بین اشیاء سروکار دارند.

نمونه ای از الگوی طراحی در لاراول: نما

نما یک الگوی طراحی ساختاری است که یک رابط ساده برای یک کتابخانه، چارچوب یا هر مجموعه پیچیده دیگری از کلاس ها ارائه می دهد.

مشکل

بیایید فرض کنیم که باید نرم افزار را بر اساس مجموعه بزرگی از اشیاء که به یک کتابخانه یا چارچوب پیچیده تعلق دارند، کار کنیم. به طور معمول، ما باید تمام این اشیاء را مقداردهی اولیه کنیم، وابستگی ها را پیگیری کنیم، متدها را به ترتیب صحیح اجرا کنیم و غیره.

در نتیجه، منطق تجاری کلاس‌ها به شدت با جزئیات پیاده‌سازی کلاس‌های شخص ثالث مرتبط می‌شود و درک و مدیریت آن‌ها را دشوار می‌کند.

راه حل

الف facade کلاسی است که یک رابط ساده برای یک زیرسیستم پیچیده که شامل بسیاری از قطعات متحرک است فراهم می کند. آ facade ممکن است عملکرد محدودی را در مقایسه با کار مستقیم با زیرسیستم ارائه دهد. با این حال، فقط شامل ویژگی هایی است که مشتریان واقعاً به آنها اهمیت می دهند.

یکی داشته باش facade زمانی مفید است که ما نیاز به ادغام برنامه با کتابخانه پیچیده ای داریم که ده ها ویژگی دارد، اما فقط به بخش کوچکی از عملکرد آن نیاز داریم.

برای مثال، برنامه‌ای که ویدیوهای خنده‌دار کوتاه با گربه‌ها را در رسانه‌های اجتماعی آپلود می‌کند، می‌تواند به طور بالقوه از یک کتابخانه حرفه‌ای تبدیل ویدیو استفاده کند. با این حال، تنها چیزی که واقعاً به آن نیاز داریم یک کلاس با متد واحد است encode(filename, format). پس از ایجاد چنین کلاسی و اتصال آن به کتابخانه تبدیل ویدیو، اولین کلاس خود را خواهیم داشت facade.

به عنوان مثال اپراتور تلفن یک مرکز تماس مانند a 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 دارای جامع ترین پشتیبانی از باج افزار، از محافظت تا پاسخ و بازیابی است

Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیت‌های پزشکی قانونی و اصلاحی را ارائه می‌دهد…

آوریل 23 2024

انقلاب سبز و دیجیتال: چگونه تعمیر و نگهداری پیش‌بینی‌کننده صنعت نفت و گاز را متحول می‌کند

تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…

آوریل 22 2024

تنظیم کننده ضد انحصار بریتانیا هشدار BigTech را در مورد GenAI به صدا در می آورد

CMA انگلستان در مورد رفتار Big Tech در بازار هوش مصنوعی هشداری صادر کرده است. آنجا…

آوریل 18 2024

کاسا گرین: انقلاب انرژی برای آینده ای پایدار در ایتالیا

فرمان "خانه های سبز" که توسط اتحادیه اروپا برای افزایش بهره وری انرژی ساختمان ها تدوین شده است، روند قانونی خود را با…

آوریل 18 2024

نوآوری را به زبان خود بخوانید

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

ما را دنبال کنید