ValueScript의 트랜잭션 시도 블록

예외는 바로잡기가 어렵습니다. try간과하기 쉬운 특히 까다로운 문제는 블록 내부의 부분 평가 가능성입니다 .

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

또 다른 옵션은 변경될 수 있는 변수의 복사본을 저장하고 다음에서 복원하는 것입니다 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. 장황하고 불필요하게 방어적인 느낌이 들기 때문에 하지 않을 수도 있습니다.
  2. copy작업을 정의 해야 합니다.
  3. 작업이 존재하는 경우 copy효율적이지 않을 수 있습니다.
  4. 부작용이 있는 경우 a.pop해당 부작용은 되돌릴 수 없습니다.

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. 매우 장황함
  2. a.unPop(item)b.push(item)여전히 놓치기 쉬운 실패 시 이 작업이 필요하다는 것을 이해해야 합니다.

ValueScript에서 try블록은 트랜잭션입니다. 완료될 때까지 실행되거나 되돌려집니다.

우리의 원래 프로그램은 수정 없이 우리가 원하는 것을 수행합니다.

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. "You might not do it"
    — ValueScript 컴파일러가 지침을 자동으로 삽입합니다.
  2. " copy작업 필요"
    — ValueScript는 값 의미론을 사용하고 단지 를 사용하며 aCopy = a이는 복사와 동일합니다.
  3. " copy효율적이지 않을 수 있음"
    — ValueScript는 기록 중 복사를 끝까지 사용하므로 매우 효율적입니다.
  4. "Side effects of a.popwill be reverted"
    — ValueScript에는 부작용이 없습니다.

* 일부 멋진 외부 기능에는 되돌리기 작업이 포함될 수 있으며 자동으로 호출됩니다.

ValueScript는 값 의미 체계가 있는 TypeScript의 방언입니다. 이 기사의 프로그램 데모를 포함하는 온라인 놀이터가 있으며 오픈 소스 입니다 .

Suggested posts

내가 가장 많이 사용하는 코딩 리소스

내가 가장 많이 사용하는 코딩 리소스

이번 주에 저는 일일 이메일 목록의 회원으로부터 이메일을 받았습니다. 그들은 알고 싶어했습니다. 매일, 매주, 매월 어떤 리소스를 방문합니까? 좋은 질문입니다! 제 작업 흐름과 제가 사용하는 주요 리소스에 대한 통찰력을 공유하게 되어 기쁩니다.

Lit 라이브러리 시리즈 — 1: lit-html 라이브러리에 대한 심층 분석

Lit 라이브러리 시리즈 — 1: lit-html 라이브러리에 대한 심층 분석

이 블로그 시리즈의 목적은 Lit 라이브러리를 깊이 탐구하고 Lit 라이브러리의 고유한 기능과 시장의 다른 라이브러리 및 프레임워크와 차별화되는 방법을 포괄적으로 이해하는 것입니다. 이 시리즈는 1과 같은 주제를 다루는 세 부분으로 나뉩니다.

Related posts

도메인 이름에 대한 정보 찾기

Brian P. Hogan의 Small, Sharp 소프트웨어 도구에서 발췌

도메인 이름에 대한 정보 찾기

facebook.com에 요청하면 컴퓨터가 도메인 이름을 조회하여 해당 도메인 이름을 IP 주소로 변환하므로 컴퓨터가 해당 연결을 만들 수 있습니다.

안전한 작업 환경 조성

안전한 작업 환경 조성

“그는 내가 위험에 처했을 때 나를 지켜줄 것입니다. 그가 나를 그의 천막 안에 숨길 것이다.

느린 침식: 사람들이 경력을 낭비하는 방식 공개

느린 침식: 사람들이 경력을 낭비하는 방식 공개

오늘날과 같이 급변하고 경쟁이 치열한 세상에서 경력은 개인의 성장, 재정적 안정 및 전반적인 삶의 만족도에 중요한 역할을 합니다. 그러나 많은 사람들은 침체와 불만족의 끊임없는 순환에 휩싸여 직업 생활에서 점차 쇠퇴하고 있습니다.

2년간의 디자인 - 좋은 것, 나쁜 것, 추한 것…

2년간의 디자인 - 좋은 것, 나쁜 것, 추한 것…

“Siri야, Olivia Dean의 Me Dive 재생해줘.” 나이지리아 아쿠레에 있는 Future Academy Africa에서 인턴십을 시작한 것은 2021년 5월이었습니다.