বিবৃতি ক্যাশিং আর্গুমেন্ট ব্লক করে

কখনও কখনও আপনার ব্লক-কোড জেনারেটরকে তার অভ্যন্তরীণ ব্লকের কোড একাধিকবার উল্লেখ করতে হবে।

উদাহরণস্বরূপ, যদি আপনার একটি ব্লক থাকে যা একটি তালিকার শেষ উপাদানটি মুদ্রণ করে, তাহলে আপনাকে একাধিকবার তালিকা কোড অ্যাক্সেস করতে হবে:

// 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`;
}