You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复违反DRY原则的代码?附重复match方法示例

解决方法

首先提取公共逻辑到一个核心方法,用函数式接口封装不同的判断规则,这样两个重载方法只需传入各自的判断逻辑,避免重复代码:

// 核心公共方法,封装重复的流程逻辑
private Token match(Predicate<ITokenType> typeChecker, int tokenNum) {
    if (hasToken(_currentTokenNum)) {
        ITokenType tokenType = getToken(tokenNum).get_type();
        if (typeChecker.test(tokenType)) {
            return getToken(tokenNum);
        }
    }
    return null;
}

// 原来的第一个重载方法,复用核心逻辑
public Token match(ITokenType expectedToken, int tokenNum) {
    return match(tokenType -> tokenType == expectedToken, tokenNum);
}

// 原来的第二个重载方法,复用核心逻辑
public Token match(Class<?> clazz, int tokenNum) {
    return match(clazz::isInstance, tokenNum);
}

逻辑说明

  1. 核心方法match(Predicate<ITokenType>, int):把两个方法里重复的「检查token存在→获取token类型→判断→返回结果」流程全部抽离,只把不同的判断逻辑作为参数传入。
  2. 第一个重载:用lambda表达式直接实现「类型是否与预期实例相等」的判断(如果ITokenType是枚举类型,==是安全的;如果是普通类可替换为equals)。
  3. 第二个重载:用方法引用clazz::isInstance直接复用Class.isInstance的判断逻辑,简洁清晰。

这样既保留了原来两个方法的对外接口,又完全消除了重复代码,符合DRY原则。

内容的提问来源于stack exchange,提问作者Daniil Shulgin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:33:10