是时候告别else关键字了……这种简单的条件逻辑让大家很容易理解。但是一个好的程序员的标志是不使用这个关键字。当我开始编程时,我最大的错误之一是在编写条件语句时过度使用else关键字。五年前我和else说再见了。是什么原因?想想还有什么意思,就是“如果A满足就执行这个,如果A不满足就执行那个”。来源:bevnet如果A是二进制的,则没有问题——因为只有两种情况。但如果A是二元变量的集合,或者包含更大的变量,那么出问题的几率就会出乎意料的大,而且难以理解、测试和维护。避免if/elseif,只使用if语句,并花时间确保if组的输入条件是互斥的,以便答案不依赖于执行顺序。使用switch-case语句使用多态处理复杂的条件情况,使您的代码更像状态模式。保证了执行的主渠道,特例少。它迫使程序员在每个函数的开头编写处理数据所需的所有条件。示例示例是这样的:一个信号量(即信号量对象)具有三种不同的状态,红色、黄色和绿色,每种状态都有自己的一套规则。规则如下:假设信号灯当前为红色,经过一定的延迟后,状态会由红色变为绿色。然后再延迟一段时间后,状态从绿色变为黄色。短暂延迟后,状态从黄色变为红色。不中断不要使用if-else关键字constLightState={GREEN:0,YELLOW:1,RED:2}varTrafficLight=function(){varcount=0//defaultstate=redvarcurrentState=0;this.change=function(state){if(count++>=10)returncurrentState=statethis.go(currentState)}this.go=function(state){if(currentState==LightState.GREEN){console.log("Green-->for1minute")this.change(LightState.YELLOW)}elseif(currentState==LightState.YELLOW){console.log("Yellow-->for10seconds")this.change(LightState.RED)}elseif(currentState==LightState.RED){console.log("Red-->for1minute");this.change(LightState.GREEN)}else{throwError("InvalidState")}}this.start=function(){this.change(LightState.GREEN)}}更简单的方法来看不使用else该怎么做:this.go=function(state){if(currentState==LightState.GREEN){console.log("Green-->for1minute")this.change(LightState.YELLOW)}if(currentState==LightState.YELLOW){console.log("Yellow-->for10seconds")this.change(LightState.RED)}if(currentState==LightState.RED){console.log("Red-->for1minute");this.change(LightState.GREEN)}if(currentState!=LightState.GREEN&¤tState!=LightState.RED&¤tState!=LightState.YELLOW){throwError("InvalidState")}}或者可以换成switch,当你要组合不同的场景时看起来会干净很多,而且if-else可以很快失控几个场景都不错,switch语句可能比if-else语句。this.go=function(state){if(currentState==LightState.GREEN){console.log("Green-->for1minute")this.change(LightState.YELLOW)}if(currentState==LightState.YELLOW){console.log("Yellow-->for10seconds")this.change(LightState.RED)}if(currentState==LightState.RED){console.log("Red-->for1minute");this.change(LightState.GREEN)}if(currentState!=LightState.GREEN&¤tState!=LightState.RED&¤tState!=LightState.YELLOW){throwError("InvalidState")}}您可以使用状态模式删除这些代码中的所有if-else关键字。来源:unsplash这里引入了很多if-elseblock/switch语句来保护各种条件,这种状态模式很适合这样的场景。它允许对象根据当前状态做出不同的行为,并且用户可以定义特定于状态的行为。在这个模式中,开始考虑信号量的可能状态,然后相应地隔离代码。对于特定于状态的行为,需要单独的对象。信号量中定义的操作将行为委托给对象的当前状态。状态本体触发状态转换信号灯:绿色(1分钟)→黄色(10秒)→红色(1分钟)varTrafficLight=function(){varcount=0//defaultstate=greenvarcurrentState=newGreen(this);this.change=function(state){//limitsnumberofchangesif(count++>=10)return;currentState=state;currentState.go();}this.start=function(){currentState.go();}}varRed=function(light){this.light=lightthis.go=function(){console.log(("Red-->for1minute"))light.change(newGreen(light));}}varYellow=function(light){this.light=light;this.go=function(){console.log("Yellow-->for10seconds")light.change(newRed(light));}};varGreen=function(light){this.light=light;this.go=function(){console.log("Green-->for1minute");light.change(newYellow(light));}};输出如下:Green→for1minuteYellow→for10secondsRed→for1minuteGreen→for1minuteYellow→for10secondsRed→for1minuteGreen→for1minuteYellow→for10secondsRed→for1minute绿色→for1minuteYellow→for10seconds好代码和坏代码有什么区别,你明白了吗?
