05-通信程序的设计顺序
通信程序的设计顺序——从协议到组件的向内倒推
设计起点线说「通信程序先设计协议」。这一篇把这句话展开成完整的先后顺序:协议 → 组件 → 接口 → 实现 → 接口测试 → 框架化 → 组装。每一步都是同一条原则——先设计对外的控制面,再逐层向内。这是设计起点线(各种程序先设计什么)在通信程序上的完整展开。
一、起点:通信程序先设计协议
设计起点线已经给出结论:通信程序的对外控制面是协议。
1 | 两个独立运行的系统(客户端、服务器)互不共享内存, |
所以通信程序的第一步不是写 EventLoop,而是先定协议:
1 | Client → Server |
协议是通信程序的第一个设计对象——后面所有接口都围绕它展开。
二、完整顺序:七步倒推
协议定了之后,剩下的步骤是「从外到内」的逐层倒推:
1 | ① 协议设计 双方按什么规则交换什么(消息格式/字段/版本) |
每一环都是「先设计对外的,再设计对内的」:
1 | 协议(对外:两端怎么对齐) |
三、每一步的「先外后内」
① 协议设计(最先)
协议解决:双方到底按什么规则交换什么东西。
1 | 确定通信双方 / 方向 / 消息类型 / 请求响应类型 |
② 组件设计(拆成哪些组件)
协议定了,内部按职责拆组件:
1 | EventLoop(什么时候有事)/ Connection(连接生死) |
这一步的展开就是「网络系统组件」线——拆分为组件、每个组件有什么。 详见该线。
③ 组件接口设计(每个组件暴露什么)
1 | 连接接口 / 会话接口 / 缓冲接口 / 编码解码接口 |
接口设计 ≠ 协议设计:协议是对端之间的交换规则(线上长什么样),接口是组件之间的调用契约(代码怎么调)。两者的完整区分见「系统角色」主题的
04-通信系统。本线只列步骤清单,角色线讲清两者关系。
④ 实现
按接口写实现。实现是最后才动手的——前面的协议、组件、接口都定清楚了,实现只是填空。
⑤ 接口测试(实现之后)
验证「接口说好的行为」真的成立:
1 | 单元测试 单个组件内部逻辑 |
⑥ 框架化(封装成运行系统)
组件封装成框架(有状态、入口启动)或接口(无状态、上层调用):
1 | 框架化 → 入口启动(创建对象 → start/run → stop) |
这一步的展开就是「封装与调用」线(网络系统/03-组装调用)。
⑦ 系统组装 + E2E 测试
框架化之后,网络系统 + 入口系统 + 业务系统拼成完整软件,验证完整通信流程:
1 | 客户端发请求 → 网络系统收发 → 入口系统解析分发 |
注意组成不同:客户端 = 入口 + 网络(两系统),服务器 = 入口 + 业务 + 网络(三系统)。
四、为什么顺序不能反
1 | 接口依赖协议:接口收发的是协议定义的消息 |
所以顺序是强制的:
1 | 协议没定就写接口 → 接口收发什么都不知道 |
先协议、再组件、再接口、再实现、再测试——顺序不能反。
五、和两条线的关系
本文是「设计起点」线在通信程序上的展开,它把设计起点线的一句话(通信程序先设计协议)拉长成完整的顺序:
1 | 设计起点线(06-设计/01): |
1 | 本文 ←→ 网络系统组件线 |
收束
1 | 通信程序的设计顺序(从外到内的倒推): |
设计起点定「先设计什么」,本文把它在通信程序上走完一遍——从协议开始,一路向内到组装成完整软件。
本文是「设计顺序」视角(按什么顺序做);
网络系统/04-网络系统设计从想法到实现是「角色」视角(每一步具体做什么,含协议/组件/接口/框架的原子步骤清单)。两者互补。
