📄 一句话概括
三个手法一个共同点:减少别人对你的了解——实测暴露面 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. 实测效果如何? —— 暴露 7→3、换实现改动点 4→1、改字段名影响 7 处集中到 1 处。 3. 手法三为什么数字没变还是有效? —— 调用点数不变,但改字段名时只需改类内一处,7 个调用点不受影响。- ☐ 10.6 设计目标之三:避免依赖关系发生循环
相关笔记
- 设计目标之二:提高构件的独立性 — 依赖怎么量
- 设计模式是优秀的设计思想集 — 依赖抽象的模式来源
- 类的功能之二:隐藏 — 暴露面的机制
- 🧩 面向对象是怎样工作的 · 索引