04|TDD演示(4):实现对于列表参数的支持

TDD 学习笔记 | 极客时间 | 徐昊·TDD 项目实战 70 讲

🏆 课程原文链接 🍿 源码地址 ⚠️ 代码已翻车

感受到了极限编程的气息!😃

使用有意义的方法名代替注释

  • || 不同的条件抽取到不同的方法
  • && 条件通常抽取到同一个方法里

SingleValueOptionParser.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public T parse(List<String> arguments, Option option) {
    String flag = "-" + option.value();
    int index = arguments.indexOf(flag);
    if (index == -1) {
        return defaultValue;
    }
    if (isReachEndOfList(arguments, index) ||
            isFollowedByOtherFlag(arguments, index)) {
        throw new InsufficientArgumentsException(option.value());
    }
    if (secondArgumentIsNotAFlag(arguments, index)) {
        throw new TooManyArgumentsException(option.value());
    }
    return valueParser.apply(arguments.get(index + 1));
}

⚠️ 即使用了有意义的方法依然暴露了太多实现细节

✅ 重构后变直观

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public T parse(List<String> arguments, Option option) {
    String flag = "-" + option.value();
    int index = arguments.indexOf(flag);
    if (index == -1) {
        return defaultValue;
    }

    List<String> values = values(arguments, index);

    if (values.size() < 1) {
        throw new InsufficientArgumentsException(option.value());
    }
    if (values.size() > 1) {
        throw new TooManyArgumentsException(option.value());
    }
    return valueParser.apply(arguments.get(index + 1));
}

SingleValueOptionParser.java values 方法

徐昊老师的

1
2
3
4
5
private List<String> values(List<String> arguments, int index) {
    return arguments.subList(index + 1, IntStream.range(index + 1, arguments.size())
            .filter(it -> arguments.get(it).startsWith("-"))
            .findFirst().orElse(arguments.size()));
}

我的

1
2
3
4
5
6
7
private List<String> values(List<String> arguments, int index) {
    int followingFlag = IntStream.range(index + 1, arguments.size())
            .filter(it -> arguments.get(it).startsWith("-"))
            .findFirst().orElse(arguments.size());

    return arguments.subList(index + 1, followingFlag);
}

虽然我的代码长点,但感觉更易读

  • 因为 followingFlag 是一个很好的解释
  • 不然要阅读整段代码才能理解
  • 😅 虽然两段代码我都不是很懂,但不影响学习讨论

经过老师指点

  • 可以 相当于抽变量加注释
  • 当然从可读性来说 抽方法更好读
  • java没有内嵌方法 不然可以不用脱离当前上下文(🙀 这点已经超出了我目前的知识范围,先记录下来)

我抽出了一个方法,确实更好了 🥲

1
2
3
4
private List<String> values(List<String> arguments, int index) {
    int followingFlag = getFollowingFlag(arguments, index);
    return arguments.subList(index + 1, followingFlag);
}

老师又说了

  • 这时候你inline回去也不影响阅读
  • 反而更好读

于是代码又回到了开始

comments powered by Disqus