🧩 第十章 面向对象设计:拟人化和职责分配
📄 一句话概括

三个手法一个共同点:减少别人对你的了解——实测暴露面 7→3、换实现改动点 4→1、改字段名影响 7→1(读字段的地方还是 7 处)。

📝 本节和前面几节的关系

10.4 量出了依赖,这一节给三个具体可做的手法。

一、手法一:只暴露必要的方法

公开的东西越多,别人越依赖你——公开 7 个,就有 7 个入口会被调用。 实测收到公开 3 个:少 4 个入口,改内部时受影响的面小了一半。 做法:默认私有,需要时再公开。不是反过来。

二、手法二:依赖抽象,不依赖具体

写死具体类 4 处,换实现就要改 4 处。 改成参数传入(接口)后是 1 处——换实现只改创建它的那一处。 这就是 6.9 讲的策略模式背后的东西:把【用谁】的决定推到外面。

三、手法三:不直接读别人的字段

直接读 7 处 → 改成调方法还是 7 处,数字没变。 变的是改动点:对方改字段名时,只需改类内那一处,7 个调用点不受影响。 所以这个手法的收益不在【少写】,在【改得动】。

四、三个手法的共同点

都是【减少别人对你的了解】:少暴露、少写死、少伸手。 了解越少,改起来越自由——这是独立性的本质。 反过来说:如果你改一处要通知五个人,那不是五个人负责,是你的边界没划清。

五、动手 Demo:提高构件独立性的诀窍

三个手法各自的效果并排列出来。 注意手法三的数字没变,变的是改动点的位置。

tips = [
    ("一、只暴露必要的方法",   "公开 7",   "公开 3"),
    ("二、依赖抽象不依赖具体", "写死 4 处", "参数 1 处"),
    ("三、不直接读别人的字段", "直接读 7 处", "方法 7 处"),
]
for a, b, c in tips:
    print(a, b, "->", c)

实跑输出:

--------------------------------------------------------------------
提高构件独立性的诀窍
--------------------------------------------------------------------

  三个手法,各自都能数出效果。实测:

  手法                       改前            改后
  -----------------------------------------------------
  一、只暴露必要的方法       公开 7          公开 3
  二、依赖抽象不依赖具体     写死 4 处       参数 1 处
  三、不直接读别人的字段     直接读 7 处     方法 7 处

      手法一:外部能碰到的东西    7 → 3(少 4 个)
      手法二:换实现时改动的地方  4 处 → 1 处
      手法三:改字段名的影响      7 处 → 1 处(只改类内)

  **三个手法的共同点**:都是【减少别人对你的了解】。
  **注意手法三的数字没变(还是 7 处)**,**变的是【改动点从 7 处降到 1 处】**——
  **读字段的地方照样 7 个,但改字段名时只需要改类内部那一处。**

实测:暴露面 7→3、换实现的改动点 4→1、改字段名的影响 7 处集中到类内 1 处。 手法三的调用点数没变(还是 7 处),变的是改动时只需动类内那一处。 三个手法的共同点:减少别人对你的了解。

30 秒实验

  1. 检查你一个类公开了几个方法,其中只有几个真的需要公开。
  2. 找出代码里写死具体类的地方,改成参数传入。

常见误区

  1. 以为公开得多方便别人。方便的是调用,付出的是改动自由。
  2. 以为手法三没效果(数字没变)。效果在改动点集中到一处。
自测三问(点开对答案) 1. 三个手法分别是什么? —— 只暴露必要的方法、依赖抽象不依赖具体、不直接读别人的字段。 2. 实测效果如何? —— 暴露 7→3、换实现改动点 4→1、改字段名影响 7 处集中到 1 处。 3. 手法三为什么数字没变还是有效? —— 调用点数不变,但改字段名时只需改类内一处,7 个调用点不受影响。

相关笔记