بضائع

ما هي أنماط التصميم: لماذا استخدامها، والتصنيف، والإيجابيات والسلبيات

في هندسة البرمجيات، تعد أنماط التصميم بمثابة الحلول الأمثل للمشاكل التي تحدث عادة في تصميم البرمجيات.

إنهم مثل المشاريع المسبقةdefiأدوات مجربة ومختبرة يمكنك تخصيصها لحل مشكلة التصميم المتكررة في التعليمات البرمجية الخاصة بك.

وقت القراءة المقدر: 6 دقيقة

ما هو نمط التصميم

نمط التصميم ليس رمزًا يمكننا نسخه وإدراجه في برنامجنا، كما يمكننا أن نفعل مع الوظائف أو المكتبات القياسية. نمط التصميم هو مفهوم عام قادر على حل مشكلة معينة. في الأساس نموذج يمكننا متابعة تفاصيله وتنفيذ حل يناسب واقع برنامجنا.

غالبًا ما يتم الخلط بين النماذج والخوارزميات، لأن كلا المفهومين يصفان حلولًا نموذجية لبعض المشكلات المعروفة. بينما خوارزمية defiإذا كانت هناك دائمًا مجموعة واضحة من الإجراءات التي يمكنها تحقيق هدف معين، فإن النموذج هو وصف بمستوى أعلى للحل. قد يكون الرمز من نفس النموذج المطبق على برنامجين مختلفين مختلفًا.

إذا أردنا إجراء تشبيه، يمكننا التفكير في وصفة طبخ: كلاهما لديه خطوات واضحة لتحقيق الهدف. ومع ذلك، فإن النموذج يشبه المشروع، حيث يمكنك رؤية النتيجة وخصائصه، ولكن الترتيب الدقيق للتنفيذ يعتمد علينا نحن الذين نكتب الكود.

ما هو نمط التصميم المصنوع من؟

يتم وصف معظم الأنماط بشكل رسمي للغاية حتى يتمكن الأشخاص من إعادة إنتاجها في العديد من السياقات. دعونا نرى أدناه العناصر الموجودة في وصف النموذج:

  • القصد يصف النموذج بإيجاز كلاً من المشكلة والحل.
  • الحافز يشرح كذلك المشكلة والحل الذي يتيحه النموذج.
  • الهيكل من الفئات يظهر كل جزء من النموذج وكيفية ارتباطها.
  • مثال الكود بإحدى لغات البرمجة الأكثر شيوعًا، مما يسهل فهم الفكرة وراء النموذج.

لماذا استخدامها؟

يمكن للمبرمج تطوير البرمجيات دون معرفة وجود أنماط التصميم. كثيرون يفعلون ذلك، ولهذا السبب يقومون بتنفيذ بعض المخططات دون أن يعرفوا ذلك. ولكن لماذا إذن يجب أن نقضي الوقت في تعلمها؟

  • أنماط التصميم هي مجموعة من الحلول المجربة والمختبرة للمشاكل الشائعة في تصميم البرمجيات. حتى لو لم تواجه هذه المشكلات مطلقًا، فإن معرفة الأنماط لا تزال مفيدة لأنها تعلمك كيفية حل جميع أنواع المشكلات باستخدام مبادئ التصميم الموجه للكائنات.
  • نماذج التصميم defiإنهم ينشئون لغة مشتركة يمكنك أنت وفريقك استخدامها للتواصل بشكل أكثر فعالية. يمكنك أن تقول: "أوه، فقط استخدم Singleton للقيام بذلك"، وسيفهم الجميع الفكرة وراء اقتراحك. ليست هناك حاجة لشرح ما هو المفرد إذا كنت تعرف النمط واسمه.

تصنيف أنماط التصميم

تختلف أنماط التصميم من حيث التعقيد ومستوى التفاصيل وحجم التطبيق في جميع أنحاء النظام المصمم.

وعلى سبيل القياس، يمكننا أن نجعل التقاطع أكثر أماناً من خلال تركيب عدد قليل من إشارات المرور أو بناء تقاطع كامل متعدد المستويات مع ممرات تحت الأرض للمشاة.

غالبًا ما يتم استدعاء النماذج الأساسية ذات المستوى المنخفض التعابير . وعادة ما تنطبق فقط على لغة برمجة واحدة.

النماذج الأكثر عالمية وعالية المستوى هي النماذج المعمارية . يمكن للمطورين تنفيذ هذه الأنماط بأي لغة تقريبًا. وعلى عكس الأنماط الأخرى، يمكن استخدامها لتصميم بنية التطبيق بأكمله.

علاوة على ذلك، يمكن تصنيف جميع النماذج وفقًا لمواصفاتها حاول أو الغرض. الفئات الثلاث الرئيسية هي:

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.
  • نماذج إبداعية أنها توفر آليات إنشاء الكائنات التي تزيد من المرونة وإعادة استخدام التعليمات البرمجية الموجودة.
  • النماذج الهيكلية يشرحون كيفية تجميع الأشياء والفئات في هياكل أكبر، مما يحافظ على مرونة هذه الهياكل وفعاليتها.
  • النماذج السلوكية يتعاملون مع التواصل الفعال وتوزيع المسؤوليات بين الأشياء.

مثال لنمط التصميم في Laravel: الواجهة

مظهر زائف هو نمط تصميم هيكلي يوفر واجهة مبسطة لمكتبة أو إطار عمل أو أي مجموعة معقدة أخرى من الفئات.

مشكلة

لنفترض أننا بحاجة إلى جعل البرمجيات تعمل، بناءً على مجموعة كبيرة من الكائنات التي تنتمي إلى مكتبة أو إطار عمل متطور. عادةً، سنحتاج إلى تهيئة كل هذه الكائنات، وتتبع التبعيات، وتنفيذ الأساليب بالترتيب الصحيح، وما إلى ذلك.

ونتيجة لذلك، فإن منطق الأعمال الخاص بالفئات سيصبح مقترنًا بإحكام بتفاصيل تنفيذ فئات الطرف الثالث، مما يجعل من الصعب فهمها وإدارتها.

soluzione

ل facade هي فئة توفر واجهة بسيطة لنظام فرعي معقد يحتوي على العديد من الأجزاء المتحركة. أ facade قد توفر وظائف محدودة مقارنة بالعمل مباشرة مع النظام الفرعي. ومع ذلك، فهو يتضمن فقط الميزات التي يهتم بها العملاء حقًا.

لديك واحدة facade يكون مفيدًا عندما نحتاج إلى دمج التطبيق مع مكتبة متطورة تحتوي على العشرات من الميزات، ولكننا نحتاج فقط إلى جزء صغير من وظائفها.

على سبيل المثال، يمكن للتطبيق الذي يقوم بتحميل مقاطع فيديو قصيرة مضحكة مع القطط على وسائل التواصل الاجتماعي أن يستخدم مكتبة تحويل فيديو احترافية. ومع ذلك، كل ما نحتاجه حقًا هو فئة ذات طريقة واحدة encode(filename, format). بعد إنشاء مثل هذا الفصل وربطه بمكتبة تحويل الفيديو، سيكون لدينا الفصل الأول facade.

على سبيل المثال، مشغل الهاتف في مركز الاتصال يشبه facade. في الواقع، عندما نتصل بخدمة هاتف أحد المتاجر لتقديم طلب هاتفي، فإن عامل الهاتف هو مندوبنا facade تجاه جميع خدمات وأقسام المتجر. يوفر المشغل واجهة صوتية بسيطة لنظام الطلب وبوابات الدفع وخدمات التوصيل المختلفة.

مثال حقيقي في PHP

فكر في ذلك مظهر زائف كمحول بسيط لبعض الأنظمة الفرعية المعقدة. Facade يعزل التعقيد داخل فئة واحدة ويسمح لرموز التطبيقات الأخرى باستخدام الواجهة البسيطة.

في هذا المثال، Facade يخفي تعقيد واجهة برمجة تطبيقات YouTube ومكتبة 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 بالدعم الأكثر شمولاً لبرامج الفدية، بدءًا من الحماية وحتى الاستجابة والاسترداد

سوف تستمر شركة Coveware by Veeam في تقديم خدمات الاستجابة لحوادث الابتزاز السيبراني. ستوفر Coveware إمكانات الطب الشرعي والمعالجة...

أبريل 23 2024

الثورة الخضراء والرقمية: كيف تعمل الصيانة التنبؤية على تغيير صناعة النفط والغاز

تُحدث الصيانة التنبؤية ثورة في قطاع النفط والغاز، من خلال اتباع نهج مبتكر واستباقي لإدارة المحطات.

أبريل 22 2024

منظم مكافحة الاحتكار في المملكة المتحدة يثير إنذار BigTech بشأن GenAI

أصدرت هيئة أسواق المال في المملكة المتحدة تحذيرًا بشأن سلوك شركات التكنولوجيا الكبرى في سوق الذكاء الاصطناعي. هناك…

أبريل 18 2024

كازا جرين: ثورة الطاقة من أجل مستقبل مستدام في إيطاليا

اختتم مرسوم "البيوت الخضراء"، الذي صاغه الاتحاد الأوروبي لتعزيز كفاءة استخدام الطاقة في المباني، عمليته التشريعية مع…

أبريل 18 2024

اقرأ الابتكار بلغتك

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

تابعنا