عمليات التصفية والخريطة وتقليل العمليات
تطوير كود فعال وسريع وعملي باستخدام عمليات التصفية والخريطة والتقليل.
أقارن دائمًا هذه العمليات بإعداد وجبة. بهذه الطريقة يصبح أكثر لا تنسى. سأدخل في الموضوع سريعًا، واسمحوا لي أن أبدأ بإخباركم عن كيفية ترميز الميلمين.
لتحضير الميلمين، سنستخدم العديد من المكونات في مطبخنا بنسب معينة. إذن، ما هي المواد التي سنستخدمها؟ تقوم الدالة arrayFilter بهذه العملية، أي أنها تستخرج البيانات التي نحتاجها من جميع البيانات المتوفرة لدينا. لذا، هناك حاجة إلى وظيفة التصفية للعثور على الملح والزيت والطماطم والفلفل والبيض الذي سنستخدمه في المليمين. قد تحتوي البيانات التي لم تتم تصفيتها على أشياء لا نريدها، تمامًا مثل مطبخنا. لدينا الآن المواد. فهل نضعهم في وعاء وننتظر حتى ينضجوا؟ لا، نحن بالتأكيد بحاجة إلى تقطيع الطماطم والفلفل وكسر البيضة. لهذا نحن بحاجة إلى استخدام وظيفة arrayMap. تقوم عملية الخريطة بمعالجة البيانات وتحويلها إلى نوع أو نتيجة أخرى. وبعبارة أخرى، فإن العمليات مثل تقطيع الطماطم تنتمي إلى وظيفة الخريطة. إذا فكرنا في ذلك كبيانات، فيمكننا القول أن مبلغ ضريبة القيمة المضافة سنجده نتيجة ضرب معدل ضريبة القيمة المضافة والمبلغ الصافي. في الواقع، مبلغ ضريبة القيمة المضافة ليس قيمة بل نتيجة. أو يجب معالجة البيانات التي تمت معالجتها داخل الصف، مثل الإجمالي الصافي للصف، باستخدام الخريطة. نعم، لقد قمنا الآن بمعالجة المكونات من مكوناتنا، أي أننا نقطع الطماطم والفلفل ونكسر البيضة. الآن حان الوقت لجزء الطبخ. التقليل هو القضية الرئيسية التي يجب الانتباه إليها هنا. لأن النتيجة التي تم الحصول عليها نتيجة عملية التخفيض لم تعد تؤدي إلى أي من النتائج الأولية. لذلك، عندما تقوم بطهي الميلمين، لم نعد نسميه النسخة المطبوخة من الطماطم والفلفل والبيض والزيت والملح، بل نسميه مباشرة الميلمين. يؤدي تقليل إلى نتيجة فريدة على سلسلة بيانات. على سبيل المثال، يمكننا أن نقول مجموع بنود الفاتورة. في بعض الأحيان يمكن أيضًا تجميعها، على سبيل المثال الإجماليات وفقًا لمعدلات ضريبة القيمة المضافة. وهنا، حتى لو تم إنشاء أكثر من بيانات نتيجة التجميع، فلا يمكن العودة إلى البيانات الرئيسية ونتيجة لذلك، يتم إنشاء بيانات جديدة. أنا لست جيدًا في الوصفات، لو كنت كذلك، لكنت قمت بنشر كتاب طبخ، لأنه سيكون عملًا أفضل من هذا البرنامج :)
معلومات أولية عن الوظائف التي تبدأ بالقائمة والمصفوفة
إذا رأيت وظائف ذات بادئات قائمة ومصفوفة لها نفس الوظيفة اللاحقة، فاختر تلك التي تبدأ بالمصفوفة. على سبيل المثال، تقوم الدالتان arrayFilter وlistFilter بإجراء التصفية على المصفوفات والقوائم. لكن القائمة في الواقع عبارة عن مصفوفة افتراضية. في كل مرة، يتم تحويل القائمة إلى مصفوفة، ويتم تنفيذ العملية، ثم يتم تحويل القائمة مرة أخرى. لهذا السبب، حتى لو تم استخدام النتيجة كقائمة، فيجب علينا تنفيذ العملية من خلال مصفوفة، وإذا كانت القيمة الأولية لدينا هي قائمة، فيجب علينا تحويلها إلى مصفوفة باستخدام listToArray، وبعد اكتمال جميع العمليات، يجب تحويلها مرة أخرى إلى قائمة. من الضروري تحويل القوائم إلى مصفوفات في كل مرة ومنع تحويلها إلى قوائم مرة أخرى. ولهذا السبب سيتم شرح موضوعنا من خلال دوال المصفوفة المسبوقة.
arrayFilter(array, function(element [,index [,array]])) array
تسمح وظيفة التصفية بالمعالجة عن طريق إرسال جميع العناصر الموجودة في المصفوفة واحدًا تلو الآخر إلى الوظيفة المعطاة في المعلمة الثانية. يتم تمرير عناصر المصفوفة إلى الدالة من خلال متغير العنصر، والرقم التسلسلي من خلال الفهرس، والفهرس الرئيسي من خلال متغير المصفوفة. على الأقل يجب تحديد متغير العنصر في الوظيفة المراد كتابتها، ولا يلزم تحديد المتغيرات الأخرى.
يتم تصفيته عمومًا عن طريق تصفية العناصر الموجودة في المصفوفة. على سبيل المثال، يبحث عن فواتير باسم العميل "Halit". لهذا، إذا أردنا تحديد السجلات بحقل العميل "Halit" من مصفوفة تسمى الفواتير، فيمكننا استخدامها على النحو التالي.
النقطة التي يجب ملاحظتها هي أن جميع الوظائف التي يتم إرجاع النتيجة فيها بشكل منطقي يمكن أن تعمل لهذه العملية. بمعنى آخر، يتم استخدامه في عمليات أكثر تعقيدًا مثل العمليات التي يتم إجراؤها في كتلة دالة والنتيجة تتجاوز قيمة معينة. ومع ذلك، فإن النقطة التي يجب ألا ننسىها هي أنه إذا كان من الممكن استخدام القيمة المراد حسابها والتحكم فيها في المرشح لاحقًا، فسيكون من المناسب حساب البيانات أولاً عن طريق التعيين ثم تقليلها إلى مستوى المرشح البسيط. ولكن إذا تمت تصفية نتيجة الحساب فقط، فإن إنشاء خريطة قد يعني إنتاج بيانات إضافية. أود أن ألفت انتباهك إلى حقيقة أننا لم نستخدم الفهرس والمصفوفة الرئيسية مرة أخرى في هذا المثال.
arrayMap(array, function(element [,index [,array]])) array
تنشئ وظيفة الخريطة قيمة جديدة عن طريق إرسال جميع العناصر الموجودة في المصفوفة واحدًا تلو الآخر إلى الوظيفة المعطاة في المعلمة الثانية. يتم تمرير عناصر المصفوفة إلى الدالة من خلال متغير العنصر، والرقم التسلسلي من خلال الفهرس، والفهرس الرئيسي من خلال متغير المصفوفة. على الأقل يجب تحديد متغير العنصر في الوظيفة المراد كتابتها، ولا يلزم تحديد المتغيرات الأخرى. تتم إضافة القيمة الجديدة التي تم إنشاؤها هنا إلى مصفوفة النتائج بنفس الفهرس. قد يكون العنصر المراد إضافته متغيرًا جديدًا أو نسخة معدلة من المتغير الموجود.
ويستخدم بشكل عام في العمليات التي يتم فيها الحصول على النتيجة عن طريق الحساب. يمكننا استخدامه في عمليات مثل العثور على مبلغ ضريبة القيمة المضافة عن طريق ضرب إجمالي الصف في معدل ضريبة القيمة المضافة، كما في المثال الذي قدمته من قبل. على سبيل المثال، لنضع حقلي الإجمالي وضريبة القيمة المضافة في مصفوفة ونقوم بحساب حقل vat_amount وإضافته إلى هذا السطر.
في هذا المثال، تم حساب حقل vat_amount لكل عنصر في مصفوفة bill_satirlar، وإضافته إلى البنية الموجودة، وتم تحويل البنية الموجودة والمضافة كقيمة جديدة. تم نقل النتيجة إلى نفس المتغير، وقد تم ذلك لأنه تم تعديل نفس المتغير (أي أن القيم الموجودة لم تتلف). ومن المعقول أن تتم الصفقة بهذه الطريقة. ومع ذلك، إذا كنت تفعل شيئًا من شأنه أن يجعل العناصر الموجودة في المصفوفة مختلفة عن العناصر القديمة، فقد يكون تعيينها لمتغير المصفوفة القديم خطوة خاطئة. على سبيل المثال، يمكننا تحويل قيم TL في المصفوفة إلى USD واستيرادها إلى مصفوفة جديدة.
arrayReduce(array, function(result, element [, Index [, array]]) [,initial_value]) any
ترسل دالة Reduce كل عنصر في المصفوفة إلى الدالة، وتعيينه إلى القيمة الناتجة وترجع القيمة الناتجة كنتيجة. على الرغم من أن هذه العملية مربكة بعض الشيء، إلا أنه يمكننا في الواقع مقارنتها بنظام نضيف فيه نتيجة كل سطر إلى القيمة الناتجة ونستدعي الدالة مرة أخرى عن طريق إعطاء قيمة النتيجة الأخيرة.
ويستخدم بشكل عام في عمليات مثل المجموع الفرعي أو تجميع الإجمالي. على سبيل المثال، دعنا نعثر على إجمالي الفاتورة وإجماليات ضريبة القيمة المضافة وفقًا لمعدل ضريبة القيمة المضافة.
في هذا المثال، يتم أخذ كل من إجمالي المنطق العادي وإجمالي منطق التجميع. بينما يتم الوصول إلى النتيجة النهائية عن طريق إضافة قيمة النتيجة في كل مرة في المجموع العادي، في العملية التي يتم تنفيذها عن طريق التجميع، يتم إنشاء بنية أخرى وإرجاعها. النقطة التي يجب مراعاتها هنا هي تعيين قيمة النتيجة مع القيمة الأولية قبل بدء العمليات، نظرًا لأن القيمة الأولية لا تعمل دائمًا بشكل مستقر.
عمليات الأنابيب
يُستخدم هذا المفهوم للعمليات التي تحاول إنتاج النتائج من خلال العمل بشكل تسلسلي ومتشابك. على سبيل المثال، لنأخذ إجمالي مبلغ ضريبة القيمة المضافة العام للبنود غير الترويجية ضمن بنود الفاتورة.
يمكنك استدعاء خريطة التصفية وتقليل العملية مرات لا نهائية بسبب الحاجة المتشابكة، وتصفيتها وحسابها وتصفيتها مرة أخرى وفقًا للحقل المحسوب، وإنشاء نتيجة مجمعة، وحساب هذه النتيجة وتصفيتها وتحويلها إلى نتيجة مرة أخرى. لذلك، مع هذا الثلاثي المتشابك، يمكنك تغيير الرموز بسرعة إلى ما تريد. بالطبع، ليس عليك استخدام الثلاثة، يمكنك تلبية احتياجاتك من خلال عملية ثنائية فقط مثل الفلتر والخريطة، أو يمكنك نقل البيانات الهرمية إلى مستويات أعلى عن طريق حسابها، مثل الخريطة والتقليل.
النهج المناسب
سيدي، يمكنك القول أنه يمكننا حساب هذه العمليات، على سبيل المثال، أثناء إجراء عمليات الحلقة في الجداول، أي طباعة الحقول على الشاشة. ومع ذلك، فإن النقطة المهمة هي التمييز بين النموذج والوجهة النظر.
إن الغرض من الوظائف الثلاث المهمة التي قدمتها في هذا الموضوع والوظائف الأخرى التي لم أعطها هو تشكيل النموذج. بمعنى آخر، سوف يفهم مطورو البرامج الآخرون بوضوح ما هي عمليات الأنابيب التي تقوم بها على النموذج وستكون الحسابات والنتائج التي تجريها في البرنامج الذي طوره المجتمع على مستوى النموذج، وسيعلمون أنه لا توجد عمليات مجمعة مخفية بين HTML والأكواد الأخرى. إذا كان بإمكانك إنهاء العملية قبل الإخراج، فعند إضافة ميزة جديدة، يمكنك إما فتح عقدة أخرى على الأنبوب أو تعيين القيم الضرورية لمتغير جديد. تؤدي المعاملات في عملية الحلقة التقليدية، والتي يشار إليها باسم السباغيتي، إلى رموز يصعب فهمها، أو مليئة بالحسابات التي تم التغاضي عنها، أو محفوفة بالمخاطر ويصعب اقتحامها. يضمن نهج التعليمات البرمجية النظيفة عزل رموز النموذج والعرض عن بعضها البعض وتجميعها قدر الإمكان، حتى لو كانت في نفس الملف. بالإضافة إلى ذلك، تعمل هذه الوظائف على تقليل التعليمات البرمجية والقضاء على حشد المتغيرات الوسيطة التي ستحدث في عملية السباغيتي. سأشرح هذه الوظائف التي يمكن أن تتغلب على بعض القيود في مفهوم الاستعلام والعمل المتشابك مع استعلام الاستعلام، بالتفصيل في مقالتي التي سأنشرها لاحقًا.
بقلم: هاليت يورتاش - هندسة برمجيات Workcube