首页 新闻 会员 周边 捐助

使用函数的主要作用是复用代码?

0
[已关闭问题] 关闭于 2025-10-19 17:02
使用函数的主要作用是复用代码?
 
 
“复用代码”只是函数最表层、最容易被看到的好处。
真正把函数当成核心工具,是因为它能同时完成四件大事:
  1. 压缩复杂度(分而治之)
    把 50 行纠缠在一起的逻辑变成一行函数调用,大脑一次只要处理 5 行。
  2. 建立抽象层(屏蔽细节)
    调用者只关心“做什么”,不需要知道“怎么做”。后期换算法、换数据源,只要函数接口不变,外围代码零修改。
  3. 增强可测试性(单元测试)
    独立函数可以脱离上下文直接测;没有函数,就只能“全系统一起跑”。
  4. 代码复用(零拷贝多场景)
    同一函数被 100 个流程调用,修 bug 只改一处——这是大家最熟悉的收益,但只是上面三点的自然结果。
所以:
函数 ≠ “省几行代码”那么简单;
它本质是把“变化”封装起来,让“不变”的部分一眼能看懂。
复用只是顺手捡到的红包,而非终极目标。
 
 
压缩复杂度(分而治之) 把 50 行纠缠在一起的逻辑变成一行函数调用,大脑一次只要处理 5 行?啥意思
 
 
把 20 行“一锅粥”代码拆成函数后,调用点只剩 1 行,而函数内部那20 行暂时从大脑工作记忆里“消失”——这就是“一次只要处理 5 行”的直观含义。举例:

① 没分函数:一次要看 20 行

Python
复制
# 主流程里直接摊开来写
data = open('sales.txt').readlines()
records = []
for line in data:
    if line.strip():                       # 去空行
        items = line.split(',')
        if len(items) == 4:                # 字段够
            try:
                amount = float(items[2])
                records.append(amount)
            except ValueError:
                continue
total = 0
for v in records:
    total += v
avg = total / len(records) if records else 0
print('average', avg)
 
读主流程时,大脑必须同时装着“打开文件、去空行、 split 、转 float 、累加、除法”全部细节——一眼 50 行。

② 分函数:调用点只剩 1 行

Python
复制
def read_sales(path):          # 20 行细节被关进盒子
    ...  # 同上 20 行
    return records

avg = sum(read_sales('sales.txt')) / len(read_sales('sales.txt'))
print('average', avg)
 
主流程现在只有 2 行(调用 + 打印),你完全不用回忆盒子里的 20 行逻辑;
当你维护主流程时,大脑工作记忆里同时活跃的代码量从 50 行降到 5 行以内,这就是“压缩复杂度”“分而治之”的真实体验。
“执行”确实还是 50 行,但“理解/维护/调试”时,大脑只需要看 5 行——压缩的是认知复杂度,不是执行复杂度。把两个层面分开,就能体会到函数的真正价值。

1. 认知负荷 vs 执行负荷

  • 执行负荷:CPU 跑多少条指令——拆不拆函数,指令条数几乎不变。
  • 认知负荷:人脑同时要记住多少变量、多少嵌套、多少异常分支——拆函数后,当场要处理的符号数量断崖式下降。
  • 2. 一张图看懂“压缩”

    表格
    复制
    场景大脑同时可见的代码量需要立刻理解的变量/分支典型 bug 定位时间
    20 行平铺 20 行 十几个变量 + 3 层嵌套 10 分钟
    5 行调用 5 行 2 个符号(函数名+参数) 30 秒
    当你怀疑“文件读错”时,只打开 read_sales 函数即可;其余 20 行根本不进脑海。
    ——这就是“分而治之”:把大问题切成小封箱,每次只打开一个箱
  • 3. 一个现实例子:Linux 内核

    schedule() 函数调用图超过千行,但主流程只有:
    c
    复制
    schedule();
     
    开发者跟踪调度 bug 时,先确认“调度器被调用”这一行上下文没错,再钻到 schedule() 内部;
    如果所有代码都平铺在一个 main.c 里,人类根本无法同时握持几千个变量状态,项目就维护不下去了。

    4. 小结一句话

    函数像抽屉
    • 抽屉关着时,桌面(主流程)只有抽屉把手(函数名)——认知面积 5 行;
    • 抽屉打开时,才暴露内部 20 行——但只在必要那一刻暴露。
      压缩的不是工作量,而是“同一时间必须摆在大脑桌面上的信息量”
      一旦信息量变少,理解、调试、重构、并行开发的速度都指数级提升。
_java_python的主页 _java_python | 小虾三级 | 园豆:996
提问于:2025-10-19 17:02
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册