Learning
VOL. III · NO. 09 · Engineering · 01 JAN 1970

关注点分离:让系统各部分各司其职

工程 · 01 JAN 1970 · 7 min read · 1,619 words
· · ·

"每个部分只做一件事,做好一件事。"

**预计时间:**15 分钟读 + 15 分钟做习题 = 30 分钟。

本课承诺
读完这节课,你将掌握:
关注点分离 (Separation of Concerns) 的精确定义(每个部分只做一件事); 如何识别"关注点"; 如何分离关注点。

一、什么是关注点分离

关注点分离 (Separation of Concerns) 是一种让系统各部分各司其职的设计原则:

关注点:系统中的一个职责功能
分离:让每个部分只负责一个关注点

芒格式翻译
"一个部分做所有事" = 最笨的设计(混乱)。
"每个部分只做一件事" = 最聪明的设计(清晰)。
芒格说:"每个部分只做一件事,做好一件事。"

二、关注点分离的常见场景

场景关注点分离方式
前端用户界面HTML/CSS/JS 分离
后端业务逻辑Controller/Service/Repository 分离
数据库数据存储Schema/Query/Index 分离
测试质量保证Unit/Integration/E2E 分离
部署发布流程Build/Deploy/Monitor 分离
关注点分离的陷阱
不是所有事都需要用关注点分离!
1. 过度分离:拆得太细,失去整体视角
2. 错误分离:把不相关的关注点放在一起
3. 忽视依赖:关注点之间有依赖,但你没发现
平衡:关注点分离是"逻辑标准",不是"物理标准"。

三、2 步框架:分离关注点

第 1 步:识别关注点

先明确:系统中有哪些关注点?

案例:电商系统
关注点:用户管理 / 商品管理 / 订单管理 / 支付管理

结论:4 个关注点,每个都是独立的职责。
案例:社交系统
关注点:用户管理 / 消息管理 / 好友管理 / 通知管理

结论:4 个关注点,每个都是独立的职责。

第 2 步:分离关注点

让每个部分只负责一个关注点。

案例:电商系统
分离前:一个大模块处理所有业务
分离后:UserModule / ProductModule / OrderModule / PaymentModule
结论:每个模块只负责一个关注点。
案例:社交系统
分离前:一个大模块处理所有业务
分离后:UserModule / MessageModule / FriendModule / NotificationModule
结论:每个模块只负责一个关注点。

四、关注点分离的好处

好处 1:可维护性

修改一个关注点,不影响其他关注点

好处 2:可测试性

每个关注点可以独立测试

好处 3:可复用性

一个关注点可以在多个地方复用

芒格式翻译
"一个部分做所有事" = 最笨的设计(混乱)。
"每个部分只做一件事" = 最聪明的设计(清晰)。
芒格说:"每个部分只做一件事,做好一件事。"

五、练习题

单选题

1

关注点分离的核心是?

2

"每个部分只做一件事,做好一件事"体现了?

3

分离关注点的第一步是?

4

"UserModule / ProductModule / OrderModule"属于?

5

关注点分离的陷阱不包括?

6

"修改一个关注点,不影响其他关注点"属于?

7

"每个关注点可以独立测试"属于?

8

"一个关注点可以在多个地方复用"属于?

9

关注点分离是"逻辑标准"还是"物理标准"?

10

"拆得太细,失去整体视角"属于?

案例分析

C1

C1. 案例:团队要做电商系统,用关注点分离,应该先做什么?

C2

C2. 案例:团队要做社交系统,用关注点分离,应该先做什么?

C3

C3. 案例:团队要做工具系统,用关注点分离,应该先做什么?

反事实思考题

T1

T1. 反事实:如果团队没有用关注点分离,一个部分做所有事,最可能的结果是?

T2

T2. 反事实:如果团队过度分离关注点,拆得太细,最可能的结果是?

下一步:Lesson 0010 · 高内聚低耦合——如何让系统各部分”高内聚、低耦合”。