[Javascript] Eliminate Boolean Explosion by Enumerating States
There are several fundamental problems with trying to manage the state of a function through the use of booleans. The first is often referred to as "boolean explosion". For every boolean we add to a function, we increase the number of possible states at a rate of 2^n
where n
is the number of booleans. Running the math just a few times quickly reveals an absurd amount of states.
The second problem is that many of these states are "impossible states", states our application should never be in. The example in the lesson is that the light bulb should not be isLit
and isBroken
. It's simply not possible, and is an inaccurate modeling of an actual light bulb.
The way we solve for this problem is by enumerating the possible states. In other lessons in this course, we'll do that with state machines, but for now, we'll do that by enumerating the possible states and updating our function to only utilize these possible states.
function lightBulb() { let isLit = false; let isBroken = false; return { state() { return { isLit, isBroken }; }, toggle() { if (isBroken) { isLit = false; return; } isLit = !isLit; }, break() { isBroken = true; isLit = false; } }; } const bulb = lightBulb(); const log = () => { console.log(bulb.state()); }; bulb.toggle(); bulb.break(); log(); // { isLit: false, isBroken: true }
Better:
We list all the possible states, which mean 'Lit' is not possible to happen with 'Borken'.
const STATE = { LIT: "lit", UNLIT: "unlit", BROKEN: "broken" }; function lightBulb() { let state = STATE.UNLIT; return { state() { return state; }, toggle() { switch (state) { case STATE.LIT: state = STATE.UNLIT; break; case STATE.UNLIT: state = STATE.LIT; this.break; } }, break() { state = STATE.BROKEN; } }; } const bulb = lightBulb(); const log = () => { console.log(bulb.state()); }; bulb.toggle(); bulb.break(); log(); // broken
相关文章
- Javascript 模块化指北
- 第一百零六节,JavaScript变量作用域及内存
- Bootstrap3.0学习第二十一轮(JavaScript插件——工具提示)
- [Javascript] Create 2d array by using Array.from
- [Javascript] Get Global This
- [Javascript] Eliminate Boolean Explosion by Enumerating States
- [Javascript] Required function arguments in Javascript
- [Javascript] Destructuring array by using object syntax
- [Javascript] Broadcaster + Operator + Listener pattern -- 25. Save Network Requests by Using a Cache
- [Javascript] Avoid Accidental Returns of New State by using the void Keyword
- [Javascript Crocks] Make your own functions safer by lifting them into a Maybe context
- JavaScript打开页面后自动随机跳转页面【转】
- javascript:监控video全屏时取消静音(chrome 107.0.5304.87)
- 什么是 JavaScript 里的异步操作和回调函数
- 从零开始学_JavaScript_系列(九)——dojo(2)(AJAX、时间控件、鼠标事件、样式修改、事件移除、消息发布订阅)
- 从零开始学_JavaScript_系列(七)——jquery(复选框及互斥、div块、修改css、标签数组、ajax连续加载)
- 〖大前端 - 基础入门三大核心之JS篇⑤〗- JavaScript中的数据类型之字符串类型
- 关于JavaScript中的This-面试必备知识
- javascript的执行过程, 语法错误和运行时错误?
- 《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)
- Javascript 将字符串替换为特定的规律的字符串