专栏名称: 大淘宝技术
淘系技术官方账号
目录
相关文章推荐
OSC开源社区  ·  AI 云原生时代,开发一个 Agent ... ·  5 小时前  
程序猿  ·  高校考试禁用红米手机!网友炸锅…… ·  昨天  
阿里云云栖号  ·  一周AI大事件 ·  昨天  
伯乐在线  ·  年薪 7000 万!扎克伯格大撒币,挖 AI 大牛 ·  3 天前  
伯乐在线  ·  年薪 7000 万!扎克伯格大撒币,挖 AI 大牛 ·  3 天前  
稀土掘金技术社区  ·  【万字总结】2025 前端+大前端+全栈 ... ·  3 天前  
51好读  ›  专栏  ›  大淘宝技术

代码优化实战:圈复杂度治理之函数抽离技巧

大淘宝技术  · 公众号  · 程序员  · 2025-01-20 20:55

正文

请到「今天看啥」查看全文


2. 重复 的代码

3. 明确的想有一个 子行为 来获取某种数据,完成某种判断


2. 尽可能不用IDEA快捷键重构

IDEA的重构能力仅能实现函数抽离,但是它无法“ 设计函数 ”。

Query query = new Query();Long id = query.getId();if (query.isXX()) {    // xxx}if (id != null) {    // xxx}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()) {        // xxx    }    if (id != null) {        // xxx    }    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.







请到「今天看啥」查看全文