Bloki prób transakcyjnych w ValueScript

Wyjątki są trudne do uzyskania. Szczególnie trudnym problemem, który łatwo przeoczyć, jest możliwość częściowej oceny wewnątrz trybloków.

Rozważ następujący program JavaScript:

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

Inną opcją jest zapisanie kopii zmiennych, które mogą ulec zmianie, i przywrócenie ich w dniu 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. Możesz tego nie robić, ponieważ jest gadatliwy i wydaje się niepotrzebnie defensywny
  2. Wymaga copyzdefiniowania operacji
  3. Jeśli copyoperacja istnieje, może nie być wydajna
  4. Jeśli a.popma skutki uboczne, te skutki uboczne nie zostaną cofnięte

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. Niezwykle gadatliwy
  2. a.unPop(item)wymaga od nas zrozumienia, że ​​ta operacja jest potrzebna, gdy b.push(item)się nie powiedzie, co wciąż łatwo przeoczyć

W ValueScript trybloki są transakcyjne — albo są realizowane do końca, albo są cofane.

Nasz autorski program robi to, co chcieliśmy bez żadnych modyfikacji:

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. „Możesz tego nie zrobić”
    — kompilator ValueScript wstawia instrukcje automatycznie
  2. „Wymaga copyoperacji”
    — ValueScript używa semantyki wartości, po prostu używa aCopy = a, co jest równoznaczne z kopiowaniem
  3. „ copymoże nie być wydajny”
    — ValueScript używa kopiowania przy zapisie do samego końca, co jest dość wydajne
  4. „Skutki uboczne a.popnie zostaną cofnięte”
    — ValueScript nie ma skutków ubocznych

* niektóre niesamowite funkcje obce mogą obejmować operacje przywracania i byłyby one wywoływane automatycznie

ValueScript to dialekt języka TypeScript z semantyką wartości. Ma internetowy plac zabaw, w tym demonstrację programu z tego artykułu , i jest open source .

Suggested posts

Moje najczęściej używane zasoby dotyczące kodowania

Moje najczęściej używane zasoby dotyczące kodowania

W tym tygodniu otrzymałem wiadomość e-mail od członka codziennej listy e-mailowej. Chcieli wiedzieć: Jakie zasoby odwiedzasz codziennie, co tydzień i co miesiąc? Świetne pytanie! Cieszę się, że mogę podzielić się spostrzeżeniami na temat mojego przepływu pracy i najlepszych zasobów, z których korzystam.

Seria Lit Library — 1: Głębokie zanurzenie w bibliotece lit-html

Seria Lit Library — 1: Głębokie zanurzenie w bibliotece lit-html

Celem tej serii blogów jest zagłębienie się w bibliotekę Lit i uzyskanie pełnego zrozumienia jej unikalnych funkcji oraz tego, jak wyróżnia się na tle innych bibliotek i frameworków na rynku. Cykl podzielony jest na trzy części, obejmujące takie tematy jak 1.

Related posts

Śledź każdego, kto ma tylko numer telefonu | Śledztwo OSINT

Śledź każdego, kto ma tylko numer telefonu | Śledztwo OSINT

Możesz być śledczym OSINT, graczem CTF lub po prostu kimś, kto odbiera połączenia spamowe. Ktoś, kto próbuje zweryfikować numer, który widziałeś w reklamie.

Co możesz zrobić w swoim okresie oczekiwania (czekając na wylądowanie Twoja pierwsza praca w technologii)

Co możesz zrobić w swoim okresie oczekiwania (czekając na wylądowanie Twoja pierwsza praca w technologii)

Przejście do nowej kariery może być niezwykle trudne, jeśli spróbujesz zrobić to sam. Ważne jest, aby znaleźć odpowiedzialnych partnerów, którzy są na tym samym poziomie uczenia się co ty, którzy mają podobne cele, wytrwałość i motywację.

Wyzwanie czytelnicze Goodreads jest toksyczne

Wyzwanie czytelnicze Goodreads jest toksyczne

Swędzenie w mojej dłoni rozszerzyło się, gdy targowałem się z miejscowym księgarzem o kolejną książkę. Ta książka, podobnie jak pozostałe, które ostatnio kupiłem, znalazłaby swój tron ​​na moim stosie „Do przeczytania” (TBR); a mimo to kupiłem.

zaimki są bardzo przerażające

Uderzyło mnie to nagle, jak to często bywa. Znowu jest w połowie <Nie, nie ten w Pacyfiku, bordowy, ten na karnawale> Każdy nagłówek jest głośny…..