Değer bloğu bağımsız değişkenini önbelleğe alma

Bazen blok kodu oluşturma aracınızın, iç bloğunun koduna birkaç kez referans vermesi gerekir.

Örneğin, bir listenin son öğesini alan bir blokunuz varsa liste koduna birden çok kez erişmeniz gerekir:

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

  // listCode gets referenced twice.
  const code = `${listCode}[${listCode}.length - 1]`;

  return [code, Order.MEMBER];
}

Ancak bu, iç bloğun kodunun ortaya çıkan değeri tutarsızsa veya yan etkileri varsa sorunlara yol açabilir. Örneğin, iç kod aslında bir işlev çağrısıysa bu özel kod, aralık dışında bir koşulla sonuçlanabilir:

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

Yardımcı işlevler kullanmak, iç blokların kodunun yalnızca bir kez değerlendirildiğinden emin olmanızı sağlar.

Yardımcı işlevler

Yardımcı program işlevi, oluşturulan kod dizesinin bir parçası olarak eklenen, geliştirici tarafından tanımlanan bir işlevdir. Bunları kullanarak iç blok kodunun yalnızca bir kez değerlendirilmesini sağlayabilir ve daha sonra değere birden çok kez referans verilebilir.

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

// Correct block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.NONE);
  const functionName = generator.provideFunction_(
      'list_lastElement',
      [
        `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(list) {`,
        `  return list[list.length - 1];`,
        `}`
      ]
  );

  // listCode only gets evaluated once.
  const code = `${functionName}(${listCode})`;
  return [code, Order.FUNCTION_CALL];
}

İşlevi sağlama

Yardımcı program işlevlerini, provideFunction_ kullanarak blok kodu oluşturucularda tanımlayabilirsiniz. Yardımcı program işleviniz için istediğiniz adı ve işlevin işlevini tanımlayan bir dizi kod dizesi alır. Bu, yardımcı program işlevinizin, kullanıcı tanımlı işlevlerle çakışmayacak şekilde değiştirildikten sonra (muhtemelen) değiştirdiği adı döndürür.

provideFunction_, yardımcı program işlevi tanımlarını da tekilleştirir. Böylece her yardımcı program işlevi, tanımlayan blok türü birden fazla kez bulunsa bile yalnızca bir kez var olur.

Öncelikleri güncelleyin

Bir yardımcı program işlevi tanımlarken, blok kodu oluşturucudaki öncelikleri de (parantezlerin nasıl eklendiğini tanımlar) güncellemeniz gerekir.

Öncelik, her zaman blok kodu oluşturucu tarafından döndürülen kod dizesine bağlıdır. Yardımcı program işlevlerinin içindeki operatörleri umursamaz. Bu nedenle, önceki örnekte valueToCode çağrısı Order.NONE ve döndürülen değer kombinasyonu da Order.FUNCTION_CALL olarak değiştirildi.