स्टेटमेंट, कैश मेमोरी में डेटा सेव करने की प्रोसेस को ब्लॉक करता है

कभी-कभी आपके ब्लॉक-कोड जनरेटर को अपने अंदरूनी कई बार ब्लॉक करना.

उदाहरण के लिए, अगर आपके पास कोई ऐसा ब्लॉक है जो सूची के आखिरी एलिमेंट को प्रिंट करता है, तो सूची कोड को कई बार ऐक्सेस करने की ज़रूरत होती है:

// Incorrect block-code generator.
javascriptGenerator.forBlock['print_last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);

  // listCode gets referenced twice.
  return `print(${listCode}[${listCode}.length - 1]);\n`;
}

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

print(randomList()[randomList().length - 1]);

अस्थायी वैरिएबल असाइन करने से आप यह पक्का कर सकते हैं कि अंदरूनी ब्लॉक का कोड इसका आकलन सिर्फ़ एक बार किया जाता है.

अस्थायी वैरिएबल

अस्थायी वैरिएबल किसी इनर ब्लॉक की कोड स्ट्रिंग की वैल्यू को सेव करता है, ताकि कोड का सिर्फ़ एक बार आकलन किया जाता है. इसके बाद, वैल्यू को एक से ज़्यादा बार रेफ़र किया जा सकता है बार.

import {javascriptGenerator, Order} from 'blockly/javascript';

// Correct block-code generator.
javascriptGenerator.forBlock['print_last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);
  const listVar = generator.nameDB_.getDistinctName(
      'temp_list', Blockly.names.NameType.VARIABLE);

  // listCode only gets evaluated once.
  const code = `var ${listVar} = ${listCode};\n`;
  return `print(${listVar}[${listVar}.length - 1]);\n`;
}

getDistinctName कॉल आपकी पसंद के वैरिएबल नाम को लेकर, नतीजे के तौर पर ऐसा नाम जो उपयोगकर्ता के तय किए गए किसी भी वैरिएबल से मेल न खाता हो.

ग़ैर-ज़रूरी कोड कम करें

अस्थायी वैरिएबल का एक नकारात्मक पहलू यह है कि अगर अंदरूनी ब्लॉक का कोड फ़ंक्शन या एक्सप्रेशन के बजाय, आपको ऐसा कोड मिलता है जो काम का नहीं है:

// Assigning to temp_list is unnecessary.
var temp_list = foo;
print(temp_list[temp_list.length - 1]);

क्लीनर कोड बनाने के लिए, यह जांच की जा सकती है कि अंदर के ब्लॉक का कोड कोई वैल्यू है या नहीं. अस्थायी वैरिएबल को ही शामिल करें, अगर ऐसा नहीं है.

if (listCode.match(/^\w+$/)) {
  const code = `print(${listCode}[${listCode}.length - 1]);\n`;
} else {
  const listVar = generator.nameDB_.getDistinctName(
      'temp_list', Blockly.names.NameType.VARIABLE);
  const code = `var ${listVar} = ${listCode};\n`;
  code += `print(${listVar}[${listVar}.length - 1]);\n`;
}