溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java消除大量的if else判斷的方法

發(fā)布時間:2020-07-28 09:43:15 來源:億速云 閱讀:217 作者:小豬 欄目:編程語言

這篇文章主要講解了java消除大量的if else判斷的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

1.簡介

if判斷語句是很多編程語言的重要組成部分。但是,若我們最終編寫了大量嵌套的if語句,這將使得我們的代碼更加復(fù)雜和難以維護(hù)。

讓我們看看能否使用別的方式來做呢。

設(shè)計模式是為了更好的代碼重用性,可讀性,可靠性,可維護(hù)性,它有六大原則:

  • 單一職責(zé)原則(Single Responsibility Principle,簡稱SRP):該原則是針對類來說的,即一個類應(yīng)該只負(fù)責(zé)一項職責(zé).
  • 開放--封閉原則(The Open-Closed Principle簡稱OCP):是說軟件實體(類、模塊、函數(shù)等等)應(yīng)該可以擴(kuò)展,但是不可以修改。
  • 依賴倒轉(zhuǎn)原則(Dependence Inversion Principle :針對接口編程,不要對實現(xiàn)編程
  • 里氏代換原則(Liskov Substitution Principle,簡稱LSP):里氏代換原則,子類型必須能夠替換掉他們的父類型
  • 迪米特法則(Law of Demeter):如果兩個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用
  • 合成/聚合復(fù)用原則(Composition/Aggregation Principle],簡稱CARP):盡量使用合成/聚合,盡量不使用類繼承。合成聚合是“has  a”的關(guān)系,而繼承是“is  a”的關(guān)系。

2.示例if..else

public int calculate(int a, int b, String operator) {
 int result = Integer.MIN_VALUE;

 if ("add".equals(operator)) {
 result = a + b;
 } else if ("multiply".equals(operator)) {
 result = a * b;
 } else if ("divide".equals(operator)) {
 result = a / b;
 } else if ("subtract".equals(operator)) {
 result = a - b;
 } else if ("modulo".equals(operator)) {
 result = a % b;
 }
 return result;
}

switch-case

public int calculateUsingSwitch(int a, int b, String operator) {
 int result = 0;
 switch (operator) {
 case "add":
 result = a + b;
 break;
 case "multiply":
 result = a * b;
 break;
 case "divide":
 result = a / b;
 break;
 case "subtract":
 result = a - b;
 break;
 case "modulo":
 result = a % b;
 break;
 default:
 result = Integer.MIN_VALUE;
 }
 return result;
}

3.重構(gòu)

3.1 工廠方式重構(gòu)

抽象層Operation.java

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

加法實現(xiàn)Addition.java:

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

減法實現(xiàn)Subtraction.java

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

乘法實現(xiàn)Multiplication.java

public class Multiplication implements Operation {
 @Override
 public int apply(int a, int b) {
 return a\*b;
 }
}

除法實現(xiàn)Division.java

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

求余實現(xiàn)Modulo.java

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

工廠類OperatorFactory.java

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class OperatorFactory {
 static Map<String, Operation> operationMap = new HashMap<>();
 
 static {
 operationMap.put("add", new Addition());
 operationMap.put("divide", new Division());
 operationMap.put("multiply", new Multiplication());
 operationMap.put("subtract", new Subtraction());
 operationMap.put("modulo", new Modulo());
 }

 public static Optional<Operation> getOperation(String operation) {
 return Optional.ofNullable(operationMap.get(operation));
 }
}

使用示例

public int calculateUsingFactory(int a, int b, String operator) {
 Operation targetOperation = OperatorFactory
 .getOperation(operator)
 .orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
 return targetOperation.apply(a, b);
}

3.2 枚舉方式重構(gòu)

枚舉實現(xiàn)Operator.java

public enum Operator {
 ADD {
 @Override
 public int apply(int a, int b) {
  return a + b;
 }
 },
 MULTIPLY {
 @Override
 public int apply(int a, int b) {
  return a * b;
 }
 },
 SUBTRACT {
 @Override
 public int apply(int a, int b) {
  return a - b;
 }
 },
 DIVIDE {
 @Override
 public int apply(int a, int b) {
  return a / b;
 }
 },
 MODULO {
 @Override
 public int apply(int a, int b) {
  return a % b;
 }
 };
 public abstract int apply(int a, int b);
}

封裝Operator到Calculator.java

public int calculate(int a, int b, Operator operator) {
 return operator.apply(a, b);
}

使用示例

@Test
public void whenCalculateUsingEnumOperator_thenReturnCorrectResult() {
 Calculator calculator = new Calculator();
 int result = calculator.calculate(3, 4, Operator.valueOf("ADD"));
 assertEquals(7, result);
}

3.3 命令模式

抽象的接口

public interface Command {
 Integer execute();
}

實現(xiàn)類

package com.baeldung.reducingIfElse;

public class AddCommand implements Command {

 private int a;
 private int b;

 public AddCommand(int a, int b) {
 this.a = a;
 this.b = b;
 }

 @Override
 public Integer execute() {
 return a + b;
 }
}

其它略
包裝

public int calculate(Command command) {
 return command.execute();
}

測試demo

@Test
public void whenCalculateUsingCommand_thenReturnCorrectResult() {
 Calculator calculator = new Calculator();
 int result = calculator.calculate(new AddCommand(3, 7));
 assertEquals(10, result);
}

3.4 規(guī)則引擎重構(gòu)

抽象規(guī)則

public interface Rule {
 boolean evaluate(Expression expression);
 Result getResult();
}

實現(xiàn)規(guī)則AddRule.java 其它略

public class AddRule implements Rule {
 private int result;
 @Override
 public boolean evaluate(Expression expression) {
 boolean evalResult = false;
 if (expression.getOperator() == Operator.ADD) {
  this.result = expression.getX() + expression.getY();
  evalResult = true;
 }
 return evalResult;
 }
 @Override
 public Result getResult() {
 return new Result(result);
 }
}

其中:返回結(jié)果

public class Result {
 int value;

 public Result(int value) {
  this.value = value;
 }

 public int getValue() {
  return value;
 }
}

表達(dá)式

public class Expression {
 private Integer x;
 private Integer y;
 private Operator operator;
 public Expression(Integer x, Integer y, Operator operator) {
  this.x = x;
  this.y = y;
  this.operator = operator;
 }
 public Integer getX() {
  return x;
 }
 public Integer getY() {
  return y;
 }
 public Operator getOperator() {
  return operator;
 }
}

規(guī)則引擎RuleEngine.java

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class RuleEngine {
 private static List<Rule> rules = new ArrayList<>();
 static {
  rules.add(new AddRule());
 }
 public Result process(Expression expression) {
  Rule rule = rules.stream()
   .filter(r -> r.evaluate(expression))
   .findFirst()
   .orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule"));
  return rule.getResult();
 }
}

測試demo

@Test
public void whenNumbersGivenToRuleEngine_thenReturnCorrectResult() {
 Expression expression = new Expression(5, 5, Operator.ADD);
 RuleEngine engine = new RuleEngine();
 Result result = engine.process(expression);
 assertNotNull(result);
 assertEquals(10, result.getValue());
}

4.比較

重構(gòu)方式SRPOCPDIPLSPLDCARP
IF/ELSENNNNNN
工廠方法YYYYYY
枚舉方法NYYYYY
命令模式YYYYYY
規(guī)則引擎YYYYYY

5.小結(jié)

  為了更好的代碼重用性,可讀性,可靠性,可維護(hù)性,我們會嘗試將IF/ELSE或者case-switch進(jìn)行改造,使用工廠方法,枚舉方法,命令模式,規(guī)則引擎方式不同方法進(jìn)行嘗試,最后使用設(shè)計模式的六大原則對代碼進(jìn)行評估。

看完上述內(nèi)容,是不是對java消除大量的if else判斷的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI