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

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

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

1. الشرطية مقابل التكرارات الحلقية

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

اقتراح: أبقِ التكرارات الشرطية عن التكرارات الحلقية منفصلة.

2. القوائم الأحادية

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

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

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

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

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

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

4. صور القالب المباشر

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

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

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

5- الجهة اليسرى الأخرى

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

اقتراح: إضافة رموز يونيكود إلى النص حيثما أمكن

6- مربّعات عالية المستوى

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

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

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

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

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

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

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

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

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

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

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

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

الاقتراح: لكل استراتيجية إيجابيات وسلبيات، واختيار ما يناسبها المستخدمين في مؤسستك

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

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

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

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

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

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

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

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

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

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

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

9. إنشاء رموز برمجية سليمة

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

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

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

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

اقتراح: ليست مُستخدَمة في هذه اللغة، لذا يُرجى السماح باللغة الحالية تؤثر في السلوك