正文
时
2.
有
重复
的代码
3.
明确的想有一个
子行为
来获取某种数据,完成某种判断
▐
2.
尽可能不用IDEA快捷键重构
IDEA的重构能力仅能实现函数抽离,但是它无法“
设计函数
”。
Query query = new Query();
Long id = query.getId();
if (query.isXX()) {
}
if (id != null) {
}
String res = "xxx";
System.out.println(res + id);
如我们代码中比较常见的场景:
使用Query对象查询数据返回给前端,3-9行代码负责对res对象的计算。
其中最核心的是id这个变量,不但参与了res对象的计算,而且还参与了最终返回给前端对象的计算。我相信任何一个业务都会有这种核心字段。
但如果我们用IDEA的能力去重构,会发现:
Query query = new Query();
Long id = query.getId();
String res = getString(query, id);
System.out.println(res);
private static @NotNull String getString(Query query, Long id) {
if (query.isXX()) {
}
if (id != null) {
}
String res = "xxx";
return res;
}
IDEA竟然把id作为一个参数传入。
IDEA只能保证我们重构的结果是前后一致的,但它无法知道我们的getId方法是不是有很耗时的计算逻辑。
这种非人为思考的重构动作就给后续人维护带来了巨大的困扰,这个是很常见的。
1. 我想复用这个方法,发现这里还需要传递一个额外的id,这个id是什么id,和query里面的id是一个id吗?
2. 我需要新加一个参数,是加在入参吗,还是加在query对象中?
注:可以使用IDEA抽取函数,但是抽取完之后一定要思考。
优先设计函数,再使用函数,而不是先写代码,再抽函数出来。
▐
3.
怎么提取通过循环计算的变量
如果我们抽离的函数在
处理循环
,这个循环里面同时在计算多个变量。
方案1:
直接拆分成2个循环去计算2个变量
(我之前遇到这样的情况,都是放开不管,或者用一个对象包装这2个参数,后来突然想到可以分成2个循环计算,然后想起来师兄之前推荐过我《重构》这本书,翻了一下,原来人家早就想到了)
方案2:用对象来承接最终计算的结果,如果
2个参数之间关系紧密
,用对象承接再合适不过。
▐
4.