软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)

一、使用策略模式

1、JS 实例实操
  1. 优化前
js 复制代码
function calculateBonus(employeeType, salary) {
    if (employeeType === "Manager") {
        return salary * 0.2;
    } else if (employeeType === "Developer") {
        return salary * 0.1;
    } else if (employeeType === "Intern") {
        return salary * 0.05;
    } else {
        return 0;
    }
}
  1. 优化后
js 复制代码
const bonusStrategies = {
    Manager: (salary) => salary * 0.2,
    Developer: (salary) => salary * 0.1,
    Intern: (salary) => salary * 0.05,
    default: () => 0,
};

function calculateBonus(employeeType, salary) {
    const strategy = bonusStrategies[employeeType] || bonusStrategies.default;
    return strategy(salary);
}
2、Java 实例实操
  1. 优化前
java 复制代码
public static double calculateBonus(String employeeType, double salary) {
    if ("Manager".equals(employeeType)) {
        return salary * 0.2;
    } else if ("Developer".equals(employeeType)) {
        return salary * 0.1;
    } else if ("Intern".equals(employeeType)) {
        return salary * 0.05;
    } else {
        return 0;
    }
}
  1. 优化后
java 复制代码
interface BonusStrategy {
    double calculate(double salary);
}

public class BonusCalculator {
    private Map<String, BonusStrategy> strategies;

    public BonusCalculator() {
        strategies = new HashMap<>();
        strategies.put("Manager", salary -> salary * 0.2);
        strategies.put("Developer", salary -> salary * 0.1);
        strategies.put("Intern", salary -> salary * 0.05);
    }

    public double calculateBonus(String employeeType, double salary) {
        BonusStrategy strategy = strategies.get(employeeType);
        return strategy != null ? strategy.calculate(salary) : 0;
    }
}

二、使用映射表

1、JS 实例实操
  1. 优化前
js 复制代码
function getDayName(dayNumber) {
    if (dayNumber === 0) return "Sunday";
    else if (dayNumber === 1) return "Monday";
    else if (dayNumber === 2) return "Tuesday";
    else if (dayNumber === 3) return "Wednesday";
    else if (dayNumber === 4) return "Thursday";
    else if (dayNumber === 5) return "Friday";
    else if (dayNumber === 6) return "Saturday";
    else return "Invalid day";
}
  1. 优化后
js 复制代码
const dayNames = {
    0: "Sunday",
    1: "Monday",
    2: "Tuesday",
    3: "Wednesday",
    4: "Thursday",
    5: "Friday",
    6: "Saturday",
};

function getDayName(dayNumber) {
    return dayNames[dayNumber] || "Invalid day";
}
2、Java 实例实操
  1. 优化前
java 复制代码
public static String getDayName(int dayNumber) {
    switch (dayNumber) {
        case 0:
            return "Sunday";
        case 1:
            return "Monday";
        case 2:
            return "Tuesday";
        case 3:
            return "Wednesday";
        case 4:
            return "Thursday";
        case 5:
            return "Friday";
        case 6:
            return "Saturday";
        default:
            return "Invalid day";
    }
}
  1. 优化后
java 复制代码
public class DayUtils {
    private static final Map<Integer, String> DAY_NAMES = Map.of(
            0, "Sunday",
            1, "Monday",
            2, "Tuesday",
            3, "Wednesday",
            4, "Thursday",
            5, "Friday",
            6, "Saturday"
    );

    public static String getDayName(int dayNumber) {
        return DAY_NAMES.getOrDefault(dayNumber, "Invalid day");
    }
}

三、使用枚举

  1. 优化前
java 复制代码
public static String getStatusDescription(int statusCode) {
    if (statusCode == 200) {
        return "OK";
    } else if (statusCode == 404) {
        return "Not Found";
    } else if (statusCode == 500) {
        return "Internal Server Error";
    } else {
        return "Unknown Status";
    }
}
  1. 优化后
java 复制代码
public enum HttpStatus {
    OK(200, "OK"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_ERROR(500, "Internal Server Error");

    private final int code;
    private final String description;

    HttpStatus(int code, String description) {
        this.code = code;
        this.description = description;
    }

    public static String getDescription(int code) {
        for (HttpStatus status : values()) {
            if (status.code == code) {
                return status.description;
            }
        }
        return "Unknown Status";
    }
}

String description = HttpStatus.getDescription(statusCode);

四、使用函数式编程

1、JS 实例实操
js 复制代码
const conditions = [
    { test: (x) => x < 0, result: "负值" },
    { test: (x) => x === 0, result: "零" },
    { test: (x) => x > 0, result: "正值" },
];

function evaluate(x) {
    return conditions.find((cond) => cond.test(x)).result;
}
2、Java 实例实操
java 复制代码
interface Condition {
    boolean test(int x);

    String getResult();
}

public static String evaluate(int x) {
    List<Condition> conditions = Arrays.asList(
            new Condition() {
                @Override
                public boolean test(int x) {
                    return x < 0;
                }

                @Override
                public String getResult() {
                    return "负值";
                }
            },
            new Condition() {
                @Override
                public boolean test(int x) {
                    return x == 0;
                }

                @Override
                public String getResult() {
                    return "零";
                }
            },
            new Condition() {
                @Override
                public boolean test(int x) {
                    return x > 0;
                }

                @Override
                public String getResult() {
                    return "正值";
                }
            }
    );

    Optional<Condition> matched = conditions.stream()
            .filter(cond -> cond.test(x))
            .findFirst();

    return matched.isPresent() ? matched.get().getResult() : "未知";
}
相关推荐
程序员黑豆8 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
wuyk5559 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
hey_sml9 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo10 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖11 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才11 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio12 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖13 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
avi911113 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen13 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程