Trong nhiều trường hợp If-Else không phải là xấu. Tuy nhiên khi đoạn code của bạn có quá nhiều if-else thì bạn nên thay đổi để code trở nên dễ đọc, dễ dàng bảo trì hơn. Hãy xem xét ví dụ sau:

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;
    }
    return result;
}

Nếu như chúng ta phải thêm nhiều toán tử khác thì if-else sẽ ngày càng nhiều, code trở lên khó đọc hơn. Vậy có cách nào để khắc phục điều này? Chúng ta sẽ xây dựng một Interface như sau:

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

Sau đó triển khai các operator từ interface này. Ví dụ với operator “Addition”

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

Tiếp đó chúng ta cần một Factory class như

public class OperatorFactory {
    static Dictionary<String, Operation> operationMap = new Dictionary<>();
    static {
        operationMap.put("add", new Addition());
        operationMap.put("divide", new Division());
        // more operators
    }

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

Ví dụ muốn thực hiện toán tử “Addition”, chúng ta có thể viết lại đoạn như dưới đây:

public int calculateUsingFactory(int a, int b, String operator) {
    Operation targetOperation = OperatorFactory
      .getOperation(operator)
    return targetOperation.apply(a, b);
}

Bây giờ code đã trở nên rất rõ ràng. Ngoài cách trên chúng ta có thể sử dụng “Command Pattern”. Cách triển khai “Command Pattern” như sau:

Trước tiên, chúng ta cần một interface “Command”

public interface Command {
    Integer execute();
}

Sau đó là implement các operator

public class AddCommand implements Command {
    // Instance variables

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

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

Tiếp đó là class để thực hiện command này

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

Ví dụ với việc thực hiện “Add command”, ta dễ dàng thực hiện như sau:

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

Great!!!!! Hy vọng là những cách trên có thể giúp bạn viết code đẹp hơn, dễ bảo trì hơn.