Java Top.

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程

1.概述

决策构造是任何编程语言的重要组成部分。但是,我们登陆了大量嵌套的IF语句,这使我们的代码更加复杂,难以维护。

在本教程中,我们将介绍替换嵌套if语句的各种方法

让我们探索如何简化代码的不同选项。

2.案例研究

我们经常遇到涉及大量条件的业务逻辑,并且它们中的每一个都需要不同的处理。为了演示,让我们参加一个例子计算器类。我们将有一个方法,它接受两个数字和一个操作符作为输入,并根据操作返回结果:

public int count (int a, int b, String操作符){int result = Integer.MIN_VALUE;if ("add".equals(operator)) {result = a + b;} else if ("multiply".equals(operator)) {result = a * b;} else if("除法".equals(操作符){result = a / b;} else if ("subtract".equals(operator)) {result = a - b;}返回结果;}

我们也可以使用转变陈述:

Public Int CalculateSingswitch(int a,int b,string operator){switch(运算符){case“添加”:结果= a + b;休息;//其他情况}返回结果;}

在典型的发展中,如果陈述可能在自然中增长更大更复杂。还,当存在复杂的条件时,交换机语句不适合

具有嵌套决策构造的另一个副作用是它们变得无法管理。例如,如果我们需要添加新的运算符,我们必须添加新的IF语句并实现操作。

3.重构

让我们探索替代选项来替换上面的复杂IF语句,以更简单和可管理的代码。

3.1。工厂类

很多时候,我们会遇到在每个分支中执行类似操作的决策结构。这提供了一个机会提取返回给定类型的对象的工厂方法,并根据具体对象行为执行操作

对于我们的示例,让我们定义一个手术接口有一个单一的界面申请方法:

public interface Operation {int apply(int a, int b);}

该方法接受两个数字作为输入并返回结果。让我们定义一个执行添加的类:

public class add implements Operation {@Override public int apply(int a, int b) {return a + b;}}

现在我们将实现一个工厂类,它将返回的实例手术根据给定的运算符:

public class OperatorFactory {static Map operationMap = new HashMap<>();静态{operationMap。把(“添加”,新成员());operationMap。把(“鸿沟”,新部门());//更多的操作符}public static Optional getOperation(String operator) {return Optional. ofnullable (operationMap.get(operator));}}

现在,在计算器类,我们可以查询工厂获取相关操作并在源数字上应用:

public int calculateUsingFactory(int a, int b, String operator) {targetOperation = OperatorFactory .getOperation(operator) .orElseThrow(() -> new IllegalArgumentException("无效的operator "));targetOperation返回。应用(a, b);}

在此示例中,我们已经看到了如何将责任委托以松散耦合出厂类服务的对象。但是可能有可能在嵌套如果陈述简单地转移到工厂课程的机会,这突破了我们的目的。

另外,我们可以维护一个物体的存储库地图可以询问快速查询。正如我们所见OperatorFactory#OperationMap.为我们的宗旨提供。我们还可以初始化地图在运行时,并配置它们以进行查找。

3.2。使用枚举

除了使用地图,我们也可以用枚举标记特定的业务逻辑。之后,我们可以在嵌套中使用它们如果是陈述开关情况陈述。另外,我们还可以将它们用作对象工厂,并对它们进行策略化,以执行相关的业务逻辑。

这也将减少嵌套if语句的数量,并将责任委托给个人枚举值。

让我们看看我们如何实现它。首先,我们需要定义我们的枚举:

公共枚举运算符{添加,乘以,减去,划分}

正如我们可以观察到的那样,值是不同运算符的标签,该标签将进一步用于计算。我们始终可以选择使用嵌套IF语句或切换案例中的不同条件的值,但是让我们设计委托逻辑的替代方式枚举本身。

我们将为每个枚举值并进行计算。例如:

添加{@override public int应用(int a,int b){return a + b;}},//其他运营商公开摘要INT适用(int a,int b);

然后在里面计算器类,我们可以定义一种执行操作的方法:

公共int计算(int a,int b,操作员运营商){return运算符.Apply(a,b);}

现在,我们可以调用这个方法转换字符串价值到操作符通过使用操作员#valueof()方法:

@Test public void whenCalculateUsingEnumOperator_thenReturnCorrectResult() {Calculator Calculator = new Calculator();int result = calculator。计算(3、4、Operator.valueOf(“添加”));assertequal(7,结果);}

3.3。命令模式

在上一篇讨论中,我们已经看到使用工厂类来返回给定运营商的正确业务对象的实例。稍后,业务对象用于执行计算计算器

我们也可以设计一个计算器#计算方法接受可在输入上执行的命令。这将是另一种替换嵌套的方式如果是陈述

我们首先定义命令接口:

公共接口命令{整数execute();}

接下来,让我们实现一个AddCommand:

public class AddCommand implements Command{//实例变量public AddCommand(int a, int b) {this。一个=;这一点。b = b;} @Override public Integer execute() {return a + b;}}

最后,让我们介绍一个新的方法在计算器接受并执行命令:

public int calculate(命令命令){return命令.execute();}

接下来,我们可以通过实例化一个AddCommand然后把它送到计算器#计算方法:

@Test public void whenCalculateUsingCommand_thenReturnCorrectResult() {Calculator Calculator = new Calculator();int result = calculator。计算(新AddCommand(3、7));assertequal(10、结果);}

3.4。规则引擎

当我们最终编写大量嵌套的if语句时,每个条件都描述了一个业务规则,必须对该业务规则进行评估,以获得要处理的正确逻辑。规则引擎从主代码中消除了这样的复杂性。一个ruleengine.评估这一点规则并根据输入返回结果。

让我们通过设计一个简单的榜样走过一个例子ruleengine.这过程表达通过一套规则并从所选结果返回结果规则。首先,我们定义a规则接口:

public interface Rule {boolean evaluate(Expression Expression);结果getResult ();}

其次,让我们实施ruleengine.:

公共类统治{私有静态列表<规则>规则= new arraylist <>();静态{rules.add(new addrule());公共结果进程(表达式表达式){规则规则=规则.stream().filter(r  - > r.evaluate(表达式)).findfirst().findfirst().orelsethrow(() - > newleallargumentexception(“表达式与任何匹配规则”));返回规则.GetResult();}}

ruleengine.接受A.表达对象并返回结果。现在,让我们设计表达班级作为两组整数的对象操作符将应用:

public class Expression {private Integer x;私人整数y;私人运营商算子;}

最后让我们定义一个自定义AddRule类,该类只在添加操作指定:

public class AddRule implements Rule {@Override public boolean evaluate(Expression Expression) {boolean evalResult = false;if (expression.getOperator() == Operator.ADD) {this. getoperator ();result = expression.getX() + expression.getY();evalResult = true;}返回evalResult;}}

我们现在会援引ruleengine.表达:

@test公共void时numbersgiventoruleengine_thenreturncorrectresult(){表达式表达式=新表达式(5,5,运算符.DD);Ruleengine发动机=新的Ruleengine();结果结果= Engine.Process(表达式);assertnotnull(结果);assertequals(10,结果.galue());}

4。结论

在本教程中,我们探索了一些简化复杂代码的不同选项。我们还学习了如何通过使用有效的设计模式来替换嵌套的if语句。

一如既往,我们可以找到完整的源代码GitHub库

Java底部

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程
8评论
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!