通信程序的设计顺序——从协议到组件的向内倒推

设计起点线说「通信程序先设计协议」。这一篇把这句话展开成完整的先后顺序:协议 → 组件 → 接口 → 实现 → 接口测试 → 框架化 → 组装。每一步都是同一条原则——先设计对外的控制面,再逐层向内。这是设计起点线(各种程序先设计什么)在通信程序上的完整展开。


一、起点:通信程序先设计协议

设计起点线已经给出结论:通信程序的对外控制面是协议

1
2
两个独立运行的系统(客户端、服务器)互不共享内存,
唯一能对齐的就是「协议」——双方按什么规则交换什么消息。

所以通信程序的第一步不是写 EventLoop,而是先定协议:

1
2
3
4
5
Client → Server
LOGIN { username, password }

Server → Client
LOGIN_RESULT { success, token }

协议是通信程序的第一个设计对象——后面所有接口都围绕它展开。


二、完整顺序:七步倒推

协议定了之后,剩下的步骤是「从外到内」的逐层倒推:

1
2
3
4
5
6
7
8
9
10
11
12
13
① 协议设计      双方按什么规则交换什么(消息格式/字段/版本)

② 组件设计 拆成哪些组件(EventLoop/Connection/Session...)

③ 组件接口设计 每个组件暴露什么接口(send/recv/on_event...)

④ 实现 组件实现

⑤ 接口测试 组件接口能不能按设计工作

⑥ 框架化 组件封装成框架(运行系统)

⑦ 系统组装 + E2E 测试 完整通信流程能不能跑通

每一环都是「先设计对外的,再设计对内的」:

1
2
3
4
5
6
协议(对外:两端怎么对齐)
→ 组件(对内:内部怎么拆)
→ 组件接口(对内:组件之间怎么约定)
→ 实现(最内:具体代码)
→ 测试(验证前面每一步的设计对不对)
→ 框架化 + 组装(把验证过的组件拼成可运行系统)

三、每一步的「先外后内」

① 协议设计(最先)

协议解决:双方到底按什么规则交换什么东西。

1
2
3
4
确定通信双方 / 方向 / 消息类型 / 请求响应类型
确定消息结构(头+体)/ 字段 / 类型 / 长度 / 编码
确定消息边界(长度前缀 / 分隔符)
确定请求与响应关联 / 错误消息 / 协议状态 / 版本扩展

② 组件设计(拆成哪些组件)

协议定了,内部按职责拆组件:

1
2
EventLoop(什么时候有事)/ Connection(连接生死)
Session(连接状态)/ Buffer(字节暂存)/ Protocol(消息格式)

这一步的展开就是「网络系统组件」线——拆分为组件、每个组件有什么。 详见该线。

③ 组件接口设计(每个组件暴露什么)

1
2
连接接口 / 会话接口 / 缓冲接口 / 编码解码接口
发送接收接口 / 事件接口 / 生命周期接口 / 错误处理接口

接口设计 ≠ 协议设计:协议是对端之间的交换规则(线上长什么样),接口是组件之间的调用契约(代码怎么调)。两者的完整区分见「系统角色」主题的 04-通信系统。本线只列步骤清单,角色线讲清两者关系。

④ 实现

按接口写实现。实现是最后才动手的——前面的协议、组件、接口都定清楚了,实现只是填空。

⑤ 接口测试(实现之后)

验证「接口说好的行为」真的成立:

1
2
单元测试      单个组件内部逻辑
接口测试 组件接口按设计工作

⑥ 框架化(封装成运行系统)

组件封装成框架(有状态、入口启动)或接口(无状态、上层调用):

1
2
框架化 → 入口启动(创建对象 → start/run → stop)
接口化 → 上层调用接口(connect/send/close 即调即用)

这一步的展开就是「封装与调用」线(网络系统/03-组装调用)。

⑦ 系统组装 + E2E 测试

框架化之后,网络系统 + 入口系统 + 业务系统拼成完整软件,验证完整通信流程:

1
2
客户端发请求 → 网络系统收发 → 入口系统解析分发
→ 业务处理 → 响应回传 → 客户端收到

注意组成不同:客户端 = 入口 + 网络(两系统),服务器 = 入口 + 业务 + 网络(三系统)。


四、为什么顺序不能反

1
2
3
接口依赖协议:接口收发的是协议定义的消息
测试依赖接口:测试调的是接口
实现依赖接口:实现的是接口说好的行为

所以顺序是强制的:

1
2
3
协议没定就写接口 → 接口收发什么都不知道
接口没定就写实现 → 实现不知道要暴露什么
实现没写就测试 → 没有东西可测

先协议、再组件、再接口、再实现、再测试——顺序不能反。


五、和两条线的关系

本文是「设计起点」线在通信程序上的展开,它把设计起点线的一句话(通信程序先设计协议)拉长成完整的顺序:

1
2
3
4
5
6
7
8
设计起点线(06-设计/01):
各种程序先设计什么(CLI 先设计入口参数、通信程序先设计协议、GUI 先设计 UI)

本文(06-设计/05):
通信程序的「先设计协议」展开成七步倒推

网络系统组件线(网络系统组件/):
本文的第 ② 步(拆成哪些组件)+ 每个组件有什么
1
2
3
4
5
6
7
8
本文 ←→ 网络系统组件线
本文讲「设计时按什么顺序做」,网络系统组件讲「拆出来的每个组件有什么」

本文 ←→ 封装与调用线(网络系统/03-组装调用)
本文第 ⑥ 步(框架化)= 封装与调用线的结论

本文 ←→ 服务器线(04-系统角色/06-服务器与三系统边界)
本文第 ⑦ 步(组装)= 三系统如何组合成完整软件

收束

1
2
3
4
5
6
7
8
9
10
通信程序的设计顺序(从外到内的倒推):

协议 → 组件 → 接口 → 实现 → 接口测试 → 框架化 → 组装

每一环都是「先设计对外的控制面,再逐层向内」。

顺序不能反:接口依赖协议、测试依赖接口、实现依赖接口。

本文是设计起点线在通信程序上的展开,
第 ② 步展开成网络系统组件线,第 ⑥ 步展开成封装与调用线,第 ⑦ 步展开成三系统组装。

设计起点定「先设计什么」,本文把它在通信程序上走完一遍——从协议开始,一路向内到组装成完整软件。

本文是「设计顺序」视角(按什么顺序做);网络系统/04-网络系统设计从想法到实现 是「角色」视角(每一步具体做什么,含协议/组件/接口/框架的原子步骤清单)。两者互补。