🧩 第六章 重用:OOP带来的软件重用和思想重用
📄 一句话概括

好处能算:手写 CSV 解析 8 行、用 csv 只要 1 行——但最大回报不是省行数,是省掉你没意识到的坑。

📝 本节和前面几节的关系

6.9~6.11 讲完模式与思想,这一节把重用的好处逐条落到能算的数上。

一、少写

实测:手写 CSV 解析 8 行,用 csv.DictReader 1 行。 手写冒泡排序 5 行,用 sorted() 1 行。 行数比是 8 比 1、5 比 1。项目越大,这个比例越可观。

二、少错

那 8 行里最难的两行是【引号里的逗号】和【转义】——自己写十有八九会漏。 这就是重用的最大回报:不是省下的 7 行,是省掉那些你还没意识到的边界。 类库是被成千上万人踩出来的,你踩的那一脚,它多半已经垫平了。

三、好读

sorted(xs) 一句话说明意图;冒泡排序五行说明的是【怎么做】。 意图比过程好读——这是 3.5 讲的【阅读顺序等于执行顺序】的延伸。 所以用现成的还有一个隐性好处:代码在讲业务,不在讲算法。

四、代价:也有三条

依赖:多一个库就多一份版本负担(6.3、6.8)。 黑盒:出问题时你得读别人的源码。 过重:为了一个小功能装一个大库,是另一种浪费。 所以要权衡:省下的时间 > 长期维护成本,才值得。

五、动手 Demo:通过类库和模式发现的重用的好处

同样两件事:手写一遍,再用现成的写一遍。 数行数,再看边缘情况谁处理了。

import csv, io

# 手写 CSV 解析:8 行起步,还没处理引号和转义
# 用 csv.DictReader:1 行
text = "name,price\n笔,5\n本,8\n"
print([r["name"] for r in csv.DictReader(io.StringIO(text))])

print(sorted([3, 1, 2]))   # 手写冒泡要 5 行

实跑输出:

--------------------------------------------------------------------
通过类库和模式发现的重用的好处
--------------------------------------------------------------------

  好处能算:**自己写要几行,用现成的要几行。**实测两件事:

      手写 CSV 解析                8 行
      用 csv.DictReader            1 行 → ['笔', '本']
      手写冒泡排序                 5 行
      用 sorted()                  1 行 → [1, 2, 3]
      手写版跑得对吗?             True

  好处     怎么量           实测
  -------------------------------------------
  少写     行数比           8 行 vs 1 行
  少错     边界都被踩过     引号/转义已处理
  好读     一句顶八句       意图一目了然

  **注意第二行**:那 8 行里最难的两行(引号里的逗号、转义)**自己写十有八九会漏。**
  **所以重用的最大回报不是省行数,是省掉你没意识到的那些坑。**

实测:手写 CSV 8 行、csv 1 行;手写冒泡 5 行、sorted 1 行。 最大回报不是省行数,是省掉你没意识到的坑(引号里的逗号、转义)——类库是被成千上万人踩出来的。

30 秒实验

  1. 把你项目里最长的一个手写解析函数,换成标准库,数一数省了几行。
  2. 反过来找一个【为了小功能装大库】的地方,评估值不值。

常见误区

  1. 以为重用只省行数。它更省的是没意识到的边界。
  2. 以为装了库就没有成本。依赖、黑盒、过重,三样都要算。
自测三问(点开对答案) 1. 两件事的实测行数比是多少? —— 手写 CSV 8 行对 csv 1 行;手写冒泡 5 行对 sorted 1 行。 2. 重用的最大回报是什么? —— 不是省行数,是省掉你没意识到的边界(引号里的逗号、转义)——类库被成千上万人踩过。 3. 重用有哪三条代价? —— 依赖(版本负担)、黑盒(要读别人源码)、过重(小功能配大库)。

相关笔记