重构代码之用多态替代条件逻辑

在代码重构中,用多态替代条件逻辑 是一种将冗长的条件逻辑替换为面向对象多态性的技巧。这种技术的核心思想是将不同条件分支中的行为封装到各自的子类中,从而避免在代码中出现复杂的if-elseswitch条件判断。通过使用多态性,可以让代码更具可读性、易于扩展,并且符合"开闭原则"(Open-Closed Principle)。

一、何时使用

用多态替代条件逻辑适用于以下场景:

  1. 重复的条件逻辑:代码中有多个条件分支,根据特定的状态或类型执行不同的逻辑。
  2. 复杂的条件分支if-elseswitch语句变得非常复杂,难以维护和理解。
  3. 频繁扩展的业务需求:代码逻辑可能经常需要扩展(添加新的分支),这样子类的设计会更适合长期维护。

二、代码示例

假设我们有一个订单系统,根据不同的订单类型来计算折扣。

2.1 重构前

在重构前,代码中存在一个复杂的switch语句:

csharp 复制代码
public class Order
{
    public enum OrderType { Regular, Premium, VIP }

    public OrderType Type { get; set; }
    public decimal Amount { get; set; }

    public decimal GetDiscount()
    {
        switch (Type)
        {
            case OrderType.Regular:
                return Amount * 0.05m; // 5% discount
            case OrderType.Premium:
                return Amount * 0.10m; // 10% discount
            case OrderType.VIP:
                return Amount * 0.20m; // 20% discount
            default:
                throw new InvalidOperationException("Unknown order type");
        }
    }
}

这个switch逻辑可能会随着业务需求增加而不断扩展,每次添加新类型的订单都需要修改此方法,不符合开闭原则。

2.2 重构后

可以将每种订单类型的折扣逻辑封装到各自的子类中,使用多态来替代条件判断:

csharp 复制代码
public abstract class Order
{
    public decimal Amount { get; set; }

    public abstract decimal GetDiscount();
}

public class RegularOrder : Order
{
    public override decimal GetDiscount() => Amount * 0.05m;
}

public class PremiumOrder : Order
{
    public override decimal GetDiscount() => Amount * 0.10m;
}

public class VIPOrder : Order
{
    public override decimal GetDiscount() => Amount * 0.20m;
}

然后,我们在创建订单时,根据订单类型选择相应的子类:

csharp 复制代码
public class OrderFactory
{
    public static Order CreateOrder(string type, decimal amount)
    {
        Order order = type switch
        {
            "Regular" => new RegularOrder { Amount = amount },
            "Premium" => new PremiumOrder { Amount = amount },
            "VIP" => new VIPOrder { Amount = amount },
            _ => throw new ArgumentException("Invalid order type")
        };
        return order;
    }
}

使用时:

csharp 复制代码
Order order = OrderFactory.CreateOrder("VIP", 1000);
decimal discount = order.GetDiscount();
Console.WriteLine($"Discount: {discount}");

三、优点

  1. 代码简洁:消除了条件语句,使代码更加清晰。
  2. 易于扩展:添加新的订单类型时,只需创建一个新的子类,而不需要修改现有代码,符合开闭原则。
  3. 提高可维护性:每个类的职责更加明确,便于理解和维护。

四、总结

通过"用多态替代条件逻辑"这一重构手法,我们可以将条件判断的复杂逻辑转移到类的层次结构上,从而提高代码的灵活性和可维护性。这一技术尤其适合频繁扩展的业务场景,使得新增功能的引入变得简单。

相关推荐
心之语歌5 分钟前
LiteFlow Spring boot使用方式
java·开发语言
计算机-秋大田6 分钟前
基于微信小程序的校园失物招领系统设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计
黑客老李6 分钟前
区块链 智能合约安全 | 回滚攻击
服务器·数据仓库·hive·hadoop·区块链·php·智能合约
綦枫Maple7 分钟前
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
java·spring boot·后端
不知 不知29 分钟前
最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机
linux·运维·服务器·centos
BUG 40437 分钟前
Linux--运维
linux·运维·服务器
极客先躯41 分钟前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
码至终章43 分钟前
kafka常用目录文件解析
java·分布式·后端·kafka·mq
Mr.Demo.1 小时前
[Spring] Nacos详解
java·后端·spring·微服务·springcloud
luoganttcc1 小时前
华为升腾算子开发(一) helloword
java·前端·华为