多种方法重构if语句_第1页
多种方法重构if语句_第2页
多种方法重构if语句_第3页
多种方法重构if语句_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多种方法重构if语句、/、刖吞项目开发初期阶段if/else语句一般比较简单,然后随着时间的推移和业务量的增加,if/else分之会越来越长。下面对如何重构if/else做出了详细分析。案例研究我们经常遇到涉及很多条件的业务逻辑,并且每个都需要不同的处理,我们以Calculator类作为演示样例。有一个方法,它接受两个数字和个运算符作为输入项,并根据操作返回相应结果:publicintcalculate(inta,intb,Stringoperator)intresult=Integer.MIN_VALUE;if(add.equals(operator)result=a+b;elseif(mu

2、ltiply.equals(operator)result=a*b;elseif(divide.equals(operator)result=a/b;elseif(subtract.equals(operator)result=a-b;returnresult;我们也可以使用switch语句来实现它:publicintcalculateUsingSwitch(inta,intb,Stringoperator)switch(operator)caseadd:result=a+b;break;/othercasesreturnresult;在真正的项目开发中,if语句可能会变得更大,更复杂,这时候

3、switch语句并不是很适合,下面将介绍更好模式来解决if/else问题。3.重构.工厂类if/else每个分支中执行类似的操作,我们通过工厂方法返回给指定类型的对象并基于具体对象行为执行操作。让我们定义一个具有单个apply方法的Operation接口:publicinterfaceOperationintapply(inta,intb);我们现在将实现一个工厂类,它根据给定的运算符返回Operation的实例:publicclassOperatorFactorystaticMapvString,OperationoperationMap=newHashMap();staticoperati

4、onMap.put(add,newAddition。);operationMap.put(divide,newDivision。);moreoperatorspublicstaticOptionalgetOperation(Stringoperator)returnOptionaLofNullable(operationMap.get(operator);现在,在Calculator类中,我们可以查询工厂以获取相关操作:publicintcalculateUsingFactory(inta,intb,Stringoperator)OperationtargetOperation=Operato

5、rFactory.getOperation(operator).orElseThrow()-new川egalArgumentExceptiorfInvalidOperator);returntargetOperation.apply(a,b);在这个例子中,我们已经看到了如何将责任委托给工厂类提供的松散耦合对象,但是有可能嵌套的if语句只是转移到了工厂类,我们可以在Map中维护一个对象存储库,可以查询该存储库以进快速查找,所以设计了OperatorFactory中的operationMap对象。使用枚举除了使用Map之外,我们还可以使用Enum来标记特定的业务逻辑。之后,我们可以在嵌套的if语

6、句或switchcase语句中使用它们。或者,我们也可以将它们用作对象的工厂并制定策略以执行相关的业务逻辑。这样可以减少嵌套if语句的数量并委托给单个Enum值。让我们看看我们如何实现它。首先,我们需要定义我们的枚举:publicenumOperatorADD,MULTIPLY,SUBTRACT,DIVIDE我们可以选择在嵌套的if语句或switchcase中使用枚举值作为不同的条件,下面将介绍一种将逻辑委托给Enum本身的替代方法。然后在Calculator类中,我们可以定义一个可执行操作的方法:publicintcalculate(inta,intb,Operatoroperator)re

7、turnoperator.apply(a,b);现在,我们可以通过使用Operator.valueOf()方法将String值转换为Operator来调用该方法:TestpublicvoidwhenCalculateUsingEnumOperator_thenReturnCorrectResul()Calculatorcalculator=newCalculator();intresult=calculator.calculate(3,4,Operator.valueOf(ADD);assertEquals(7,result);3.3命令模式命令模式是解决嵌套if语句的另一种方法,我们可以设计

8、一个Calculator#calculate方法来接受可执行的命令。我们首先定义我们的Command接口:publicinterfaceCommandIntegerexecute。;最后,让我们在Calculator中引入一个接受并执行Command的新方法:publicintcalculate(Commandcommand)returncommand.execute();接下来,我们可以通过实例化AddCommand调用计算并将其发送到Calculator#calculate方法:TestpublicvoidwhenCalculateUsingCommand_thenReturnCorrec

9、tResult()Calculatorcalculator=newCalculator();intresult=calculator.calculate(newAddCommand(3,7);assertEquals(10,result);3.4规则引擎当我们最终编写大量嵌套if语句时,每个条件都描述了一个业务规则,必须对其进行评估才能处理正确的逻辑。规则引擎从主代码中获取了这种复杂性。让我们通过设计一个简单的RuleEngine来进行演示,该RuleEngine通过一组规则来处理Expression,并返回所选规则的结果。首先,我们将定义一个Rule接口:publicinterfaceRul

10、ebooleanevaluate(Expressionexpression);ResultgetResult();其次,让我们实现一个RuleEngine:publicclassRuleEngineprivatestaticListrules=newArrayList();staticrules.add(newAddRule();publicResultprocess(Expressionexpression)Rulerule=rules.stream().filter(r-r.evaluate(expression).findFirst().orElseThrow()-newIllegalA

11、rgumentExceptiorfExpressiondoesnotmatchesanyRule);returnrule.getResult();所述RuleEngine接受一个Expression对象并返回结果。现在,让我们将Expression类设计为一组包含两个Integer对象的Operator:publicclassExpressionprivateIntegerx;privateIntegery;privateOperatoroperator;最后让我们定义一个自定义的AddRule类,该类仅在指定ADD操作时进行求值:publicclassAddRuleimplementsRul

12、eOverridepublicbooleanevaluate(Expressionexpression)booleanevalResult=false;if(expression.getOperator()=Operator.ADD)this.result=expression.getX()+expression.getY();evalResult=true;returnevalResult;我们现在将使用Expression调用RuleEngine:TestpublicvoidwhenNumbersGivenToRuleEngine_thenReturnCorrectResult()Expressionexpression=newExpression(5,5,Operator.ADD);RuleEngineengine=newR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论