第三部分导读:封装
第二部分的手法管的是代码该切成多大一块、每块叫什么名字。这一部分换一个角度:数据该藏在哪里,谁能看到它,谁能改它。
数据露得太多,代价会在两个地方出现。一是改起来疼:一个字典被十个函数直接读写,想把其中一个字段换个格式,十处都得改,漏一处就出错。二是坏了找不到原因:谁都能改的数据,被改坏时你只能全局搜索,逐个排查。封装的办法是在数据外面加一层壳,所有访问都经过这层壳。壳里可以校验、可以换实现、可以返回副本,调用方不用知道里面怎么回事。
第 8 章的封装变量是这一部分的起点,它处理的是一个全局变量。这一部分把同样的想法推到记录、集合、单个的值、临时变量和整个类上。第 17、18 章各自包含一对方向相反的手法:提炼类和内联类,隐藏委托关系和移除中间人。
| 手法 | 一句话 | 流行度 | 档 |
|---|---|---|---|
| 封装记录(第 13 章) | 把被到处读写的字典换成类 | ★★ | 完整 |
| 封装集合(第 14 章) | 不交出列表本身,只提供增删方法 | ★★ | 精简 |
| 以对象取代基本类型(第 15 章) | 带着规则的字符串、数字,换成有行为的类 | ★★ | 完整 |
| 以查询取代临时变量(第 16 章) | 把只是某个计算结果的临时变量换成方法 | ★★ | 精简 |
| 提炼类 / 内联类(第 17 章) | 把一个类里的一组数据和方法拆出去;或者并回来 | ★★ | 完整 |
| 隐藏委托关系 / 移除中间人(第 18 章) | 不让调用方穿过中间对象;或者反过来去掉多余的转发 | ★★ | 精简 |
| 替换算法(第 19 章) | 整段换成更清楚的写法 | ★ | 速览 |
闻到什么味道先看哪一章:
- 纯数据类,或者一个字典被很多地方直接读写 → 第 13 章 封装记录。
- 可变数据,外部代码直接往你的列表里加东西 → 第 14 章 封装集合。
- 基本类型偏执,电话号、金额、优先级用裸字符串和数字到处传 → 第 15 章 以对象取代基本类型。
- 函数里一串临时变量,类的几个方法各自重复算同一个中间值 → 第 16 章 以查询取代临时变量。
- 过大的类、数据泥团,一个类里有一组字段总是一起变 → 第 17 章 提炼类。
- 过长的消息链,调用方写着
a.b.c→ 第 18 章 隐藏委托关系;反过来一个类里全是转发方法,是中间人 → 同一章的移除中间人。