NO.17 · 项目实战
客户信息管理系统:C11 分层架构的控制台实战
基于 C11 的客户信息管理系统实战项目——把单文件示例重构为应用层、领域层和界面层的分层架构,加入动态数组、结果码、输入校验和内存管理。
学完 C 语言语法,最缺的就是一个”像样”的项目。这个客户信息管理系统把课程里的单文件示例重构为分层架构:应用层编排流程、领域层管理业务、界面层处理输入输出,并补齐了输入校验、动态数组、结果码和资源释放这些工程细节。
功能特性
- 添加客户:录入姓名、性别、年龄、电话和邮箱;
- 修改客户:按编号修改资料,直接回车保留原值,输入
-1取消; - 删除客户:按编号删除,删除前要求
y/n确认,删除后自动整理后续编号; - 客户列表:展示所有客户的编号和详细资料;
- 输入校验:菜单、姓名、性别、年龄、电话、邮箱和确认输入全部校验;
- 动态数组:容量不足时自动扩展。
分层架构
1 | customer-management-system/ |
| 模块 | 职责 |
|---|---|
src/app/ |
编排菜单流程和业务操作 |
src/domain/ |
管理客户资料、目录和业务规则 |
src/ui/ |
负责控制台输入、校验和展示 |
应用层连接领域层和控制台层,不直接管理客户数组。领域层负责增删改查、编号维护、资料校验和资源生命周期;控制台层只负责读取输入与展示结果。
校验规则
| 字段 | 规则 |
|---|---|
| 姓名 | 必填,最多 63 字节 |
| 性别 | 只接受 f/F 或 m/M |
| 年龄 | 1 到 150 |
| 电话 | 允许数字、+、-、括号和空格,至少包含 3 位数字 |
| 邮箱 | 必须包含一个 @、域名分隔点且不能有空格 |
工程化设计要点
- 头文件暴露模块接口,用
CustomerDirectory封装客户集合,用CustomerResult表示业务结果; - 客户记录用动态数组保存,目录容量不足时自动扩展;
- 退出前调用销毁函数释放动态内存,配合
-Wall -Wextra -Wpedantic全程零警告。
编译运行
标准 C11,无第三方依赖:
1 | gcc -std=c11 -Wall -Wextra -Wpedantic -Isrc \ |
可以继续做的事
客户数据目前只保存在进程内,后续可以增加文件或数据库持久化、客户查询、分组标签、导入导出、单元测试以及 CMake / Makefile 构建流程。
这个项目最大的价值在于展示了”课本代码”到”工程代码”的距离:同样的功能,加上分层、校验、错误处理和资源管理之后,才算真正能维护的程序。