المحتوى:
- أنماط التصميم الهيكلية”Structural design patterns”.
- ما هو نمط التصميم الهيكلي”Facade design pattern”.
- مشكلة يمكن حلها باستخدام نمط التصميم”Facade design pattern”.
- حل المشكلة باستخدام نمط التصميم”Facade design pattern”.
- بناء نمط التصميم الهيكلي “Facade design pattern”.
- تمثيل نمط التصميم”Facade design pattern”بشكل كود.
- قابلية نمط التصميم”Facade design pattern”للتطبيق.
- كيفية تنفيذ نمط التصميم”Facade design pattern”.
- إيجابيات وسلبيات نمط التصميم”Facade design pattern”.
- علاقات نمط التصميم”Facade design pattern”مع الأنماط الأخرى.
- الخاتمة
- المراجع
- أنماط التصميم الهيكلية”Structural design patterns”
أنماط التصميم الهيكلية (Structural Design Patterns) هي أنماط تصميم برمجية تهدف إلى تبسيط تصميم البرمجيات عبر تحديد الطرق التي يمكن بها تجميع الكائنات (Objects) والعلاقات بينها. تهدف هذه الأنماط إلى تعزيز الكفاءة في استخدام الموارد، وزيادة مرونة الأنظمة، وجعلها أكثر قابلية للصيانة والتطوير. هذه الأنماط الهيكلية توفر حلولاً قابلة للتكرار لمشاكل شائعة في تصميم البرمجيات، وتساعد في تحسين بنية الأنظمة البرمجية وجعلها أكثر مرونة وقابلية للصيانة.
- ما هو نمط التصميم الهيكلي”Facade design pattern”
نمط تصميم الواجهة هو نمط تصميم هيكلي يوفر واجهة مبسطة لنظام معقد من الفئات أو المكتبات أو الأطر. فهو يخفي تعقيدات النظام ويوفر واجهة سهلة الاستخدام للعميل. يُعدُّ هذا النمط مفيداً بشكل خاص عند التعامل مع عدد كبير من الفئات المترابطة أو نظام فرعي معقد.
المفاهيم الرئيسية:
التبسيط: الغرض الأساسي من نمط الواجهة هو توفير واجهة أبسط لنظام فرعي معقد. وهذا يُسهِّل على العملاء التفاعل مع النظام الفرعي دون الحاجة إلى فهم تعقيداته الداخلية.
الفصل: من خلال توفير واجهة، يمكنك فصل رمز العميل عن النظام الفرعي الأساسي. وهذا يُقلِّل من التبعيات ويسهل صيانة الكود وتطويره.
الواجهة الموحدة: تعمل الواجهة كنقطة اتصال واحدة للنظام الفرعي، ممَّا يُوفِّر واجهة موحدة ومباشرة يمكن للعملاء استخدامها.
العناصر:
الواجهة: الفئة التي توفر واجهة مبسطة للنظام الفرعي. يقوم بتفويض طلبات العميل إلى الكائنات المناسبة داخل النظام الفرعي.
فئات النظام الفرعي: الفئات التي تنفذ وظائف النظام الفرعي. تتعامل هذه الفئات مع العمليات والتفاعلات المعقدة.
مثال: نفكر في مثال بسيط لنظام المسرح المنزلي. يتكون النظام الفرعي من عدة مكونات مثل مشغل DVD وجهاز العرض ونظام الصوت والأضواء. كل من هذه المكونات له واجهة ووظائف معقدة خاصة به.
- مشكلة يُمكن حلها باستخدام نمط التصميم”Facade design pattern”
تخيل أنَّه يجب علينا جعل التعليمات البرمجية الخاصة بنا تعمل مع مجموعة واسعة من الكائنات التي تنتمي إلى مكتبة أو إطار عمل متطور. عادةً، ستحتاج إلى تهيئة كل هذه الكائنات، وتتبع التبعيات، وتنفيذ الأساليب بالترتيب الصحيح، وما إلى ذلك.
ونتيجةً لذلك، سيصبح منطق الأعمال الخاص بفصولك مقترناً بشكل وثيق بتفاصيل التنفيذ الخاصة بفئات الطرف الثالث، مما يجعل من الصعب فهمه وصيانته.
- حل المشكلة باستخدام نمط التصميم”Facade design pattern”
الواجهة عبارة عن فئة توفر واجهة بسيطة لنظام فرعي معقد يحتوي على الكثير من الأجزاء المتحركة. قد توفر الواجهة وظائف محدودة مقارنة بالعمل مع النظام الفرعي مباشرةً. ومع ذلك، فهو يتضمن فقط تلك الميزات التي يهتم بها العملاء حقاً.
يُعدُّ وجود واجهة مفيداً عندما نحتاج إلى دمج تطبيقنا مع مكتبة متطورة تحتوي على العشرات من الميزات، ولكنَّنا نحتاج فقط إلى القليل من وظائفها.
على سبيل المثال، يمكن للتطبيق الذي يقوم بتحميل مقاطع فيديو قصيرة مضحكة مع القطط على وسائل التواصل الاجتماعي أن يستخدم مكتبة تحويل فيديو احترافية. ومع ذلك، كل ما يحتاجه حقاً هو فئة ذات طريقة واحدة للتشفير (اسم الملف، التنسيق). بعد إنشاء مثل هذه الفئة وربطها بمكتبة تحويل الفيديو، سيكون لديك واجهتك الأولى.
- تشبيه العالم الحقيقي:
عندما نتصل بمتجر لتقديم طلب هاتفي، يكون المُشغِّل هو الواجهة لجميع خدمات وأقسام المتجر.حيث يُوفِّر لنا المشغل واجهة صوتية بسيطة لنظام الطلب وبوابات الدفع وخدمات التوصيل المختلفة.
- بناء نمط التصميم الهيكلي “Facade design pattern”
- تُوفِّر الواجهة Facadeوصولاً سهلاً إلى جزء معين من وظائف النظام الفرعي. فهو يعرف أين يوجه طلب العميل وكيفية تشغيل جميع الأجزاء المتحركة.
- يمكن إنشاء فئة واجهة إضافية An Additional Facade لمنع تلويث واجهة واحدة بميزات غير ذات صلة قد تجعلها بنية معقدة أخرى. يمكن استخدام واجهات إضافية من قبل العملاء والواجهات الأخرى.
- يتكون النظام الفرعي المعقد The Complex Subsystem من العشرات من الكائنات المختلفة. ولجعلهم جميعاً يقومون بشيء ذي معنى، يتعيَّن علينا التعمق في تفاصيل تنفيذ النظام الفرعي، مثل تهيئة الكائنات بالترتيب الصحيح وتزويدها بالبيانات بالتنسيق المناسب.
وفئات النظام الفرعي ليست على علم بوجود الواجهة. إنهم يعملون داخل النظام ويعملون مع بعضهم البعض بشكل مباشر. - يستخدم العميل The Client الواجهة بدلاً من استدعاء كائنات النظام الفرعي مباشرةً.
- تمثيل نمط التصميم”Facade design pattern”بشكل كود
في هذا المثال، يعمل نمط الواجهة على تبسيط التفاعل مع إطار عمل تحويل الفيديو المعقد.
بدلاً من جعل التعليمات البرمجية الخاصة بنا تعمل مع العشرات من فئات إطار العمل مباشرة، يمكننا إنشاء فئة الواجهة التي تغلف تلك الوظيفة وتخفيها عن بقية التعليمات البرمجية. حيث تساعدنا هذه البنية أيضاً على تقليل الجهد المبذول للترقية إلى الإصدارات المستقبلية من إطار العمل أو استبداله بإصدار آخر. الشيء الوحيد الذي ستحتاج إلى تغييره في تطبيقك هو تنفيذ أساليب الواجهة.
- قابلية نمط التصميم”Facade design pattern”للتطبيق
- يستخدم نمط الواجهة عندما نحتاج إلى واجهة محدودة ولكن مباشرة لنظام فرعي معقد.
في كثير من الأحيان، تصبح الأنظمة الفرعية أكثر تعقيداً بمرور الوقت. حتى تطبيق أنماط التصميم يؤدي عادةً إلى إنشاء المزيد من الفئات. قد يصبح النظام الفرعي أكثر مرونة وأسهل في إعادة استخدامه في سياقات مختلفة، ولكن مقدار التكوين والتعليمات البرمجية النمطية التي يتطلبها من العميل تنمو بشكل أكبر من أي وقت مضى. تحاول الواجهة إصلاح هذه المشكلة من خلال توفير اختصار للميزات الأكثر استخداماً في النظام الفرعي والتي تناسب معظم متطلبات العميل.
- يستخدم الواجهة عندما نريد بناء نظام فرعي في طبقات.
إنشاء واجهات لتحديد نقاط الدخول إلى كل مستوى من مستويات النظام الفرعي. يمكنك تقليل الاقتران بين أنظمة فرعية متعددة من خلال مطالبتها بالتواصل عبر الواجهات فقط.
على سبيل المثال، دعنا نعود إلى إطار تحويل الفيديو الخاص بنا. ويمكن تقسيمها إلى طبقتين: ذات صلة بالفيديو والصوت. لكل طبقة، يمكنك إنشاء واجهة ثم جعل فئات كل طبقة تتواصل مع بعضها البعض عبر تلك الواجهات. يبدو هذا النهج مشابهاً جداً لنمط الوسيط.
- كيفية تنفيذ نمط التصميم”Facade design pattern”
- نتحقَّق مما إذا كان من الممكن توفير واجهة أبسط مما يوفره النظام الفرعي الحالي وبالفعل. نحن على الطريق الصحيح إذا كانت هذه الواجهة تجعل كود العميل مستقلاً عن العديد من فئات النظام الفرعي.
- نقوم بإعلان وتنفيذ هذه الواجهة في فئة واجهة جديدة. يجب أن تقوم الواجهة بإعادة توجيه الاستدعاءات من كود العميل إلى الكائنات المناسبة للنظام الفرعي. يجب أن تكون الواجهة مسؤولة عن تهيئة النظام الفرعي وإدارة دورة حياته الإضافية ما لم يقوم كود العميل بذلك بالفعل.
- للحصول على الاستفادة الكاملة من النمط، نجعل كافة رموز العميل تتواصل مع النظام الفرعي فقط عبر الواجهة. الآن أصبح رمز العميل محميًا من أي تغييرات في رمز النظام الفرعي. على سبيل المثال، عندما تتم ترقية نظام فرعي إلى إصدار جديد، ستحتاج فقط إلى تعديل الكود الموجود في الواجهة.
- إذا أصبحت الواجهة كبيرة جداً، فكر في استخراج جزء من سلوكها إلى فئة واجهة جديدة ومحسنة.
- إيجابيات وسلبيات نمط التصميم”Facade design pattern”
الإيجابيات:
يمكن عزل التعليمات البرمجية الخاصة بنا عن تعقيد النظام الفرعي.
السلبيات:
يمكن أن تصبح الواجهة كائناً مقترناً بجميع فئات التطبيق.
- علاقات نمط التصميم”Facade design pattern”مع الأنماط الأخرى
- يُحدِّد ال Facade واجهة جديدة للكائنات الموجودة، بينما يحاول ال Adapter جعل الواجهة الحالية قابلة للاستخدام. يقوم المحول عادةً بتغليف كائن واحد فقط، بينما تعمل الواجهة مع نظام فرعي كامل من الكائنات.
- يمكن أن يعمل Abstract Factory كبديل لـ Facade عندما نريد فقط إخفاء الطريقة التي يتم بها إنشاء كائنات النظام الفرعي من كود العميل.
- يُظهر Flyweight كيفية إنشاء الكثير من الكائنات الصغيرة، بينما يُظهر برنامج Facade كيفية إنشاء كائن واحد يمثل نظاماً فرعياً بأكمله.
- لدى Facade and Mediator وظائف مماثلة: فهم يحاولون تنظيم التعاون بين الكثير من الطبقات المترابطة بإحكام.
- يُحدِّد ال Facade واجهة مبسطة لنظام فرعي من الكائنات، ولكنه لا يقدم أي وظيفة جديدة. فالنظام الفرعي نفسه غير مدرك للواجهة. يمكن للكائنات الموجودة داخل النظام الفرعي التواصل مباشرة.
- يقوم Mediator بمركزية الاتصال بين مكونات النظام. حيث تعرف المكونات فقط عن كائن الوسيط ولا تتواصل مباشرة.
- غالباَ ما يمكن تحويل A Facade classإلى فئة Singleton نظراً لأنَّ كائن واجهة واحد يكفي في معظم الحالات.
- Facade تشبه Proxy من حيث أنَّ كلاهما يقوم بتخزين كيان معقد وتهيئته من تلقاء نفسه. على عكس الواجهة، يتمتع Proxy بنفس واجهة كائن الخدمة الخاص به، مما يجعلها قابلة للتبديل.
- الخاتمة
في النهاية، نمط التصميم الواجهة هو أداة قوية يمكنها تحسين هيكلية الأنظمة البرمجية وتعزيز قابليتها للاستخدام والصيانة. بتطبيق هذا النمط بشكل صحيح، حيث يمكننا تقديم حلول برمجية مرنة، موثوقة، وسهلة الاستخدام تلبي احتياجات المستخدمين بكفاءة. لأنَّه يؤمِّن سهولة الاستخدام من خلال تقليل التعقيد وإخفاء التفاصيل الداخلية، يُسهِّل على العملاء استخدام النظام و يُقلِّل التداخل حيث أنَّه يُقلِّل من الاعتمادية بين العملاء والنظام المعقَّد، ممَّا يسهل صيانة النظام تحسين التنظيم: يمكن أن يساعد في تنظيم الكود بشكل أفضل من خلال تجميع الوظائف ذات الصلة في واجهة واحدة.
- المراجع
https://refactoring.guru/design-patterns/facade
https://www.geeksforgeeks.org/facade-design-pattern-introduction/?ref=lbp