TL;DR
- Fail Open と Fail Closed のどちらにもトレードオフがあり、ジレンマになる。
Record型を使うと、関連する値と型を同期させ、プロパティを変えたときに対応を強制できる。
内容
Fail Open と Fail Closed のジレンマ
Fail Open は、何かに失敗しても処理を続けることである。Fail Closed は、何かに失敗したら処理を止めることである。可用性や継続性を重視するなら Fail Open を、安全性を重視するなら Fail Closed を選ぶことになる。しかし、どちらも完全な解決策ではなく、必ずトレードオフがある。どちらかを選ぶのではなく、ジレンマそのものを避ける方法を探すのも 1 つの手である。
Record 型で値と型を同期させる
Record 型を使うと、関連する値と型を同期させられる。次の例では、ScatterProps の各プロパティについて、変わったときに更新が必要かを Record<keyof ScatterProps, boolean> で持っている。
interface ScatterProps {
xs: number[]
ys: number[]
xRange: [number, number]
yRange: [number, number]
onClick?: (x: number, y: number, index: number) => void
}const REQUIRES_UPDATE: Record<keyof ScatterProps, boolean> = {
xs: true,
ys: true,
xRange: true,
yRange: true,
onClick: false,
}この状態でインタフェースのプロパティを追加したり変更したりすると、値の側で型エラーが出る。これにより、変更したプロパティについて何らかの対応を強制できる。
キーワード
- Fail Open
- Fail Closed
- トレードオフ
- TypeScript