ValueScript'te İşlemsel Try Blokları

Apr 02 2023
İstisnaların doğru olması zordur. Gözden kaçırması kolay olan özellikle zor bir problem, try blokları içinde kısmi değerlendirme olasılığıdır.

İstisnaların doğru olması zordur. Gözden kaçırması kolay özellikle zor bir problem, bloklar içinde kısmi değerlendirme olasılığıdır try.

Aşağıdaki JavaScript programını göz önünde bulundurun:

let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);

try {
  const item = a.pop();
  b.push(item);
} catch (e) {
  console.error("Failed to move item from a to b", e);
}

console.log({ a, b });

{
  a: [],
  b: ["item2", "item3", "item4", "item1"],
}

{
  a: [],
  b: ["item2", "item3", "item4"],
}

let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);

try {
  if (b.isFull()) {
    throw new Error("b is full");
  }

  const item = a.pop();
  b.push(item);
} catch (e) {
  console.error("Failed to move item from a to b", e);
}

console.log({ a, b });

Başka bir seçenek de değişebilecek değişkenlerin bir kopyasını kaydetmek ve onları şuraya geri yüklemektir catch:

let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);

const aCopy = a.copy();
const bCopy = b.copy();

try {
  const item = a.pop();
  b.push(item);
} catch (e) {
  a = aCopy;
  b = bCopy;
  console.error("Failed to move item from a to b", e);
}

console.log({ a, b });

  1. Ayrıntılı olduğu ve gereksiz yere savunma hissi verdiği için bunu yapmayabilirsiniz.
  2. copyTanımlanacak bir işlem gerektirir
  3. İşlem varsa copy, verimli olmayabilir
  4. Yan etkileri varsa a.pop, bu yan etkiler geri alınmayacaktır.

let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);

let item;

try {
  item = a.pop();
} catch (e) {
  console.error("Failed to move item from a to b", e);
  console.log({ a, b });
  return;
}

try {
  b.push(item);
} catch (e) {
  a.unPop(item);
  console.error("Failed to move item from a to b", e);
}

console.log({ a, b });

  1. Son derece ayrıntılı
  2. a.unPop(item)başarısız olduğunda bu işlemin gerekli olduğunu anlamamızı gerektirir b.push(item), ki bu yine de gözden kaçırması kolaydır

ValueScript'te trybloklar işlemseldir; ya tamamlanana kadar çalışırlar ya da geri alınırlar.

Orijinal programımız herhangi bir değişiklik yapmadan istediğimizi yapıyor:

let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);

try {
  const item = a.pop();
  b.push(item);
} catch (e) {
  console.error("Failed to move item from a to b", e);
}

console.log({ a, b });
{
  a: ["item1"],
  b: ["item2", "item3", "item4"],
}

  1. "Bunu yapamayabilirsiniz"
    — ValueScript derleyicisi talimatları otomatik olarak ekler
  2. " copyİşlem gerektirir"
    — ValueScript, değer semantiğini kullanır, yalnızca kullanır aCopy = ave bu, kopyalamaya eşdeğerdir
  3. copyverimli olmayabilir”
    — ValueScript, sonuna kadar yazma sırasında kopyalamayı kullanır, oldukça verimlidir
  4. "Yan etkileri a.popgeri alınmayacak"
    — ValueScript'in yan etkileri yoktur

* bazı harika yabancı işlevler, geri alma işlemlerini içerebilir ve bunlar otomatik olarak çağrılır

ValueScript, değer semantiğine sahip bir TypeScript lehçesidir. Bu makalenin programının bir tanıtımını içeren çevrimiçi bir oyun alanına sahiptir ve açık kaynaklıdır .