Blocs try transactionnels dans ValueScript

Les exceptions sont difficiles à corriger. Un problème particulièrement délicat qu'il est facile d'ignorer est la possibilité d'une évaluation partielle à l'intérieur trydes blocs.

Considérez le programme JavaScript suivant :

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

Une autre option consiste à enregistrer une copie des variables susceptibles de changer et à les restaurer sur 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. Vous ne le ferez peut-être pas parce que c'est verbeux et inutilement défensif
  2. Il nécessite une copyopération à définir
  3. Si l' copyopération existe, elle pourrait ne pas être efficace
  4. Si a.popa des effets secondaires, ces effets secondaires ne seront pas annulés

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. Extrêmement verbeux
  2. a.unPop(item)nous oblige à comprendre que cette opération est nécessaire en cas b.push(item)d'échec, ce qui est encore facile à manquer

Dans ValueScript, tryles blocs sont transactionnels : soit ils s'exécutent jusqu'à la fin, soit ils sont annulés.

Notre programme original fait ce que nous voulions sans aucune modification :

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. "Vous ne le ferez peut-être pas"
    - Le compilateur ValueScript insère automatiquement les instructions
  2. "Nécessite copyune opération"
    - ValueScript utilise la sémantique de la valeur, il utilise simplement aCopy = a, et cela équivaut à copier
  3. " copypourrait ne pas être efficace"
    - ValueScript utilise la copie sur écriture jusqu'au bout, c'est assez efficace
  4. "Les effets secondaires de a.popne seront pas annulés"
    - ValueScript n'a pas d'effets secondaires

* certaines fonctions étrangères impressionnantes pourraient inclure des opérations de retour et celles-ci seraient automatiquement appelées

ValueScript est un dialecte de TypeScript avec une sémantique de valeur. Il dispose d'un terrain de jeu en ligne comprenant une démonstration du programme de cet article , et il est open source .

Suggested posts

Mes ressources de codage les plus utilisées

Mes ressources de codage les plus utilisées

Cette semaine, j'ai reçu un e-mail d'un membre de la liste de diffusion quotidienne. Ils voulaient savoir : Quelles ressources consultez-vous quotidiennement, hebdomadairement et mensuellement ? Grande question ! Je suis heureux d'essayer de partager quelques idées sur mon flux de travail et les principales ressources que j'utilise.

Série de bibliothèques Lit — 1 : Une plongée en profondeur dans la bibliothèque lit-html

Série de bibliothèques Lit — 1 : Une plongée en profondeur dans la bibliothèque lit-html

Le but de cette série de blogs est d'approfondir la bibliothèque Lit et d'acquérir une compréhension complète de ses caractéristiques uniques et de la manière dont elle se distingue des autres bibliothèques et frameworks du marché. La série est divisée en trois parties, couvrant des sujets tels que 1.

Related posts

Cette archive de menace: Vol 7 Black Basta

Cette archive de menace: Vol 7 Black Basta

Dans le monde interconnecté d'aujourd'hui, la menace des cyberattaques est plus répandue que jamais. Les cybercriminels et les acteurs des États-nations cherchent constamment à exploiter les vulnérabilités et à voler des données précieuses, ce qui représente un risque important pour les organisations de toutes tailles.

les pronoms font super peur

Ça me frappe tout à coup, comme c'est si souvent le cas C'est à nouveau le milieu du chemin <Non, pas celui du Pacifique, toi marron, celui du carnaval> Chaque gros titre fort… ..

L'érosion lente : dévoiler les façons dont les gens perdent leur carrière

L'érosion lente&nbsp;: dévoiler les façons dont les gens perdent leur carrière

Dans le monde rapide et compétitif d'aujourd'hui, la carrière d'une personne joue un rôle important dans la croissance personnelle, la stabilité financière et la satisfaction globale de la vie. Cependant, de nombreuses personnes se retrouvent prises dans un cycle incessant de stagnation et d'insatisfaction, dépérissant progressivement dans leur vie professionnelle.

Créer un environnement de travail sûr

Créer un environnement de travail sûr

« Il me protégera quand je serai en danger. Il me cachera dans sa tente.