zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    calendar的用法
    为什么要初始化变量呢
    什么情况下,if()后面的else可以省略不写
    new 对象的时候,括号里有值和无值的区别
    if...else...;if..else if...else
    java-csv导出-导出文件显示的日期格式不正确
    使用Navicat连接MySQL,连接失败(报1064错误)
    MySQL下载安装详解(win10)
    Syntax error, parameterized types are only available if source level is 1.5 or greater
    eclipse ant出错问题
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12209611.html
Copyright © 2011-2022 走看看