如何修复违反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); }
逻辑说明
- 核心方法
match(Predicate<ITokenType>, int):把两个方法里重复的「检查token存在→获取token类型→判断→返回结果」流程全部抽离,只把不同的判断逻辑作为参数传入。 - 第一个重载:用lambda表达式直接实现「类型是否与预期实例相等」的判断(如果
ITokenType是枚举类型,==是安全的;如果是普通类可替换为equals)。 - 第二个重载:用方法引用
clazz::isInstance直接复用Class.isInstance的判断逻辑,简洁清晰。
这样既保留了原来两个方法的对外接口,又完全消除了重复代码,符合DRY原则。
内容的提问来源于stack exchange,提问作者Daniil Shulgin
相关产品推荐
相关产品推荐

