Transactional Try Blocks ใน ValueScript
Apr 02 2023
ข้อยกเว้นยากที่จะทำให้ถูกต้อง ปัญหายุ่งยากโดยเฉพาะอย่างยิ่งที่มองข้ามได้ง่ายคือความเป็นไปได้ของการประเมินบางส่วนภายในบล็อกทดลอง
ข้อยกเว้นยากที่จะทำให้ถูกต้อง ปัญหายุ่งยากที่มองข้ามได้ง่ายคือความเป็นไปได้ของการประเมินบางส่วนภายใน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 });
- คุณอาจไม่ทำเพราะมันละเอียดและรู้สึกปกป้องโดยไม่จำเป็น
- มันต้องมี
copyการกำหนดการดำเนินการ - หาก
copyมีการดำเนินการอยู่ ก็อาจไม่มีประสิทธิภาพ - หาก
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 });
- ละเอียดมาก
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"],
}
- “คุณอาจไม่ทำ”
— คอมไพเลอร์ ValueScript จะแทรกคำสั่งโดยอัตโนมัติ - “ต้อง
copyดำเนินการ”
— ValueScript ใช้ความหมายของคุณค่า ใช้เพียงaCopy = aและสิ่งนี้เทียบเท่ากับการคัดลอก - “
copyอาจไม่มีประสิทธิภาพ”
— ValueScript ใช้การคัดลอกเมื่อเขียนจนสุด ซึ่งค่อนข้างมีประสิทธิภาพ - “ผลข้างเคียงของ
a.popจะไม่ถูกเปลี่ยนกลับ”
— ValueScript ไม่มีผลข้างเคียง
* ฟังก์ชั่นต่างประเทศที่ยอดเยี่ยมบางอย่างอาจรวมถึงการดำเนินการย้อนกลับและสิ่งเหล่านี้จะถูกเรียกโดยอัตโนมัติ
ValueScript เป็นภาษาถิ่นของ TypeScript ที่มีความหมายเชิงคุณค่า มีสนามเด็กเล่นออนไลน์รวมถึงการสาธิตโปรแกรมของบทความนี้และเป็นโอเพ่นซอร์ส





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)