`
iunknown
  • 浏览: 409296 次
社区版块
存档分类
最新评论

用 c 封装模块的好处

    博客分类:
  • MISC
阅读更多
用 c 来封装一个模块,可以参考下面这个连接中的做法。
http://paul.rutgers.edu/~csgates/CS416/proj2/index.html

这里的做法可以说已经到了一种极限,如果把这个 threadpool 编译为一个动态连接库的话,那么对于客户程序来说,即使在编译时使用 A 实现,在运行时改成用 B 实现也完全没问题。只要 B 实现生成的库名和 A 一致。这里关键的一点就是 threadpool 的定义,居然是 typedef 为 void *。客户程序得到的是一个 void * 指针,这样在客户程序中就完全不涉及具体的实现了。也就是常说的“对客户程序透明”(明明是 void * ,什么都没表现出来,为什么当初会使用“透明”这个词来形容,有点怪,呵呵)。这种效果已经和 cpp 中的纯虚基类的封装性差不多了,只是没有虚基类的多态功能。

这是 threadpool 的定义:

typedef void *threadpool;

threadpool create_threadpool(int num_threads_in_pool);

void dispatch(threadpool from_me, dispatch_fn dispatch_to_here,
      void *arg);

void destroy_threadpool(threadpool destroyme);



如果用 cpp 想实现类似的功能,那么就是用上面提到的纯虚基类。如果只是考虑对客户程序的封装性,那么像 c 这种全局函数可能比纯虚基类更方便。因为给纯虚基类添加一个函数可能回影响客户程序,而增加一个全局 c 函数对客户程序来说,一般不会有影响。

从长期维护的角度来说,使用 c 来做这种模块的封装还是很有好处的,甚至比 cpp 的方式更好。
分享到:
评论
3 楼 Arath 2007-07-09  
这就使interface的观念
2 楼 iunknown 2007-07-07  
xombat 写道
引用
如果把这个 threadpool 编译为一个动态连接库的话,那么对于客户程序来说,即使在编译时使用 A 实现,在运行时改成用 B 实现也完全没问题。只要 B 实现生成的库名和 A 一致。

不太明白楼主的意思。


paul.rutgers.edu 的文章只是 threadpool 的接口定义,应该是 rutgers 这个学校的某个课程的一个作业题。
我的意思是说这个接口定义的做法值得学习,在某些方面有很大的好处。

xombat 写道
threadpool的那些方法他根本没有实现,只是写了一个框架而已。我认为dispatch_fn类型的函数应有由用户来完成,其它就无需用户实现了,但是他的所有方法的实现都留给了用户,每个函数中都充斥着:
// add your code here to... ... 



这里是这个接口的一个实现:http://iunknown.iteye.com/blog/38544

xombat 写道

threadpool被typedef成void *确实能隐藏一些具体实现,但是如果使用者还需要深入threadpool.c实现一部分功能,那么这个隐藏就不那么重要了。


如果按 java 的 interface 的要求来看,在 interface 是不应该体现出任何实现上的东西的。在 c 中要达到这个目标,最自然的选择就是 void * 了。这个隐藏是针对 threadpool 库的使用者,不是 threadpool 库的实现者。作为库的实现者来说,使用者对库在实现层面上的东西了解的越少越好,这样对于以后做改进比较方便。因为库的使用者只看到库的接口,不了解库的具体实现,他写的代码就只依赖于接口,这样修改具体的实现就不用担心破坏库的使用者现有的代码。
1 楼 xombat 2007-07-07  
引用
如果把这个 threadpool 编译为一个动态连接库的话,那么对于客户程序来说,即使在编译时使用 A 实现,在运行时改成用 B 实现也完全没问题。只要 B 实现生成的库名和 A 一致。

不太明白楼主的意思。

threadpool的那些方法他根本没有实现,只是写了一个框架而已。我认为dispatch_fn类型的函数应有由用户来完成,其它就无需用户实现了,但是他的所有方法的实现都留给了用户,每个函数中都充斥着:
// add your code here to... ... 


threadpool被typedef成void *确实能隐藏一些具体实现,但是如果使用者还需要深入threadpool.c实现一部分功能,那么这个隐藏就不那么重要了。

相关推荐

    VBA完美封装模块.rar

    "C:\Users\Administrator\Desktop\VBA功能大全\VBA完美封装模块\封装模块exe(生成程序方法).rar" "C:\Users\Administrator\Desktop\VBA功能大全\VBA完美封装模块\VB破解打开密码" "C:\Users\Administrator\Desktop...

    matlab如何封装模块

    在本文中,我们将详细介绍 MATLAB 如何封装模块,包括 S 函数的编写和模块封装。 S 函数是模块的核心,是完成功能实现的关键。S 函数的编写可以使用多种程序语言,其中 M 语言是最常用的,同时也是最简单的。在运用...

    psim仿真使用C语言模块计算有效值函数

    在PSIM中,可以通过使用C模块来调用C语言函数,实现更加复杂的模拟和计算。 本文将介绍如何在PSIM中使用C语言模块计算有效值函数。 需求 我们需要在PSIM中计算一个电压或电流的有效值,以便进行后续分析和控制。 ...

    “车载诊断系统” 数据采集,采用C++编写技术模块 LibEvent封装、log模块、线程CThread的封装、锁模块.zip

    “车载诊断系统(On-Board Diagnostic)” 数据采集,采用C++编写技术模块 LibEvent封装、log模块、线程CThread的封装、锁模块 “车载诊断系统(On-Board Diagnostic)” 数据采集,采用C++编写技术模块 LibEvent...

    IGBT模块封装流程原理图[归纳].pdf

    IGBT模块封装是将多个IGBT集成封装在一起,以提高IGBT模块的使用寿命和可靠性,体积更小、效率更高、可靠性更高是市场对IGBT模块的需求趋势,这就有待于IGBT模块封装技术的开发和运用。目前流行的IGBT模块封装形式有...

    socket编程——c语言封装——c++封装(一对一对话).zip

    C++封装Socket时,通常会使用面向对象的方法,定义类来封装这些函数,使得代码更加模块化,易于理解和维护。例如,可以创建一个`Socket`基类,然后分别有`ServerSocket`和`ClientSocket`派生类。基类中封装基本的...

    日志模块(c/c++),简单、快捷,就一头文件就实现了日志模块无缝接入

    一个C/C++日志记录模块,它是对开源log4c进行的封装和修正的基础上,将所有的代码都集成到一个.h头文件中。带来的革命性突破是日志模块的使用是那么的方便和简单:只要使用一个.h头文件即可无缝的将日志模块嵌入到你...

    GSM模块封装库

    在MiniSTM32平台上使用这个封装库时,首先需要正确连接模块的UART接口,然后在代码中初始化串口通信并加载库文件。之后,可以通过调用库函数发送AT指令,处理返回的数据,实现GSM/GPRS功能。由于MiniSTM32是一个基于...

    c语言编程规范 C语言模块化

    良好的模块设计应确保每个模块尽可能地封装其内部状态,只暴露必要的接口供外部使用。 3. **依赖关系管理**: - 在多模块系统中,应清晰地定义模块间的依赖关系,避免循环依赖。可以利用头文件的正确包含顺序和...

    C语言实现自定义Simulink模块

    `用C语言实现Simulink自定义模块.docx`文档应该包含了详细步骤、注意事项和示例代码解析,帮助读者理解并实践自定义Simulink模块的过程。通过阅读这份文档,可以加深对C语言在Simulink中的应用的理解。 总结,利用...

    SIMULINK中自定义模块的创建与封装

    本文将详细介绍如何在SIMULINK中使用S-函数创建和封装用户自定义模块。 #### 二、S-函数简介 S-函数(System Function)是SIMULINK提供的一种特殊类型的模块,允许用户自定义模块的行为。S-函数可以使用MATLAB代码...

    3.5'TFTLCD模块封装库.zip

    1. **驱动程序代码**:这些是用C、C++或其他编程语言编写的函数,用于初始化和控制TFT LCD,以及与AD转换器通信。 2. **示例代码**:演示如何使用封装库的简单示例,帮助开发者快速上手。 3. **库文件**:包含必要...

    光模块封装类型大盘点

    光模块的尺寸由封装形式(form factor)决定,而这个封装就是... 定义光模块尺寸的MSA主要是SFP MSA,XFP MSA,CXP MSA,QSFP MSA,CFP MSA,OSFP MSA,和QSFP-DD MSA,也是目前市场上留存下来的几种主要封装形式。

    c语言常用模块(快速学习)

    函数是C语言中的重要模块,用于封装可重用的代码段。包括函数声明、定义、调用,以及参数传递、返回值等概念。 5. **数组与指针**: 数组是一组相同类型的元素集合,可以通过索引访问。指针是内存地址的别名,...

    ModBus-RTU协议C封装

    ModBus-RTU协议C封装 使用C封装的,可以移植到任何平台。

    4G5G模块MSATA盘(M.2-B-KEY+M.2-E-KEY 封装) AD集成封装库.zip

    4G5G模块MSATA盘(M.2_B-KEY+M.2_E-KEY 封装) AD集成封装库,已经其他一些USB3.0 ,RJ45 ,SD卡等,详细封装型号如下: Component Count : 69 Component Name ----------------------------------------------- ...

    OLED模块封装库.zip

    3. **驱动程序代码**:可能包含用C、C++或其他编程语言编写的示例代码,用于与OLED模块通信,初始化显示、发送命令和数据。 4. **用户手册或数据表**:提供OLED模块的技术规格、电气特性、接口协议等关键信息。 5. *...

    如何实现单片机C语言的模块化编程.rar_togetherw2k_单片机_如何实现单片机C语言的模块化编程

    4. **头文件(.h)和源文件(.c)**:在C语言中,头文件用来声明函数和全局变量,源文件实现这些声明。通过包含头文件,模块间可以共享接口,同时避免重复声明导致的编译错误。 5. **宏定义**:预处理器宏是C语言中...

    ESP32-S2-WROOM 原理图pcb 模块封装.zip

    5. **ESP32-S2-WROOM 模块封装**:模块封装是指ESP32-S2-WROOM在PCB板上的物理布局和连接方式,这直接影响到模块的电气性能和物理安装。在ESP32S.SchLib中,你可以找到模块的电气符号,而在Esp32S.PcbLib中则是其...

    电源模块蓝牙WIFI模块RS485模块DCDC模块Altium封装库三维视图PCB封装库(2D3D封装库).zip

    电源模块蓝牙WIFI模块RS485模块DCDC模块Altium封装库三维视图PCB封装库(2D3D封装库),55个封装,PcbLibb后缀文件,封装列表如下: Component Count : 55 Component Name -----------------------------------------...

Global site tag (gtag.js) - Google Analytics