الوحدات الأساسية المخصَّصة: دليل النمط

على مرّ السنين، تعلّم فريق Bluely وBlockly Games العديد من الدروس التي يمكن تطبيقها على اللاعبين الذين يطوّرون وحدات جديدة. فيما يلي مجموعة من الأخطاء التي ارتكبناها أو الأخطاء الشائعة التي يرتكبها الآخرون.

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

1- الفرق بين العبارات الشرطية والتكرارات الحلقية

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

اقتراح: الفصل بين الشرطات والحلقات الحلقية

2. القوائم القائمة على واحد

يتفاعل المبرمجون المبتدئون بشكل سيئ عندما يواجهون قوائم قائمة على صفر لأول مرة. نتيجةً لذلك، تتّبع قناة Blockly قيادة Lua وLambda Moo من خلال جعل فهرسة القائمة والسلسلة مستندة إلى عنصر واحد.

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

اقتراح: الرقم الأول هو الرقم الأول.

3. البيانات التي أدخلها المستخدم

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

اقتراح: اختيار أسلوب إدخال مناسب للمستخدمين

4. صور قابلة للتعديل

يجب أن تتضمن وثائق الكتل صورًا للكتل التي تشير إليها. من السهل التقاط لقطات شاشة. ولكن في حال وجود 50 صورة من هذا النوع، وتمت ترجمة التطبيق إلى 50 لغة، فستحتوي إحدى الصور وفجأة على 2,500 صورة ثابتة. ثم يتغير نظام الألوان، وهناك 2500 صورة تحتاج إلى التحديث -- مرة أخرى.

ولاستخراج أنفسنا من كارثة أعمال الصيانة هذه، استبدلت شركةBlockly Games جميع لقطات الشاشة بمثيلات تشغيل Blockly في وضع القراءة فقط. تبدو النتيجة متطابقة مع الصورة، ولكنها مضمونة أنها حديثة. جعل وضع "للقراءة فقط" يجعل التدويل ممكنًا.

اقتراح: إذا كنت تتيح استخدام أكثر من لغة، استخدِم وضع القراءة فقط.

5. الباقي على اليسار

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

اقتراح: نص ملحق يتضمّن رموز يونيكود متى أمكن.

6. مجموعات عالية المستوى

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

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

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

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

7. قيم إرجاع اختيارية

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

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

بشكل عام، لا تعمل اللغات المستندة إلى الحظر على تجاهل أي قيمة معروضة. يجب أن يتم توصيل كتلة القيمة بشيء يقبل القيمة. هناك العديد من الاستراتيجيات للتعامل مع هذه المشكلة.

أ) وجِّه المشكلة. فأغلب اللغات القائمة على الكتل تصمم اللغة لتجنب هذه الحالات. على سبيل المثال، لا تحتوي Scratch على أي قوالب لها آثار جانبية وقيمة معروضة.

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

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

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

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

8. مربّعات النمو

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

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

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

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

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

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

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

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

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

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

9. إنشاء رموز واضحة

يجب أن يتمكّن مستخدمو تطبيق Openly المتقدمون من الاطّلاع على الرمز الذي تم إنشاؤه (JavaScript وPython وPHP وLua وDart، وغيرها) والتعرّف على البرنامج الذي كتبوه على الفور. وهو ما يعني ضرورة بذل المزيد من الجهد لجعل الرمز الذي تم إنشاؤه آليًا قابلاً للقراءة. تعيق الأقواس الزائدة والمتغيرات الرقمية والمسافة البيضاء المحمولة وقوالب التعليمات البرمجية المطوَّلة إنشاء تعليمة برمجية أنيقة. ويجب أن يتضمّن الرمز الذي يتم إنشاؤه تعليقات وأن يتوافق مع أدلة الأسلوب من Google.

اقتراح: كُن فخورًا بالرمز الذي أنشأته. اعرضها للمستخدم.

‫10. اعتماد اللغة

من الآثار الجانبية للرغبة في الحصول على تعليمات برمجية نظيفة أنّ سلوك تطبيق Blockly يتم تعريفه بشكل كبير من حيث سلوك اللغة التي تم تجميعها من قِبلها. إنّ لغة الإخراج الأكثر شيوعًا هي JavaScript، ولكن إذا تم تجميع بيانات الحظر بلغة مختلفة، يجب عدم إجراء محاولات غير معقولة للحفاظ على السلوك الدقيق لكلتا اللغتَين. على سبيل المثال، في JavaScript، تكون السلسلة الفارغة false، بينما في Lua تكون صحيحة. قد يؤدي تحديد نمط واحد لسلوك تنفيذ التعليمات البرمجية لـBlockly بغض النظر عن اللغة الهدف إلى إنشاء تعليمات برمجية غير قابلة للصيانة تبدو وكأنها خرجت من برنامج تجميع GWT.

اقتراح: حظر ليست لغة، والسماح للّغة الحالية بالتأثير في السلوك.