Transaktionale Try-Blöcke in ValueScript

Ausnahmen sind schwer richtig zu machen. Ein besonders kniffliges und leicht zu übersehendes Problem ist die Möglichkeit der Teilauswertung innerhalb von tryBlöcken.

Betrachten Sie das folgende JavaScript-Programm:

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 });

Eine andere Möglichkeit besteht darin, eine Kopie der Variablen zu speichern, die sich möglicherweise ändern, und sie wiederherzustellen unter 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. Sie tun es vielleicht nicht, weil es wortreich ist und sich unnötig defensiv anfühlt
  2. Es muss eine copyOperation definiert werden
  3. Wenn die copyOperation vorhanden ist, ist sie möglicherweise nicht effizient
  4. Wenn a.popNebenwirkungen auftreten, werden diese Nebenwirkungen nicht rückgängig gemacht

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. Extrem wortreich
  2. a.unPop(item)erfordert, dass wir verstehen, dass diese Operation erforderlich ist, wenn b.push(item)sie fehlschlägt, was immer noch leicht zu übersehen ist

In ValueScript trysind Blöcke transaktional – sie werden entweder bis zum Ende ausgeführt oder zurückgesetzt.

Unser ursprüngliches Programm macht das, was wir wollten, ohne Änderungen:

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. „Sie könnten es nicht tun“
    – Der ValueScript-Compiler fügt die Anweisungen automatisch ein
  2. „ copyVorgang erforderlich“
    – ValueScript verwendet Wertsemantik, es verwendet nur aCopy = a, und dies entspricht dem Kopieren
  3. „ copyMöglicherweise nicht effizient“
    – ValueScript verwendet Copy-on-Write ganz nach unten, es ist ziemlich effizient
  4. „Nebenwirkungen von a.popwerden nicht rückgängig gemacht“
    – ValueScript hat keine Nebeneffekte

* Einige großartige Fremdfunktionen könnten Wiederherstellungsoperationen enthalten, und diese würden automatisch aufgerufen

ValueScript ist ein Dialekt von TypeScript mit Wertsemantik. Es hat einen Online-Spielplatz, der eine Demonstration des Programms dieses Artikels enthält , und es ist Open Source .

Suggested posts

Meine am häufigsten verwendeten Codierungsressourcen

Meine am häufigsten verwendeten Codierungsressourcen

Diese Woche erhielt ich eine E-Mail von einem Mitglied der täglichen E-Mail-Liste. Sie wollten wissen: Welche Ressourcen besuchen Sie täglich, wöchentlich und monatlich? Tolle Frage! Ich versuche gerne, einige Einblicke in meinen Arbeitsablauf und die wichtigsten Ressourcen, die ich verwende, mit Ihnen zu teilen.

Lit-Bibliotheksreihe – 1: Ein tiefer Einblick in die lit-html-Bibliothek

Lit-Bibliotheksreihe – 1: Ein tiefer Einblick in die lit-html-Bibliothek

Der Zweck dieser Blogreihe besteht darin, tief in die Lit-Bibliothek einzutauchen und ein umfassendes Verständnis ihrer einzigartigen Funktionen zu erlangen und zu erfahren, wie sie sich von anderen Bibliotheken und Frameworks auf dem Markt unterscheidet. Die Reihe ist in drei Teile gegliedert und behandelt Themen wie 1.

Related posts

Die Workplace-Revolution: Top-Experten diskutieren über Hybrid- und Remote-Arbeit

Die Workplace-Revolution: Top-Experten diskutieren über Hybrid- und Remote-Arbeit

In der sich schnell entwickelnden Geschäftslandschaft von heute hat das Konzept der Hybrid- und Remote-Arbeit eine beispiellose Dynamik erlangt. Während sich Unternehmen weiterhin an die sich verändernden Bedürfnisse und Erwartungen ihrer Mitarbeiter anpassen, sind Experten aus verschiedenen Bereichen zusammengekommen, um die Vorteile, Herausforderungen und die Zukunft dieser transformativen Arbeitsweise zu diskutieren.

Schaffung einer sicheren Arbeitsumgebung

Schaffung einer sicheren Arbeitsumgebung

„Er wird mich beschützen, wenn ich in Gefahr bin. Er wird mich in seinem Zelt verstecken.

Zeitschrift Ouvert

Zeitschrift Ouvert

Offenes Tagebuch: Ein Bild pro Tag. Geschichten haben mich schon immer fasziniert.

Gefährliche Gespräche

Gefährliche Gespräche

Wenn wir auf diesem Planeten weiterhin erfolgreich sein wollen, müssen wir gefährliche Gespräche führen. Diejenigen, die das in Frage stellen, was wir getan haben, was wir tun und was wir derzeit weiterhin tun werden (oder planen).