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

الغرض من هذا المقال هو جذب اهتمام القراء بنوع من العرض الرسمي للمعرفة في مجال تطوير البرمجيات ، وإظهار فكرة تصميم أنماطهم ووصف العديد من الأنماط المثيرة للاهتمام من حيث أنهم يجدون تطبيقًا في تطوير جافا سكريبت الحديث.
نمط سينغلتون
▍ عام
لا يمكن تسمية نمط التصميم "المفرد" ، والذي يُطلق عليه أيضًا "المفرد" ، بأحد الأنماط الأكثر استخدامًا ، لكننا نبدأ المحادثة معه ، نظرًا لأنه من السهل نسبيًا فهمها.
ينمو هذا النمط من المفهوم الرياضي لفرد مفرد - مجموعة مفردة ، أي مجموعة تحتوي على عنصر واحد فقط. على سبيل المثال ، المجموعة {null} عبارة عن مفردة.
في مجال تطوير البرمجيات ، يعود معنى نمط "المفرد" إلى حقيقة أننا نقتصر على عدد المثيلات المحتملة لفئة معينة على كائن واحد. في أول محاولة لإنشاء كائن بناءً على فصل دراسي يقوم بتنفيذ هذا النمط ، يتم إنشاء هذا الكائن بالفعل. جميع المحاولات اللاحقة لإنشاء مثيل للفئة ستُرجع الكائن الذي تم إنشاؤه أثناء المحاولة الأولى للحصول على مثيل للفئة.
لماذا بطل آخر عندما يكون لدينا باتمان؟أعلاه مثال على فئة تنفذ نموذج المفرد.
is لماذا هو مطلوب؟
من الواضح أن هذا النمط يسمح لنا بأن نقصر أنفسنا على "بطل خارق" واحد فقط (وهذا واضح باتمان). ولكن لماذا قد يحتاجها؟
على الرغم من أن هذا النمط لا يخلو من مشاكله الخاصة (كان يطلق عليه في السابق الشر ، بالنظر إلى حقيقة أن المفرد يسمى
الكذابين المرضيين ) ، فإنه في بعض الحالات ، يمكن أن يكون مفيدًا للغاية. أحد هذه المواقف هو تهيئة كائنات التكوين. في تطبيق نموذجي ، من المنطقي الاحتفاظ بمثيل واحد فقط من هذا الكائن ، ما لم يتم استخدام العديد من الكائنات المتشابهة فيه ، طبقًا لميزات المشروع.
to أين أستخدمها؟
المثال الرئيسي لاستخدام نمط المفرد في الأطر الشعبية الكبيرة هو الخدمات الزاوية. تحتوي الوثائق الزاوية على
صفحة منفصلة تشرح كيفية جعل الخدمة مفردة.
يحمل تصميم الخدمات في شكل مفردات معنى عميقًا ، حيث يتم استخدام الخدمات كمستودعات للحالة والتكوين وتتيح لك تنظيم التفاعل بين المكونات. كل هذا يؤدي إلى حقيقة أن المطور يحتاج حتى لا يحتوي تطبيقه على العديد من مثيلات الخدمة ذاتها.
النظر في مثال. لنفترض أن لدينا تطبيقًا بسيطًا يُستخدم لحساب عدد النقرات على الأزرار.
كل نقرة على أي من الأزرار تحديث العداديجب تخزين عدد النقرات على الأزرار في كائن واحد ، والذي ينفذ الميزات التالية:
- انها تسمح لك لحساب النقرات على الأزرار.
- يجعل من الممكن قراءة القيمة الحالية لعداد النقرات.
إذا لم يكن مثل هذا الكائن مفردًا (وكان لكل زر مثيل خاص به لمثل هذا الكائن) ، فسيحسب البرنامج عدد النقرات على الأزرار بشكل غير صحيح. بالإضافة إلى ذلك ، من خلال هذا النهج ، من الضروري حل المشكلة التالية: "من أي كائن معين مسؤول عن حساب النقرات سيتم أخذ البيانات المعروضة على الشاشة؟"
نمط المراقب
▍ عام
نمط المراقب هو نمط تصميم يحتفظ فيه كائن يسمى الموضوع بقائمة من الكائنات التابعة تسمى المراقب ويقوم بإعلامهم تلقائيًا عندما تتغير حالتهم ، عادةً عن طريق استدعاء إحدى طرقهم .
فهم هذا النمط ليس صعبًا إذا وجدت تشبيهه في العالم الحقيقي. وهي نتحدث عن اشتراكات الصحف.
لنفترض أنك عادة تشتري الصحف من كشك. تذهب إلى هناك ، وتسأل عما إذا كان هناك إصدار جديد من جريدتك المفضلة. إذا لم يكن ما تحتاجه موجودًا في الكشك ، فحينئذٍ تذهب إلى المنزل ، وتضيع الوقت ثم تذهب إلى الكشك مجددًا. إذا اعتبرنا هذا الموقف مطبقًا على JavaScript ، فسيكون ذلك بمثابة استطلاع دوري لبعض الكيانات ، يتم إجراؤه حتى يتم استلام البيانات اللازمة منه.
بعد ذلك ، عندما تحصل في النهاية على الصحيفة التي تحتاجها ، يمكنك المتابعة إلى ما كنت تسعى إليه طوال هذا الوقت - تناول كوبًا من القهوة وتوسيع الصحيفة. في جافا سكريبت ، سيكون هذا بمثابة استدعاء معاودة الاتصال ، والتي كنا سنقوم بالاتصال بها بعد الحصول على النتيجة المرجوة.
وأخيرا يمكنك قراءة الصحيفةسيكون من المعقول إجراء ذلك: الاشتراك في إحدى الصحف وتلقي آخر إصدار لها كل يوم. من خلال هذا النهج ، سيعلمك الناشر بأنه قد تم إصدار عدد جديد من الصحيفة وتقديمه لك. لم تعد بحاجة إلى الذهاب إلى الكشك بعد الآن. لا مزيد من إضاعة الوقت.
إذا قمت بالتبديل إلى JavaScript مرة أخرى ، فهذا يعني أنه لم يعد عليك الانتظار في الحلقة للحصول على بعض النتائج ، وبعد تلقيها ، اتصل بوظيفة معينة. بدلاً من ذلك ، تقوم بإبلاغ الموضوع بأنك مهتم بأحداث معينة (رسائل) ، وتقوم بتمرير وظيفة رد الاتصال إليه ، والتي يجب استدعاؤها عندما تكون بيانات الاهتمام جاهزة. أنت ، في هذه الحالة ، تصبح مراقبًا.
الآن لن تفوتك جريدة الصباح المفضلة لديكيحتوي النمط المعني على ميزة واحدة لطيفة: ليس عليك أن تكون المراقب الوحيد. إذا لم تتمكن من الحصول على جريدتك المفضلة ، فسوف يزعجك. ولكن نفس الشيء سيحدث للأشخاص الآخرين الذين لا يستطيعون شرائه. هذا هو السبب في أن العديد من المراقبين يمكنهم الاشتراك في موضوع واحد.
is لماذا هو مطلوب؟
يتم استخدام النمط "المراقب" في العديد من المواقف ، ولكن عادة يجب استخدامه عندما تريد إنشاء علاقة رأس بأطراف بين الكائنات ، وفي الوقت نفسه ، يجب ألا تكون هذه الكائنات متصلة بقوة. بالإضافة إلى ذلك ، يجب أن يكون النظام قادرًا على إخطار عدد غير محدود من الكائنات ببعض التغييرات.
تُعد تطبيقات JavaScript مكانًا رائعًا لتطبيق نمط المراقبة ، نظرًا لأن كل شيء يتم تشغيله هنا ، وبدلاً من الإشارة باستمرار إلى كيان معين لمعرفة ما إذا كان حدث قد أثار اهتمامك ، سيكون من الأفضل بكثير إعلامه عندما حدوث هذا الحدث (يشبه هذا القول القديم: "لا تتصل بنا. عند الضرورة ، سوف ندعو أنفسنا").
من المحتمل أنك استخدمت بالفعل تصميمات تشبه نمط المراقب. على سبيل المثال ، هذا هو
addEventListener
. إضافة مستمع حدث إلى عنصر يحتوي على كل علامات استخدام نمط المراقب:
- يمكنك الاشتراك في الكائن.
- يمكنك إلغاء الاشتراك من الكائن.
- يمكن للكائن إبلاغ جميع المشتركين فيه بالحدث.
من المفيد معرفة وجود نمط "المراقب" بمعنى أن هذه المعرفة تتيح لك إدراك موضوعك الخاص ، أو أسرع بكثير من ذي قبل ، لمعرفة حل قائم باستخدام هذا النمط.
to أين أستخدمها؟
لا يجب أن يكون التنفيذ الأساسي لهذا النمط معقدًا بشكل خاص ، ولكن هناك مكتبات ممتازة تقوم بتنفيذه وتستخدم في العديد من المشاريع. نحن نتحدث عن مشروع
ReactiveX ، وإصدار جافا سكريبت من
RxJS .
لا تتيح مكتبة RxJS الاشتراك في الموضوعات فحسب ، بل تتيح أيضًا للمبرمج القدرة على تحويل البيانات بعدة طرق ، كما يتيح لك إمكانية الجمع بين العديد من الاشتراكات ، وتحسين القدرة على إدارة العمليات غير المتزامنة. بالإضافة إلى ذلك ، لا تقتصر قدراتها على هذا. إذا كنت ترغب في أي وقت مضى في زيادة قدرات برامجك على معالجة البيانات وتحويلها إلى مستوى أعلى ، فيمكنك التوصية بدراسة مكتبة RxJS.
بالإضافة إلى نمط "المراقب" ، يمكن أن يفخر مشروع ReactiveX بتنفيذ نمط "التكرار" ، والذي يسمح للموضوع بإبلاغ المشتركين حول إتمام الاشتراك ، في جوهره ، مما يسمح بإلغاء الاشتراك بناءً على مبادرة الموضوع. لن أتحدث في هذا المقال عن نمط "التكرار" ، لكن يمكنني القول أنه إذا كنت قد بدأت للتو في تعلم أنماط التصميم ، فإن دراسة هذا النمط والتفكير في كيفية تكوينه مع نمط "المراقب" يمكن أن يكون تمرينات جيدة.
نمط الواجهة
▍ عام
حصلت على نمط الواجهة اسمها من الهندسة المعمارية. في الهندسة المعمارية ، تكون الواجهة عادةً واحدة من الجوانب الخارجية للمبنى ، وعادة ما تكون الواجهة الأمامية. استعارت اللغة الإنجليزية كلمة "الواجهة" من الفرنسية. نحن نتحدث عن كلمة "الواجهة" ، والتي ، من بين أمور أخرى ، تترجم إلى "الجانب الأمامي من المبنى".
واجهة المبنى في العمارة هي الواجهة الخارجية للمبنى ، حيث تخفي ما بداخلها. يمكن ملاحظة خصائص مماثلة في نمط "الواجهة" ، لأنه يهدف إلى إخفاء الآليات الداخلية المعقدة خلف واجهة خارجية معينة. يتيح تطبيقه للمطور العمل باستخدام واجهة برمجة تطبيقات خارجية ، مرتبة ببساطة ، وفي الوقت نفسه ، يوفر القدرة على تغيير الآليات الداخلية المخفية وراء الواجهة ، دون الإخلال بأداء النظام.
is لماذا هو مطلوب؟
يمكن استخدام نمط "الواجهة" في عدد كبير من المواقف ، من بينها يمكننا أن نلاحظ بشكل خاص تلك عندما يحاولون جعل الكود أسهل في الفهم (أي أنهم يختبئون آليات معقدة خلف واجهات برمجة التطبيقات البسيطة) ، وتلك التي عندما تميل شظايا الأنظمة إلى تحقيق أكبر قدر ممكن أكثر مرونة متصلة مع بعضها البعض.
هذه الأشياء تحتاج إلى شيء من عرين التنين.من السهل أن نرى أن كائن الواجهة (أو طبقة بها عدة كائنات) هو عبارة عن تجريد مفيد للغاية. من غير المحتمل أن يرغب أي شخص في الدخول في تنين إذا أمكن تجنب ذلك. مطلوب كائن الواجهة من أجل توفير كائنات أخرى مع API مريحة ، وهذا الكائن سوف تتعامل مع جميع الحيل التنين من تلقاء نفسها.
ميزة أخرى مفيدة لنمط "الواجهة" هي أن التنين يمكن أن يكون "مجددًا" حسب الرغبة ، لكن هذا لن يؤثر على أجزاء أخرى من التطبيق. افترض أنك تريد استبدال تنين بقطة صغيرة. القط ، مثل التنين ، لديه مخالب ، ولكن من الأسهل إطعامها. تغيير التنين إلى هريرة - وهذا يعني - لإعادة كتابة رمز كائن الواجهة دون إجراء تغييرات على الكائنات التابعة.
to أين أستخدمها؟
غالبًا ما يوجد نمط الواجهة في الزاوي. هناك ، يتم استخدام الخدمات كوسيلة لتبسيط بعض المنطق الأساسي. ولكن هذا النموذج ينطبق ليس فقط في الزاوي ، أدناه يمكنك أن ترى هذا.
لنفترض أننا بحاجة إلى إضافة نظام إدارة الحالة إلى التطبيق. لحل هذه المشكلة ، يمكنك استخدام أدوات متنوعة ، من بينها - أدوات Redux و NgRx و Akita و MobX و Apollo وكذلك - أدوات جديدة ناشئة باستمرار. لماذا لا نجربهم جميعا؟
ما هي الوظيفة الرئيسية التي ينبغي أن توفرها مكتبة إدارة الدولة؟ ربما هذه هي الميزات التالية:
- آلية لإخطار نظام إدارة الدولة أننا بحاجة إلى تغيير الحالة.
- آلية الحصول على الحالة الحالية أو جزءها.
كل شيء لا يبدو سيئا للغاية.
الآن ، مع وجود نمط "الواجهة" ، يمكنك كتابة واجهات للعمل مع أجزاء مختلفة من الولاية ، مما يوفر واجهات برمجة تطبيقات ملائمة يمكن استخدامها في البرنامج. على سبيل المثال ، شيء مثل
facade.startSpinner()
،
facade.stopSpinner()
و
facade.getSpinnerState()
. هذه الطرق سهلة الفهم ، يمكنك الرجوع إليها بسهولة في محادثة حول البرنامج.
بعد ذلك ، يمكنك العمل مع الكائنات التي تنفذ نمط "الواجهة" وكتابة التعليمات البرمجية التي ستحول التعليمات البرمجية الخاصة بك بحيث يمكن أن تعمل مع Apollo (إدارة الحالة مع GraphQL هي موضوع ساخن). ربما ستجد خلال الاختبارات أن Apollo غير مناسب لك ، أو أنك غير مريح اختبارات وحدة الكتابة بناءً على نظام إدارة الحالة هذا. لا مشكلة - اكتب واجهة جديدة مصممة لدعم MobX ، وحاول النظام مرة أخرى.
يمكن أيضًا أن تكون أنظمة مختلفة لإدارة حالة التطبيق ، التي يتم الوصول إليها من خلال واجهة واحدة ، تنانين ...النتائج
ربما لاحظت أنه عندما تحدثنا عن أنماط التصميم ، لم نأخذ بعين الاعتبار أمثلة الكود. والحقيقة هي أن التحليل العميق لكل نمط يرسم فصلًا منفصلاً على الأقل في أبعد ما يكون عن أنحف كتاب. بالمناسبة ، نظرًا لأننا نتحدث عن الكتب ،
فلدينا هنا منشورات مثيرة للاهتمام يمكنك أن تبحث فيها عن أولئك الذين يريدون الخوض في دراسة الأنماط.
في النهاية ، أود أن أقول أنه في تطور الأنماط ، لا شيء يفوق البحث على الإنترنت ، ويقرأ الأفكار المختلفة ويختبرها بشكل مستقل. حتى لو اتضح أنك لن تستخدم أبدًا أنماطًا ، فسوف تفهم شيئًا جديدًا وتتعلم عنها وتنمو في مناطق غير متوقعة بالنسبة لك.
أعزائي القراء! ما أنماط التصميم التي تستخدمها؟
