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);
}
|
老师又说了
于是代码又回到了开始