تصميم الكتلة

على مرّ السنين، صمم فريق Blockly العديد من الكتل الخاصة به و ساعد الآخرين في تصميم كتل خاصة بهم. في ما يلي بعض الدروس التي اكتسبوها.

تفضيل الوحدات الأساسية ذات المستوى الأعلى

يجب اتّباع نهج أعلى مستوى كلما أمكن، حتى لو كان ذلك يؤدي إلى خفض أداء التنفيذ أو المرونة. فكِّر في تعبير "برمجة تطبيقات Google" التالي:

SpreadsheetApp.getActiveSheet().getDataRange().getValues()

في إطار عملية الربط بنسبة 1:1 التي تحافظ على جميع الإمكانات المحتملة، سيتم إنشاء العبارة أعلاه باستخدام أربع وحدات. ولكن تهدف Blockly إلى مستوى أعلى، وتوفر كتلة واحدة تتضمن التعبير الكامل. والهدف هو تحسين الأداء في الحالات التي تبلغ نسبتها% 95، حتى لو كان ذلك يجعل الأداء في الحالات المتبقية بنسبة% 5 أكثر صعوبة. لا يهدف Blockly إلى استبدال اللغات المستندة إلى النصوص، بل هو مصمّم لمساعدة المستخدمين في التغلب على منحنى التعلّم الأولي حتى يتمكّنوا من استخدام اللغات المستندة إلى النصوص.

اقتراح: لا تحوِّل واجهة برمجة التطبيقات بالكامل إلى مجموعات بشكل أعمى.

التفكير في خيارات إدخال المستخدم

ثلاث وحدات متكررة تعرض طرقًا مختلفة لإدخال رقم: قائمة منسدلة،
حقل رقمي، وإدخال قيمة.

هناك ثلاث طرق للحصول على مَعلمة من المستخدِم. القائمة المنسدلة هي الخيار الأكثر محدودية وهي مناسبة للبرامج التعليمية والتدريبات البسيطة. يسمح حقل الإدخال بمزيد من الحرية وهو مناسب للأنشطة الإبداعية. توفّر إدخال ملف قيمة (عادةً مع ملف ظلّ) فرصة احتساب قيمة (مثل مولد عشوائي) بدلاً من أن تكون قيمة ثابتة فقط.

اقتراح: اختَر طريقة إدخال مناسبة للمستخدمين.

استخدام وحدات شرطية وحلقات منفصلة

مثال مضاد يعرض كتل if/then وwhile في
الفئة نفسها

إنّ الكتل الأكثر صعوبة بالنسبة إلى المستخدمين الجدد هي الشروط والدوالّ المتكرّرة. تُجمِّع العديد من البيئات المستندة إلى الوحدات كلا الكتلتين في فئة "عناصر التحكّم" نفسها، مع أنّ كلا الكتلتين لهما الشكل واللون نفسهما. يؤدي ذلك غالبًا إلى إحباط المستخدمين الجدد بسبب الخلط بين الكتلتين. تنصح Blockly بنقل الشروط والدوالّ إلى فئتَي "المنطق" و"الدوالّ" المنفصلتَين، مع منح كلٍّ منهما لونًا مختلفًا. يوضّح ذلك أنّ هذه أفكار مختلفة تؤدي وظائف مختلفة، على الرغم من أنّ أشكالها متشابهة.

اقتراح: يجب فصل الشروط والدوالّ المتكررة.

التعامل مع عدد متغيّر من مصادر الإدخال

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

(أ) أبسط طريقة هي أن ينشئ المستخدم الكتلة من وحدات أصغر. على سبيل المثال، إضافة ثلاثة أرقام من خلال دمج مجموعتَين من عمليات جمع تشكل كلّ منهما رقمَين. ومن الأمثلة الأخرى توفير كتل if/else فقط، وجعل المستخدم يدمجها لإنشاء شروط elseif.

وحدات الجمع المُدمجة: 1 + (2 + 3).

وتتمثل ميزة هذا النهج في بساطته الأولية (للمستخدم و المطوّر على حد سواء). أما العيب في هذه الطريقة، فهو أنّه في الحالات التي يكون فيها هناك عدد كبير من عمليات التداخل، يصبح الرمز البرمجي صعبًا جدًا على المستخدم قراءة الرمز البرمجي والحفاظ عليه.

(ب) هناك بديل وهو توسيع الكتلة ديناميكيًا بحيث يكون هناك دائمًا إدخال واحد مجاني في النهاية. وبالمثل، تحذف الكتلة الإدخال الأخير إذا كان هناك إدخالان فارغان في النهاية. هذا هو النهج الذي اتّبعه الإصدار الأول من App Inventor.

كتلة تضيف أربعة مدخلات قيم، ويكون المدخل الأخير
فارغًا.

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

ج) لحلّ مشكلة الفجوة، يضيف بعض المطوّرين أزرار +/- إلى الكتل التي تسمح بإضافة مدخلات أو إزالتها يدويًا. يستخدم Open Roberta زرَّين من هذا النوع لإضافة أو إزالة المدخلات من الأسفل. يضيف مطوّرون آخرون زرَّين في كل صف لتوفير إمكانية إدراج العناصر وحذفها من وسط الحزمة. تضيف تطبيقات أخرى زرَّين للانتقال للأعلى/للأسفل في كل صف حتى يمكن ترتيب الحزمة.

عنصر يضيف ثلاثة مدخلات قيم خارجية ويحتوي على زرَّي الجمع والطرح لإضافة المدخلات أو إزالتها

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

د) إنّ الطريقة الأكثر مرونة هي إضافة فقاعة مُعدِّل إلى المربّع. يتم تمثيل هذا الزرّ على أنّه زرّ واحد يفتح مربّع حوار للضبط الخاص بهذا المربّع. يمكن إضافة العناصر أو حذفها أو إعادة ترتيبها حسب الرغبة.

وحدة تضيف ثلاث مدخلات قيم وتتضمّن مُعدِّلًا لإضافة مدخلات قيم أو إزالتها

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

اقتراح: لكل استراتيجية مزايا وعيوب، لذا اختَر ما يناسب المستخدمين.