对于看复杂代码的思路
假如一个3000行的代码的方法屎山代码几十个对象100多个变量名字。要你去梳理这些代码在做什么。没有任务的业务资料。不知道这些代码在做什么那么如何理解这堆代码。良好的休息带来好的思路。我讲几个思路。1.代码背后的图景代码是一种形式。我们其实可以把代码想象成一个大树的根系。我们只需要关注json文件串进去以后会走哪个轨道会发生什么事情就够了。我们写代码其实就是写的数据流转的轨道。不同的数据当满足一定的条件到达不同的地点。那么它的全图景就是一个大树的根系。2.了解代码要做的事情所谓的业务就是要达成什么样的效果我们看代码也是可以分阶段第一个数据校验阶段数据不对或者异常要抛异常和return的第二个阶段取数据如果用户给的数据不对要返回不同的数据也就是ifelse。第三个阶段执行业务要做的事情。3.了解业务要做的事情在代码的世界里程序的世界里。要做的事情其实就实际上是什么呢对一个或者多个表里的一条或者对条数据进行操作。办业务是什么写表落数据。转账是什么写表落数据。这个就是业务。在高阶一点的无非不同的字段不同的值落不同的数据。在高阶一点的能处理并发了解服务器的情况。你的思路非常棒尤其是“根系图景”和“写表即业务”这两个视角能极大降低理解屎山的认知负担。我顺着你的思路补充几个可落地、不依赖文档的实操手法帮你把“怎么开始”落到实处。一、不动代码先做“输入-输出”黑盒快照你提到“json 进去走哪个轨道”这正好是最快切入点。做法找到这个 3000 行方法的入口和出口不读中间代码只打印入参json 结构返回值抛出的异常构造2–3 个典型输入凭经验猜正常数据运行一次看输出这一步不为了理解逻辑而是建立一个“输入 → 输出”对照表避免后面迷失在细节里。二、按“数据校验 → 数据准备 → 数据落库”三段切分你提的三阶段非常准确。实操时可以这样做第一阶段找所有return和throw用 IDE 搜索return、throw、if (invalid)标记出前置校验的代码块问自己哪些输入会在这里被挡掉✅ 目标知道“什么数据进不了核心逻辑”第二阶段找所有数据读取操作搜索SELECT、get、query、find、拉取画出从哪里取数据 → 存到哪个临时变量✅ 目标知道“它依赖了哪些外部数据”第三阶段找所有写入操作搜索INSERT、UPDATE、save、persist、事务重点关注同一个事务里的写入顺序✅ 目标知道“最终改了什么表、什么字段”三、用“变量消亡法”而不是“变量追踪法”你说有 100 多个变量名如果去追踪每个变量从哪里来会很痛苦。更高效的方法只看变量最后一次被使用的地方如果一个变量赋值后从未再被读 →直接忽略实操从方法末尾倒着读找最终返回或写入数据库的那几个值反向追这几个关键值是怎么来的屎山代码里 70% 的变量是中间临时变量对理解最终业务无影响。四、把“业务”还原成“表的变化”你这句话非常对办业务 写表转账 写表所以梳理时最终只回答三个问题这个方法可能写入哪些表核心在什么条件下写条件简化成 2–3 种场景写入的数据来自哪里入参 / 外部查询 / 固定值当你把这三点写在一张纸上业务就清楚了。五、一个极简的梳理模板可直接用为这个 3000 行方法建立一个.txt【输入】 - 关键字段1 - 关键字段2 【出口】 - 正常返回 - 异常返回 【校验阶段】 - 会拦截的异常输入 【数据准备】 - 查了哪些表/接口 【写表阶段】 - 场景A → 写表 T1, T2 - 场景B → 写表 T3 【不确定但重要】 - 这里看不懂但不影响主线六、一个心理技巧接受“局部不理解”3000 行屎山不需要每一行都懂。你只需要知道输入什么什么情况下会报错最终改了哪些表中间那 2000 行往往是历史遗留的防御代码、无效赋值、死分支。你的目标不是理解代码而是能安全地修改或替换它。如果你愿意可以把方法的入口签名你怀疑的核心 2–3 个表名一两个典型输入样例发出来我可以帮你做一次示例级别的梳理推演。