博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C 语言面向对象的封装方式
阅读量:4111 次
发布时间:2019-05-25

本文共 1046 字,大约阅读时间需要 3 分钟。

C语言是面向过程的编程语言,一个程序的运行逻辑就是由一个个函数调用构成,函数里面会操作各种各样的数据结构。

因此,函数和数据结构,是C程序中的两大组成部分。

通常,我们接触的大多数C程序,代码的逻辑组织关系就如下图所示:

 

这种程序中,数据结构与函数是一种松耦合关系,数据结构的内部成员,对所有函数都是可见的,都是可读写的。一个函数会直接操纵多个数据结构,从而实现特定的业务逻辑。

这种设计的优点是:简单。数据结构和函数可以分开进行设计,适用于小型项目、快速构建原型。

但这种方式最大的问题是:当数据结构需要变化时,访问这个数据结构的大量函数都需要相应改动,工程量太大,在大型项目中几乎无法进行。需求变化时,会出现这类场景,在对历史代码进行重构时,也会出现这种场景。

 

因此,在大型项目中,更推荐的方式是封装。封装这个术语,常见于面向对象的编程语言中,其核心思想是将数据结构的内部构成、函数逻辑的实现对外界屏蔽,外界仅能通过其提供的接口函数来实现对数据结构的操纵、对特定逻辑的调用。

封装,即包括了对数据结构的封装,也包括了对函数逻辑的封装。

 

C语言,尽管不是面向对象的编程语言,但依然可以实现优秀的封装能力。

采用封装的设计思想后,C程序的代码逻辑组织关系就变成了:

 

上图中的红色框,就是封装。所有的数据结构,都被对应的函数封装起来了。外界无法直接访问这些数据结构的内部成员,只能通过暴露的接口函数来操纵这些数据结构。

所有的内部实现函数,也都对外界不可见,外界只能通过暴露的接口函数来调用相应的业务逻辑。

 

封装方式,对大型项目的演进是极度重要的!只要接口函数不变,那么每个子系统、每个模块内部的数据结构和内部实现,可以独立进行重构和演进,对别人没有任何影响!

而前一种方式下,一个数据结构变化了,几乎就是牵一发而动全身,别人都受影响,都得相应进行代码修改!

封装方式,对接口设计提出了更高的要求。如何切分程序的各部分职责,如何高内聚低耦合地设计接口函数,从接口函数名、参数和返回值中都屏蔽掉内部的具体实现,这些都需要高水准的设计。

 

一个大型项目的生命周期,会持续多年甚至数十年。良好的设计,会使得大型项目可以跟随业务需求而快速演进,最为关键的一点是每个子系统、每个模块可以独立进行演进,而无需各个团队之间任务的互相影响、前置任务等待等各种问题。能让各个团队能够充分并行工作,这对大型项目的进度和质量控制都是极度关键的。

 

下一篇文章,我会用一个例子,来展示C语言封装的具体做法。欢迎大家关注我。

转载地址:http://hvlsi.baihongyu.com/

你可能感兴趣的文章
Scala之flatMap操作
查看>>
Scala之wordCount
查看>>
SparkStreaming之socketTextStream遇到的一些小问题
查看>>
Linux:Pycharm中使用Git
查看>>
gogs的坑:fatal: Could not read from remote repository.
查看>>
Git:Git分支概念、Pycharm中使用使用分支
查看>>
Python:线程同步,Barrier屏障
查看>>
Python:信号量semaphore
查看>>
Python:多进程multiprocessing,多进程和多线程的应用
查看>>
Python:concurrent异步并行任务编程模块、 线程池、进程池、上下文管理
查看>>
JSONArray
查看>>
HTTP 请求中的Header 参数
查看>>
PostgreSQL远程连接,发生的SSL错误
查看>>
PostgreSQL 创建用户
查看>>
mysql 定时任务
查看>>
浅谈sql中的in与not in,exists与not exists的区别以及性能分析
查看>>
Tomcat注册为Windows服务
查看>>
pg_stat_statements windows 安装
查看>>
启用mqtt插件
查看>>
行转列
查看>>