【C/C++学习】从通讯录项目理解 C 语言里的分层设计

目录

  • [从通讯录项目理解 C 语言里的分层设计](#从通讯录项目理解 C 语言里的分层设计)

从通讯录项目理解 C 语言里的分层设计

学习代码:contact/contact.ccontact/list.ccontact/initial.c

刚开始写 C 语言小项目时,我很容易把菜单、输入、链表操作、文件读写都塞进一个 main() 里。这样短期能跑,但代码越写越难改。通讯录项目给我的最大启发是:即使项目很小,也应该有分层意识。业务层负责"用户想做什么",接口层负责"把业务动作翻译成数据操作",支持层负责"真正怎么存、怎么查、怎么写文件"。这样设计以后,底层从链表换成哈希表,业务菜单不需要大改。

项目里的人员信息很简单:

c 复制代码
struct Person
{
    char name[MAX_NAME_LENGTH];
    char phone[MAX_PHONE_LENGTH];
};

如果业务层直接操作链表节点,后面每次改存储结构都会牵动上层代码。所以我把插入、查找、删除、遍历、保存、加载做成接口:

c 复制代码
int person_insert(struct Person *ps, struct List *people);
struct Person *person_find(const char *name, struct List *people);
int person_remove(struct Person *ps, struct List *people);
void person_traverse(struct List *people);
int save_file(struct List *people, char *filename);
int load_file(struct List *people, char *filename);

业务层只需要调用这些函数,不需要知道链表节点怎样前后连接。这个项目里另一个值得注意的点是输入安全。以前习惯用 scanf,但它很容易因为长度不可控导致缓冲区溢出。这里改成封装 read_line(),用 fgets 按指定长度读取,再处理换行符。这个小改动让我意识到:安全不是大项目才需要考虑,输入边界从第一行代码就应该想清楚。

我的理解是,分层并不是为了把代码写复杂,而是为了减少变化带来的影响。通讯录的业务需求很稳定:新增、删除、查询、保存。真正可能变化的是底层存储方式和文件格式。把变化点隔离起来,代码才有继续扩展的空间。这是我从这个练习里学到的最重要的设计思想。

总结下来,通讯录项目虽然功能朴素,但它练到的是工程能力:接口抽象、数据结构封装、文件持久化和输入边界控制。以后再写网络服务器、数据库连接池,本质上也还是这个思路:上层描述业务,下层封装细节,中间用稳定接口连接。

学习链接