C 语言面向对象的封装方式(示例)

本文通过一个数据库、文件系统中页数据操作的示例,对比了C语言中面向对象的两种封装方式——函数和数据结构分离与封装。在封装模式下,数据结构成员对调用者不可见,接口函数设计注重业务语义,从而实现代码的清晰性和模块独立性。在大型项目中,推荐使用封装以增强代码的稳定性和可维护性。

前一篇文章《C 语言面向对象的封装方式》,我介绍了C语言编程常见的两种代码组织方式:

1)函数和数据结构分离

 2)封装

并从原理上讲述这两种方式的根本区别。


大型项目中,推荐采用封装的方式,有利于团队协作和每个模块独立演进。

 

本文,给出一个代码示例,具体展示这两种方式在代码实现上的差别。

业务场景描述如下:
对于数据库、文件系统、存储系统等,数据通常以页(Page)为单位,在数据文件中进行组织。服务进程以页为最小IO单位从磁盘上读出,并在内存中缓存这个页面。后续业务过程如果读取的数据在这个页中,则直接从内存页获取数据。如果要写入新数据,或者要更改原来的数据,则需要找到剩余空间能满足新写入数据大小的Page,然后在目标页中进行写入或者数据修改的动作。由于页上可能会有并发读写操作,因此需要注意加锁。

一个数据页(Page)的内部结构,示例如下:(PostgreSQL的数据页)

PageHeader 是页头部的控制信息,其结构如下:


我们实现数据写入(insert)和scan过滤两种场景,看用两种不同的代码组织方式,在代码实现上的差别(代码进行了简化,不考虑事务等复杂因素)。(方式一) 函数和数据结构分离
调用者的逻辑:
向Page中写入一行数据:
​​​​​​​

int insert_row(...) {
    // 计算要写入的行所需的空间大小
    int row_size = ....;
    // 找到剩余空间满足这个要求的Page
    page_header_t* phpage = find_page(row_size);
    // 加锁,避免并发写
&n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值