ब्लॉक का डिज़ाइन

पिछले कुछ सालों में, Blockly की टीम ने कई ब्लॉक डिज़ाइन किए हैं और दूसरों को भी ब्लॉक डिज़ाइन करने में मदद की है. यहां कुछ ऐसी बातें बताई गई हैं जो उन्होंने सीखी हैं.

हाई-लेवल ब्लॉक को प्राथमिकता दें

जहां भी हो सके, वहां बेहतर तरीके का इस्तेमाल किया जाना चाहिए. भले ही, इससे प्रोसेस की परफ़ॉर्मेंस या सुविधाओं में कमी आए. Apps Script के इस एक्सप्रेशन पर विचार करें:

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

सभी संभावित क्षमताओं को बनाए रखने वाली 1:1 मैपिंग के तहत, ऊपर दिया गया एक्सप्रेशन चार ब्लॉक का इस्तेमाल करके बनाया जाएगा. हालांकि, Blockly का मकसद ज़्यादा बेहतर सुविधाएं देना है. साथ ही, यह एक ऐसा ब्लॉक उपलब्ध कराएगा जिसमें पूरा एक्सप्रेशन शामिल होगा. हमारा लक्ष्य, 95% मामलों के लिए ऑप्टिमाइज़ करना है. भले ही, इससे बाकी 5% मामलों को ऑप्टिमाइज़ करना ज़्यादा मुश्किल हो जाए. Blockly का मकसद, टेक्स्ट पर आधारित भाषाओं की जगह लेना नहीं है. इसका मकसद, उपयोगकर्ताओं को शुरुआती सीखने के अनुभव से बाहर निकालना है, ताकि वे टेक्स्ट पर आधारित भाषाओं का इस्तेमाल कर सकें.

सुझाव: अपने पूरे एपीआई को बिना सोचे-समझे ब्लॉक में न बदलें.

उपयोगकर्ता के इनपुट के विकल्पों को ध्यान में रखना

तीन बार दोहराए जाने वाले ब्लॉक, जिनमें संख्या डालने के अलग-अलग तरीके दिखाए गए हैं: ड्रॉप-डाउन, संख्या वाला फ़ील्ड, और वैल्यू इनपुट.

उपयोगकर्ता से पैरामीटर पाने के तीन तरीके हैं. ड्रॉपडाउन सबसे ज़्यादा सीमित होता है. यह आसान ट्यूटोरियल और एक्सरसाइज़ के लिए अच्छा होता है. इनपुट फ़ील्ड की मदद से, ज़्यादा क्रिएटिव गतिविधियां की जा सकती हैं. वैल्यू ब्लॉक इनपुट (आम तौर पर, शैडो ब्लॉक के साथ) से, स्टैटिक वैल्यू के बजाय वैल्यू (उदाहरण के लिए, रैंडम जनरेटर) का हिसाब लगाया जा सकता है.

सुझाव: अपने उपयोगकर्ताओं के हिसाब से इनपुट का तरीका चुनें.

अलग-अलग शर्त वाले और लूप ब्लॉक का इस्तेमाल करना

एक ही कैटगरी में if/then और while ब्लॉक दिखाने वाली काउंटर-उदाहरण.

नए उपयोगकर्ताओं के लिए, शर्तें और लूप सबसे मुश्किल ब्लॉक होते हैं. कई ब्लॉक-आधारित एनवायरमेंट, इन दोनों ब्लॉक को एक ही 'कंट्रोल' कैटगरी में ग्रुप करते हैं. साथ ही, दोनों ब्लॉक का शेप और रंग एक जैसा होता है. इससे अक्सर उपयोगकर्ताओं को परेशानी होती है, क्योंकि नए उपयोगकर्ता इन दोनों ब्लॉक को एक-दूसरे से अलग नहीं कर पाते. Blockly का सुझाव है कि शर्तों और लूप को अलग-अलग 'लॉजिक' और 'लूप' कैटगरी में बांटें. साथ ही, हर कैटगरी के लिए अलग-अलग रंग का इस्तेमाल करें. इससे पता चलता है कि ये अलग-अलग आइडिया हैं, जो एक जैसे शेप होने के बावजूद अलग-अलग तरीके से काम करते हैं.

सुझाव: शर्तों और लूप को अलग-अलग रखें.

अलग-अलग संख्या में इनपुट मैनेज करना

कुछ ब्लॉक के लिए, अलग-अलग संख्या में इनपुट की ज़रूरत पड़ सकती है. उदाहरण के लिए, संख्याओं के किसी भी सेट को जोड़ने वाला जोड़ ब्लॉक या elseif क्लॉज़ के किसी भी सेट वाला if/elseif/else ब्लॉक या शुरू किए गए किसी भी एलिमेंट वाला सूची कंस्ट्रक्टर. इसके लिए कई रणनीतियां अपनाई जा सकती हैं. हर रणनीति के अपने फ़ायदे और नुकसान होते हैं.

a) सबसे आसान तरीका यह है कि उपयोगकर्ता को छोटे ब्लॉक से ब्लॉक बनाकर दिखाया जाए. उदाहरण के लिए, दो संख्याओं को जोड़ने वाले दो ब्लॉक को नेस्ट करके, तीन संख्याओं को जोड़ना. एक और उदाहरण, सिर्फ़ if/else ब्लॉक उपलब्ध कराना होगा. साथ ही, उपयोगकर्ता को elseif शर्तें बनाने के लिए, उन्हें नेस्ट करना होगा.

नेस्ट किए गए जोड़ ब्लॉक: 1 + (2 + 3).

इस तरीके का फ़ायदा यह है कि इसे इस्तेमाल करना आसान है. यह उपयोगकर्ता और डेवलपर, दोनों के लिए आसान है. इसका नुकसान यह है कि जिन मामलों में नेस्टिंग की संख्या ज़्यादा होती है उनमें कोड को पढ़ना और मैनेज करना उपयोगकर्ता के लिए बहुत मुश्किल हो जाता है.

b) इसके अलावा, ब्लॉक को डाइनैमिक तौर पर बड़ा किया जा सकता है, ताकि आखिर में हमेशा एक फ़्री इनपुट रहे. इसी तरह, अगर आखिर में दो खाली इनपुट हैं, तो ब्लॉक आखिरी इनपुट मिटा देता है. App Inventor के पहले वर्शन में इसी तरीके का इस्तेमाल किया गया था.

ऐसा ब्लॉक जो चार वैल्यू इनपुट जोड़ता है. इनमें से आखिरी वैल्यू इनपुट खाली होता है.

अपने-आप बने ब्लॉक, App Inventor के उपयोगकर्ताओं को पसंद नहीं आए. इसकी कुछ वजहें हैं. पहला, हमेशा एक मुफ़्त इनपुट होता था और प्रोग्राम कभी भी 'पूरा' नहीं होता था. दूसरा, स्टैक के बीच में कोई एलिमेंट डालना मुश्किल था, क्योंकि इसके लिए बदलाव के नीचे मौजूद सभी एलिमेंट को डिसकनेक्ट करना और फिर से कनेक्ट करना पड़ता था. हालांकि, अगर क्रम का ध्यान नहीं रखना है और उपयोगकर्ताओं को अपने प्रोग्राम में कुछ समय के लिए ब्रेक लेने की अनुमति दी जा सकती है, तो यह एक बहुत ही आसान विकल्प है.

c) गैप की समस्या को हल करने के लिए, कुछ डेवलपर उन ब्लॉक में +/- बटन जोड़ते हैं जिनमें मैन्युअल तरीके से इनपुट जोड़े या हटाए जाते हैं. Open Roberta, इनपुट जोड़ने या हटाने के लिए, नीचे दिए गए दो बटन का इस्तेमाल करता है. अन्य डेवलपर हर पंक्ति में दो बटन जोड़ते हैं, ताकि स्टैक के बीच में से भी आइटम जोड़े और हटाए जा सकें. कुछ लोग हर लाइन में दो अप/डाउन बटन जोड़ते हैं, ताकि स्टैक का क्रम बदला जा सके.

तीन बाहरी वैल्यू इनपुट जोड़ने वाला ब्लॉक. इसमें इनपुट जोड़ने या हटाने के लिए, प्लस और माइनस बटन होते हैं.

इस रणनीति में कई विकल्प होते हैं. जैसे, हर ब्लॉक में सिर्फ़ दो बटन से लेकर हर पंक्ति में चार बटन. एक तरफ़, यह खतरा है कि उपयोगकर्ता अपनी ज़रूरत के मुताबिक कार्रवाइयां न कर पाएं. वहीं, दूसरी तरफ़ यूज़र इंटरफ़ेस (यूआई) में इतने बटन होते हैं कि यह स्टारशिप एंटरप्राइज़ के ब्रिज जैसा दिखता है.

d) सबसे आसान तरीका यह है कि ब्लॉक में म्यूटेट करने वाला बबल जोड़ा जाए. इसे एक बटन के तौर पर दिखाया जाता है. इस बटन से, उस ब्लॉक के लिए कॉन्फ़िगरेशन डायलॉग बॉक्स खुलता है. एलिमेंट को अपनी मर्ज़ी से जोड़ा, मिटाया या फिर से व्यवस्थित किया जा सकता है.

तीन वैल्यू इनपुट जोड़ने वाला ब्लॉक. इसमें वैल्यू इनपुट जोड़ने या हटाने के लिए म्यूटेटर होता है.

इस तरीके का नुकसान यह है कि नए उपयोगकर्ताओं के लिए म्यूटेटर आसान नहीं होते. म्यूटेटर को शामिल करने के लिए, किसी तरह के निर्देश की ज़रूरत होती है. छोटे बच्चों को टारगेट करने वाले, Blockly पर आधारित ऐप्लिकेशन में म्यूटेटर्स का इस्तेमाल नहीं किया जाना चाहिए. हालांकि, इन्हें सीखने के बाद, ये बेहतर उपयोगकर्ताओं के लिए बहुत काम के होते हैं.

सुझाव: हर रणनीति के अपने फ़ायदे और नुकसान होते हैं. इसलिए, अपने उपयोगकर्ताओं के लिए सही रणनीति चुनें.