用 c 封装模块的好处

用 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 的方式更好。

你可能感兴趣的:(C++,c,框架,C#,Blog)