تعد المولدات إحدى أقوى الوظائف في JavaScript، مما يسمح لنا بكتابة التعليمات البرمجية التي يمكن إيقافها مؤقتًا واستئنافها حسب الحاجة. على عكس الوظائف العادية التي تنفذ جميع التعليمات البرمجية في وقت واحد، تستخدم المولدات التنفيذ البطيء، وإرجاع القيم بشكل متزايد، مما يسهل العمل مع تسلسل البيانات، أو التكرارات، أو العمليات طويلة الأمد.
في جافا سكريبت، يتم تعريف المولدات باستخدام الكلمة الأساسية function*، ودمجها مع الكلمة الأساسية الإنتاجية، مما يسمح بتنفيذ وظيفة في أجزاء. في كل مرة نستدعي فيها وظيفة المولد، لا يتم تنفيذها على الفور، ولكنها تُرجع مكررًا يسمح بالتنفيذ المتحكم فيه.
مثال:
const id = (function* () { let i = 1; while (true) { yield i; i = 1; } })();
في هذا المثال، يقوم منشئ الدالة بإرجاع تسلسل لا نهائي من الأرقام، حيث يتم إنشاء كل رقم وإرجاعه فقط عند الحاجة.
توقف الكلمة الرئيسية الإنتاجية تنفيذ المولد وتعيد القيمة إلى العالم الخارجي. في استدعاء الوظيفة التالي (باستخدام التالي ())، يستمر المولد من حيث توقف.
كيف يبدو استدعاء المولد:
console.log(id.next().value); // 1 console.log(id.next().value); // 2 console.log(id.next().value); // 3
يُرجع كل استدعاء إلى next() القيمة التالية للمصفوفة ويوقف الوظيفة مؤقتًا عند العائد التالي.
الكسل:
لا تقوم المولدات بتنفيذ كل شيء مرة واحدة، ولكنها تنتج القيم فقط عند الحاجة إليها. يعد هذا مثاليًا للعمل مع تسلسلات لا نهائية أو صفائف كبيرة من البيانات.
التحكم في التدفق:
تتيح إمكانية إيقاف الوظيفة مؤقتًا واستئنافها تحكمًا أفضل في العمليات طويلة الأمد.
كفاءة:
بدلاً من تخزين جميع القيم في الذاكرة، تقوم المولدات بإرجاع قيمة واحدة في كل مرة، مما يقلل من استهلاك الذاكرة.
على الرغم من أن المولدات مفيدة، إلا أن لديها العديد من المشاكل المحتملة:
التحكم في التدفق المعقد:
قد يؤدي الإيقاف المؤقت والاستئناف إلى زيادة صعوبة فهم التعليمات البرمجية وتصحيح الأخطاء، خاصة في السيناريوهات المعقدة.
أداء:
في بعض الحالات، قد يؤدي الإيقاف المؤقت للتعليمات البرمجية واستئنافها إلى زيادة الحمل، مما قد يقلل من الكفاءة.
محدود:
يتم إرجاع قيمة واحدة لكل مكالمة، وهو ما قد يكون غير فعال إذا كان هناك حاجة للوصول إلى الكثير من البيانات في وقت واحد.
التوافق:
تعد المولدات جزءًا من معيار ECMAScript 2015 (ES6)، لذا قد لا تدعمها المتصفحات القديمة بدون أدوات إضافية مثل Babel.
إذا كانت المولدات تقدم الكثير من التعقيد، فيمكنك التفكير في البدائل:
وظائف متكررة مع رد الاتصال:
function generateID(callback, start = 1) { callback(start); setTimeout(() => generateID(callback, start 1), 0); }
المزايا:
تحكم أسهل في التدفق: على الرغم من أنها تستخدم التكرار، إلا أن الوظيفة أكثر قابلية للقراءة والوضوح من حيث التحكم في تدفق البرنامج.
التنفيذ غير المتزامن: يؤدي استخدام setTimeout إلى تمكين التشغيل غير المتزامن، مما يساعد في الحفاظ على الأداء.
العيوب:
الحمل العودي: بالنسبة لعدد كبير جدًا من التكرارات، قد تحدث مشكلات العودية (تجاوز سعة المكدس).
الحلقات:
قد تكون الحلقات البسيطة التي تولد عددًا محددًا مسبقًا من القيم خيارًا أكثر كفاءة للمصفوفات الأصغر.
function generateIDs(limit) { const ids = []; for (let i = 1; i
المزايا:
التنفيذ البسيط: هذا الحل سهل الفهم وليس به أي مشاكل في التحكم في التدفق.
إنشاء سريع: يتم إنشاء جميع القيم مرة واحدة، وهو ما يمكن أن يكون أكثر كفاءة لعدد أقل من التكرارات.
العيوب:
استهلاك الذاكرة: يتم تخزين جميع القيم في الذاكرة، الأمر الذي قد يشكل مشكلة بالنسبة للمصفوفات الكبيرة.
لا داعي للكسل: يتم إنشاء جميع المعرفات مسبقًا، الأمر الذي قد يكون غير فعال إذا لم تكن بحاجة إليها كلها.
المكررون:
الكائنات التي تُرجع قيمًا قابلة للتكرار من خلال طريقة .next()، تشبه المولدات، ولكن مع مزيد من التحكم.
function createIDIterator() { let i = 1; return { next() { return { value: i , done: false }; } }; } const idIterator = createIDIterator(); console.log(idIterator.next().value); // 1 console.log(idIterator.next().value); // 2 console.log(idIterator.next().value); // 3
المزايا:
التحكم في التدفق: لديه وظيفة مشابهة للمولد، ولكن التنفيذ أكثر خطية.
تعليمات برمجية أبسط: لا توجد نتائج، مما يجعل متابعة التعليمات البرمجية أسهل.
العيوب:
لا يوجد إيقاف مؤقت تلقائي: يجب عليك إدارة التكرارات يدويًا، الأمر الذي قد يكون غير مريح في بعض الحالات.
إنشاء غير متزامن مع غير متزامن/انتظار
إذا تم إنشاء المعرفات بشكل غير متزامن، فيمكنك استخدام غير متزامن/انتظار مع وظيفة ترجع الوعود.
async function generateID(start = 1) { let i = start; while (true) { await new Promise((resolve) => setTimeout(resolve, 0)); console.log(i ); } } generateID();
المزايا:
التنفيذ غير المتزامن: معالجة فعالة للعمليات طويلة الأمد دون عرقلة التدفق الرئيسي للتنفيذ.
بناء الجملة الحديث: غير المتزامن/الانتظار هو طريقة أكثر حداثة وبديهية للعمل مع التعليمات البرمجية غير المتزامنة.
العيوب:
غير مناسب للتعليمات البرمجية المتزامنة: إذا كنت بحاجة إلى إنشاء متزامن، فهذا الحل ليس مثاليًا.
تعد المولدات أداة رائعة للعمل مع صفائف كبيرة وغير محدودة من البيانات، بالإضافة إلى التحكم في التدفق في التطبيقات التي تتطلب إيقاف العمليات مؤقتًا واستئنافها. ومع ذلك، فإن تعقيدها ومشاكل الأداء المحتملة تعني أنه يجب استخدامها بحذر. قد تكون الحلول البديلة مثل التكرارات أو العودية أو التعليمات البرمجية غير المتزامنة أكثر ملاءمة اعتمادًا على متطلبات التطبيق.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3